diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..cf9bfe8
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+target
+integration-repo
+ivy-cache
+spring-build/lib/findbugs
diff --git a/build-svt/build.xml b/build-svt/build.xml
new file mode 100644
index 0000000..ca917b2
--- /dev/null
+++ b/build-svt/build.xml
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="build-svt" default="precommit">
+
+	<path id="bundles"/>
+	
+	<property file="${basedir}/../build.properties"/>
+	<property file="${basedir}/../build.versions"/>
+	<import file="${basedir}/../virgo-build/multi-bundle/default.xml"/>
+
+	<target name="svt-test" description="Runs svt tests on the packaged build">
+		<path id="svt.test.bundles">
+			<pathelement location="${basedir}/../org.eclipse.virgo.server.svt" />
+		</path>
+		
+		<path id="download.bundles">
+			<pathelement location="${basedir}/../org.eclipse.virgo.server.svt" />
+			<pathelement location="${basedir}/../org.eclipse.virgo.server.svt.cleanstart" />
+		</path>
+	
+		<all-bundles target="download" buildpathRef="download.bundles"/>
+	
+		<antcall target="test.pre"/>
+		
+		<all-bundles target="test-package" buildpathRef="svt.test.bundles">
+			<property name="package.output.file" value="${package.output.file}"/>
+			<property name="package.basename" value="${package.basename}"/>
+			<property name="test-results.output.dir" value="${test-results.output.dir}"/>
+		</all-bundles>
+		
+		<antcall target="test.post"/>
+	</target>
+
+</project>
diff --git a/build-svt/test-package.xml b/build-svt/test-package.xml
new file mode 100644
index 0000000..482e2ab
--- /dev/null
+++ b/build-svt/test-package.xml
@@ -0,0 +1,128 @@
+<?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-tomcat-server"/>
+	<property name="pickup.dir" value="${test.package.dir}/pickup"/>
+	<property name="usr.dir" value="${test.package.dir}/repository/usr"/>
+	<property name="cleanstart.test.dir" value="${basedir}/../org.eclipse.virgo.server.svt.cleanstart/src/test/resources"/>
+	<property name="cleanstart.test.package.dir" value="${cleanstart.test.dir}/virgo-tomcat-server"/>
+	<property name="cleanstart.test.package.dir1" value="${cleanstart.test.dir}/virgo-tomcat-server1"/>
+	<property name="cleanstart.test.package.dir2" value="${cleanstart.test.dir}/virgo-tomcat-server2"/>
+
+	<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 dest="${test.staging.dir}">
+			<fileset dir="${basedir}/../build-svt/target">
+				<include name="artifacts/virgo-tomcat-server-*.zip"/>
+			</fileset>
+			<regexpmapper from="(virgo-tomcat-server-[^/]*/)(.*)" to="virgo-tomcat-server/\2" />
+		</unzip>
+		<unzip dest="${cleanstart.test.dir}">
+			<fileset dir="${basedir}/../build-svt/target">
+				<include name="artifacts/virgo-tomcat-server-*.zip"/>
+			</fileset>
+			<regexpmapper from="(virgo-tomcat-server-[^/]*/)(.*)" to="virgo-tomcat-server/\2" />
+		</unzip>
+		<unzip dest="${cleanstart.test.dir}">
+			<fileset dir="${basedir}/../build-svt/target">
+				<include name="artifacts/virgo-tomcat-server-*.zip"/>
+			</fileset>
+			<regexpmapper from="(virgo-tomcat-server-[^/]*/)(.*)" to="virgo-tomcat-server1/\2" />
+		</unzip>
+		<unzip dest="${cleanstart.test.dir}">
+			<fileset dir="${basedir}/../build-svt/target">
+				<include name="artifacts/virgo-tomcat-server-*.zip"/>
+			</fileset>
+			<regexpmapper from="(virgo-tomcat-server-[^/]*/)(.*)" to="virgo-tomcat-server2/\2" />
+		</unzip>
+	<chmod perm="755">
+			<fileset dir="${test.package.dir}/bin">
+				<include name="*.sh"/>
+			</fileset>
+			<fileset dir="${cleanstart.test.package.dir}/bin">
+				<include name="*.sh"/>
+			</fileset>
+			<fileset dir="${cleanstart.test.package.dir1}/bin">
+					<include name="*.sh"/>
+			</fileset>
+			<fileset dir="${cleanstart.test.package.dir2}/bin">
+				<include name="*.sh"/>
+			</fileset>
+		</chmod>
+	</target>
+
+	<target name="startup.pre"/>
+
+	<target name="startup" depends="shutdown">
+		<echo message="Starting Up Virgo Web 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 Web Server start up failed"/>
+	</target>
+	
+	<target name="startup.clean" depends="shutdown">
+		<echo message="Clean Starting of Virgo Web 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 Web Server clean start up failed"/>
+	</target>
+
+	<target name="startup.post"/>
+
+	<target name="shutdown.pre"/>
+
+	<target name="shutdown">
+		<echo message="Shutting Down Virgo Web Server" />
+
+		<exec dir="${test.package.dir}" osfamily="unix" spawn="true" executable="bin/shutdown.sh">
+			<arg line="-immediate" />
+		</exec>
+		<exec dir="${test.package.dir}" osfamily="windows" spawn="true" executable="cmd">
+			<arg line="/c bin\shutdown.bat" />
+			<arg line="-immediate" />
+		</exec>
+
+		<waitfor maxwait="5" maxwaitunit="minute" timeoutproperty="shutdown.failed">
+			<not>
+				<http url="http://localhost:8080/"/>
+			</not>
+		</waitfor>
+		<fail if="shutdown.failed" message="Virgo Web Server shutdown failed"/>
+	</target>
+
+	<target name="shutdown.post"/>
+
+</project>
diff --git a/build.properties b/build.properties
index 317fe99..7f2f7c7 100644
--- a/build.properties
+++ b/build.properties
@@ -1 +1,20 @@
-version=3.0.0
\ No newline at end of file
+version=2.1.0
+release.type=integration
+javadoc.exclude.package.names=**/internal/**,**/internal
+ivy.cache.dir=${basedir}/../ivy-cache
+integration.repo.dir=${basedir}/../integration-repo
+# avoid memory leaks
+test.forkmode=perTest
+disable.bundlor=true
+source.version=1.5
+target.version=1.5
+findbugs.enforce=true
+clover.enforce=true
+clover.coverage=70%
+
+test.vm.args= -Xmx512M -XX:MaxPermSize=1024M -XX:+HeapDumpOnOutOfMemoryError
+#test.vm.args= -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n
+
+project.name=Virgo Server
+natural.name=virgo-dm-server
+project.key=VWS
diff --git a/build.versions b/build.versions
new file mode 100644
index 0000000..0b6b576
--- /dev/null
+++ b/build.versions
@@ -0,0 +1,42 @@
+org.eclipse.virgo.kernel=2.1.0.D-20100420092714
+org.eclipse.virgo.medic=1.0.1.D-20100420092100
+org.eclipse.virgo.osgi=2.1.0.D-20100420091535
+org.eclipse.virgo.repository=2.1.0.D-20100420092424
+org.eclipse.virgo.apps.repository=2.1.0.D-20100420101047
+org.eclipse.virgo.web=2.1.0.D-20100420094714
+org.eclipse.virgo.util=2.1.0.D-20100420091708
+
+com.springsource.json=1.0.1.RELEASE
+com.dumbster=1.6.0
+javax.ejb=3.0.0
+javax.jms=1.1.0
+javax.portlet=2.0.0
+javax.servlet.jsp.jstl=1.1.2
+javax.servlet=2.5.0
+javax.transaction=1.1.0
+javax.xml.rpc=1.1.0
+net.sourceforge.jwebunit=2.2.0
+org.antlr=3.0.1
+org.aopalliance=1.0.0
+org.apache.commons.codec=1.3.0
+org.apache.commons.fileupload=1.2.0
+org.apache.commons.httpclient=3.1.0
+org.apache.commons.io=1.4.0
+org.apache.felix.log=1.0.0
+org.apache.log4j=1.2.15
+org.apache.taglibs=1.1.2
+org.aspectj=1.6.6.RELEASE
+org.eclipse.equinox.cm=1.0.0.v20080509-1800
+org.hibernate=3.2.6.ga
+org.hibernate.annotations=3.3.1.ga
+org.hibernate.annotations.common=3.3.0.ga
+org.hibernate.ejb=3.3.2.GA
+org.jboss.el=2.0.0.GA
+org.jboss.util=2.0.4.GA
+org.jgroups=2.5.1
+org.junit=4.5.0
+org.slf4j=1.5.10
+org.springframework.js=2.0.8.RELEASE
+org.springframework.osgi=1.2.1
+org.springframework=3.0.0.RELEASE
+
diff --git a/org.eclipse.virgo.server.svt.cleanstart/.classpath b/org.eclipse.virgo.server.svt.cleanstart/.classpath
new file mode 100644
index 0000000..4c61178
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/.classpath
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src/test/java"/>
+	<classpathentry kind="src" path="src/test/resources"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.junit/com.springsource.org.junit/4.5.0/com.springsource.org.junit-4.5.0.jar" sourcepath="/SERVER_IVY_CACHE/org.junit/com.springsource.org.junit/4.5.0/com.springsource.org.junit-sources-4.5.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.slf4j/com.springsource.slf4j.api/1.5.10/com.springsource.slf4j.api-1.5.10.jar" sourcepath="/SERVER_IVY_CACHE/org.slf4j/com.springsource.slf4j.api/1.5.10/com.springsource.slf4j.api-sources-1.5.10.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.regexp/com.springsource.org.apache.regexp/1.5.0/com.springsource.org.apache.regexp-1.5.0.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.regexp/com.springsource.org.apache.regexp/1.5.0/com.springsource.org.apache.regexp-sources-1.5.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.httpclient/3.1.0/com.springsource.org.apache.commons.httpclient-3.1.0.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.httpclient/3.1.0/com.springsource.org.apache.commons.httpclient-sources-3.1.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.w3.sac/com.springsource.org.w3c.css.sac/1.3.0/com.springsource.org.w3c.css.sac-1.3.0.jar" sourcepath="/SERVER_IVY_CACHE/org.w3.sac/com.springsource.org.w3c.css.sac/1.3.0/com.springsource.org.w3c.css.sac-sources-1.3.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.io/1.4.0/com.springsource.org.apache.commons.io-1.4.0.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.io/1.4.0/com.springsource.org.apache.commons.io-sources-1.4.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.logging/1.1.1/com.springsource.org.apache.commons.logging-1.1.1.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.logging"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.lang/2.4.0/com.springsource.org.apache.commons.lang-2.4.0.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.lang/2.4.0/com.springsource.org.apache.commons.lang-sources-2.4.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.collections/3.2.1/com.springsource.org.apache.commons.collections-3.2.1.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.collections/3.2.1/com.springsource.org.apache.commons.collections-sources-3.2.1.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/net.sourceforge.cssparser/com.springsource.com.steadystate.css/0.9.5/com.springsource.com.steadystate.css-0.9.5.jar" sourcepath="/SERVER_IVY_CACHE/net.sourceforge.cssparser/com.springsource.com.steadystate.css/0.9.5/com.springsource.com.steadystate.css-sources-0.9.5.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.slf4j/com.springsource.slf4j.nop/1.5.10/com.springsource.slf4j.nop-1.5.10.jar" sourcepath="/SERVER_IVY_CACHE/org.slf4j/com.springsource.slf4j.nop/1.5.10/com.springsource.slf4j.nop-sources-1.5.10.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.eclipse.virgo.util/org.eclipse.virgo.util.io/2.1.0.D-20100420091708/org.eclipse.virgo.util.io-2.1.0.D-20100420091708.jar" sourcepath="/SERVER_IVY_CACHE/org.eclipse.virgo.util/org.eclipse.virgo.util.io/2.1.0.D-20100420091708/org.eclipse.virgo.util.io-sources-2.1.0.D-20100420091708.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.eclipse.virgo.util/org.eclipse.virgo.util.common/2.1.0.D-20100420091708/org.eclipse.virgo.util.common-2.1.0.D-20100420091708.jar" sourcepath="/SERVER_IVY_CACHE/org.eclipse.virgo.util/org.eclipse.virgo.util.common/2.1.0.D-20100420091708/org.eclipse.virgo.util.common-sources-2.1.0.D-20100420091708.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.eclipse.virgo.repository/org.eclipse.virgo.repository/2.1.0.D-20100420092424/org.eclipse.virgo.repository-2.1.0.D-20100420092424.jar" sourcepath="/SERVER_IVY_CACHE/org.eclipse.virgo.repository/org.eclipse.virgo.repository/2.1.0.D-20100420092424/org.eclipse.virgo.repository-sources-2.1.0.D-20100420092424.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/net.sourceforge.htmlunit/com.springsource.com.gargoylesoftware.htmlunit/2.6.0/com.springsource.com.gargoylesoftware.htmlunit-2.6.0.jar" sourcepath="/SERVER_IVY_CACHE/net.sourceforge.htmlunit/com.springsource.com.gargoylesoftware.htmlunit/2.6.0/com.springsource.com.gargoylesoftware.htmlunit-sources-2.6.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/net.sourceforge.htmlunit/com.springsource.net.sourceforge.htmlunit.corejs/2.6.0/com.springsource.net.sourceforge.htmlunit.corejs-2.6.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/net.sourceforge.jwebunit/com.springsource.net.sourceforge.jwebunit/2.2.0/com.springsource.net.sourceforge.jwebunit-2.2.0.jar" sourcepath="/SERVER_IVY_CACHE/net.sourceforge.jwebunit/com.springsource.net.sourceforge.jwebunit/2.2.0/com.springsource.net.sourceforge.jwebunit-sources-2.2.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/net.sourceforge.jwebunit/com.springsource.net.sourceforge.jwebunit.htmlunit/2.2.0/com.springsource.net.sourceforge.jwebunit.htmlunit-2.2.0.jar" sourcepath="/SERVER_IVY_CACHE/net.sourceforge.jwebunit/com.springsource.net.sourceforge.jwebunit.htmlunit/2.2.0/com.springsource.net.sourceforge.jwebunit.htmlunit-sources-2.2.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/net.sourceforge.nekohtml/com.springsource.org.cyberneko.html/1.9.13/com.springsource.org.cyberneko.html-1.9.13.jar" sourcepath="/SERVER_IVY_CACHE/net.sourceforge.nekohtml/com.springsource.org.cyberneko.html/1.9.13/com.springsource.org.cyberneko.html-sources-1.9.13.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.xalan/com.springsource.org.apache.xalan/2.7.1/com.springsource.org.apache.xalan-2.7.1.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.xalan/com.springsource.org.apache.xalan/2.7.1/com.springsource.org.apache.xalan-sources-2.7.1.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.xalan/com.springsource.org.apache.xml.serializer/2.7.1/com.springsource.org.apache.xml.serializer-2.7.1.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.xalan/com.springsource.org.apache.xml.serializer/2.7.1/com.springsource.org.apache.xml.serializer-sources-2.7.1.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.codec/1.4.0/com.springsource.org.apache.commons.codec-1.4.0.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.codec/1.4.0/com.springsource.org.apache.commons.codec-sources-1.4.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.xerces/com.springsource.org.apache.xerces/2.9.1/com.springsource.org.apache.xerces-2.9.1.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.xerces/com.springsource.org.apache.xerces/2.9.1/com.springsource.org.apache.xerces-sources-2.9.1.jar"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.virgo.server.svt.cleanstart/.project b/org.eclipse.virgo.server.svt.cleanstart/.project
new file mode 100644
index 0000000..4ef50fa
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.virgo.server.svt.cleanstart</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.virgo.server.svt.cleanstart/build.xml b/org.eclipse.virgo.server.svt.cleanstart/build.xml
new file mode 100644
index 0000000..8f45f9f
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/build.xml
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.virgo.server.svt.cleanstart" xmlns:ivy="antlib:org.apache.ivy.ant">
+	
+	<property name="ivy.cache.dir" value="${basedir}/../ivy-cache" />
+	<property name="integration.repo.dir" value="${basedir}/../integration-repo"/>
+	<property name="download.dir" value="${basedir}/target/bundles"/>
+
+	<property file="${basedir}/../build.properties"/>
+	<property file="${basedir}/../build.versions"/>
+	<import file="${basedir}/../virgo-build/standard/default.xml"/>
+	
+	<target name="download" depends="ivy.init">
+		<delete dir="${download.dir}" quiet="true"/>
+		<mkdir dir="${download.dir}"/>
+
+		<ivy:resolve resolveId="download.deps" file="${basedir}/ivy.xml" transitive="false"/>
+		<ivy:retrieve resolveId="download.deps" pattern="${download.dir}/[artifact]-[revision].[ext]" conf="test" type="jar"/>
+	</target>
+	
+	<target name="startup.clean.post">
+	   <antcall target="test.do"/>
+	</target>
+	
+</project>
diff --git a/org.eclipse.virgo.server.svt.cleanstart/ivy.xml b/org.eclipse.virgo.server.svt.cleanstart/ivy.xml
new file mode 100644
index 0000000..6ac6535
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/ivy.xml
@@ -0,0 +1,33 @@
+<?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.svt" 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.util" name="org.eclipse.virgo.util.io" rev="${org.eclipse.virgo.util}" 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.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime" />
+		<dependency org="net.sourceforge.jwebunit" name="com.springsource.net.sourceforge.jwebunit" rev="${net.sourceforge.jwebunit}" conf="test->runtime" />
+		<dependency org="net.sourceforge.jwebunit" name="com.springsource.net.sourceforge.jwebunit.htmlunit" rev="${net.sourceforge.jwebunit}" conf="test->runtime" />
+		<dependency org="org.slf4j" name="com.springsource.slf4j.api" rev="${org.slf4j}" conf="test->runtime" />
+		<dependency org="org.slf4j" name="com.springsource.slf4j.nop" rev="${org.slf4j}" conf="runtime->runtime" />
+		
+		<!-- Dependencies which cannot be checked in to Eclipse repositories because of their licenses, e.g. LGPL. -->
+		<dependency org="org.hibernate" name="com.springsource.org.hibernate" rev="${org.hibernate}" conf="test->runtime"/>
+		
+		<exclude org="org.slf4j" module="com.springsource.slf4j.org.apache.log4j" />
+	</dependencies>
+
+</ivy-module>
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/AbstractWebTests.java b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/AbstractWebTests.java
new file mode 100644
index 0000000..74e8b13
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/AbstractWebTests.java
@@ -0,0 +1,436 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.server.svt;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.lang.management.ManagementFactory;
+import java.lang.management.OperatingSystemMXBean;
+import java.lang.management.RuntimeMXBean;
+import java.util.ArrayList;
+import java.util.Map;
+import java.util.Properties;
+
+import net.sourceforge.jwebunit.html.Cell;
+import net.sourceforge.jwebunit.html.Row;
+import net.sourceforge.jwebunit.junit.WebTester;
+import net.sourceforge.jwebunit.util.TestContext;
+
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public abstract class AbstractWebTests {
+	protected static final String URL = "http://localhost:8080/admin/web/artifact/overview.htm";
+	protected static final String USER = "admin";
+	protected static final String PASSWORD = "springsource";
+
+	private static String pickupDir = null;
+	private static String usrDir = null;
+	private static String workDir = null;
+	private static String serviceabilityDir = null;
+	private static String repoPropertiesDir = null;
+	private static String versionFile = null;
+
+	private static String serverHomeDir = null;
+	private static String binDir = null;
+	
+	private static Process process = null;
+	private static ProcessBuilder pb = null;
+	private static File startup = null;
+	private static File startupURI = null;
+	private static File shutdownURI = null;
+	private static String startupFileName = null;
+	private static File shutdown = null;
+	private static String shutdownFileName = null;
+	private static OperatingSystemMXBean os = ManagementFactory
+			.getOperatingSystemMXBean();
+	private static final String SPLASHURL = "http://localhost:8080/";
+
+	private final WebTester tester = new WebTester();
+	
+	protected final TestContext getTestContext() {
+		return this.tester.getTestContext();
+	}
+
+	protected final WebTester getTester() {
+		return this.tester;
+	}
+
+	@SuppressWarnings("unchecked")
+	protected void assertTableContent(String tableId, Object[][] expectedRows) {
+		ArrayList<Row> actualRows = getTester().getTable(tableId).getRows();
+
+		boolean tableMatched = true;
+		for (Object[] expectedRow : expectedRows) {
+			Object bsn = expectedRow[0];
+			boolean rowMatched = false;
+			for (Row actualRow : actualRows) {
+				Cell[] cells = ((ArrayList<Cell>) actualRow.getCells())
+						.toArray(new Cell[actualRow.getCellCount()]);
+				if (bsn.equals(cells[0].getValue())) {
+					rowMatched = rowEqual(expectedRow, cells);
+					break;
+				}
+			}
+			tableMatched &= rowMatched;
+		}
+		assertTrue("Table did not match", tableMatched);
+	}
+
+	protected static void copyApplicationsToPickup(String pickupDir,
+			String appsDir, String[] applicationNames) throws IOException {
+		for (String applicationName : applicationNames) {
+			FileCopyUtils.copy(new File(appsDir, applicationName), new File(
+					pickupDir, applicationName));
+		}
+	}
+
+	protected static void copyDependentBundlesToUsrRepository(String usrDir,
+			String bundlesDir, String[] bundleNames) throws IOException {
+		for (String bundleName : bundleNames) {
+			FileCopyUtils.copy(new File(bundlesDir, bundleName), new File(
+					usrDir, bundleName));
+		}
+	}
+
+	protected static void deleteApplicationsFromPickup(String pickupDir,
+			String[] applicationNames) throws IOException {
+		for (String applicationName : applicationNames) {
+			new File(pickupDir, applicationName).delete();
+		}
+	}
+
+	protected static String getPickupDir() throws IOException {
+		if (pickupDir == null) {
+			File testExpanded = new File(
+					"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()) {
+					pickupDir = new File(candidate, "pickup")
+							.getCanonicalPath();
+					break;
+				}
+			}
+		}
+		return pickupDir;
+	}
+
+	protected static String getUsrDir() throws IOException {
+		if (usrDir == null) {
+			File testExpanded = new File(
+					"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+			for (File mainDir : testExpanded.listFiles()) {
+				if (mainDir.isDirectory()) {
+					File repositoryDir = new File(mainDir, "repository")
+							.getCanonicalFile();
+					usrDir = new File(repositoryDir, "usr").getCanonicalPath();
+				}
+			}
+		}
+		return usrDir;
+	}
+
+	public static String getServerBinDir() throws IOException {
+		if (binDir == null) {
+			File testExpanded = new File(
+					"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()) {
+					binDir = new File(candidate, "bin").getCanonicalPath();
+					break;
+				}
+			}
+		}
+		return binDir;
+	}
+
+	protected static String getWorkDir() throws IOException {
+		if (workDir == null) {
+			File testExpanded = new File(
+					"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()) {
+					workDir = new File(candidate, "work").getCanonicalPath();
+					break;
+				}
+			}
+		}
+		return workDir;
+	}
+
+	protected static String getServiceabilityDir() throws IOException {
+		if (serviceabilityDir == null) {
+			File testExpanded = new File(
+					"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()) {
+					serviceabilityDir = new File(candidate, "serviceability")
+							.getCanonicalPath();
+					break;
+				}
+			}
+		}
+		return serviceabilityDir;
+	}
+
+	protected static String getWatchedRepoDir() throws IOException {
+		File watchedRepoDir = null;
+
+		File testExpanded = new File(
+				"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+		for (File candidate : testExpanded.listFiles()) {
+			if (candidate.isDirectory()) {
+				watchedRepoDir = new File(candidate, "watched-repo");
+				if (!watchedRepoDir.exists()) {
+					watchedRepoDir.mkdir();
+				}
+			}
+		}
+		return watchedRepoDir.getCanonicalPath();
+
+	}
+
+	protected static String getRepositoryPropertiesDir() throws IOException {
+		if (repoPropertiesDir == null) {
+			File testExpanded = new File(
+					"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()) {
+					File configDir = new File(candidate, "config");
+					if (configDir.isDirectory()) {
+						repoPropertiesDir = new File(configDir,
+								"repository.properties").getCanonicalPath();
+
+					}
+
+				}
+			}
+		}
+
+		return repoPropertiesDir;
+	}
+
+	protected static String getServerHomeDir() throws Exception {
+		if (serverHomeDir == null) {
+			File testExpanded = new File(
+					"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()) {
+					serverHomeDir = new File(candidate.getCanonicalPath())
+							.getCanonicalPath();
+				}
+			}
+		}
+		return serverHomeDir;
+	}
+
+	protected static String getHostedRepoDir() throws IOException {
+
+		File hostedDir = null;
+
+		File testExpanded = new File(
+				"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+		for (File mainDir : testExpanded.listFiles()) {
+			if (mainDir.isDirectory()) {
+				File repositoryDir = new File(mainDir, "repository")
+						.getCanonicalFile();
+
+				hostedDir = new File(repositoryDir, "hosted");
+				if (!hostedDir.exists()) {
+					hostedDir.mkdir();
+				}
+
+			}
+		}
+		return hostedDir.getCanonicalPath();
+
+	}
+
+	protected static String getConfigDir() throws IOException {
+		File configDir = null;
+		if (configDir == null) {
+			File testExpanded = new File(
+					"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()) {
+					configDir = new File(candidate, "config");
+
+				}
+			}
+		}
+
+		return configDir.getCanonicalPath();
+	}
+
+	protected static String getServerVersion() throws IOException {
+
+		String version;
+		if (versionFile == null) {
+			File testExpanded = new File("./target/test-expanded/");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()) {
+					versionFile = new File(candidate, "lib/.version")
+							.getCanonicalPath();
+					break;
+				}
+			}
+		}
+
+		Properties versions = new Properties();
+		InputStream stream = null;
+		try {
+			stream = new FileInputStream(versionFile);
+			versions.load(stream);
+			version = versions.getProperty("dm.server.version");
+			stream.close();
+		} catch (IOException e) {
+			version = "Unknown";
+			try {
+				if (stream != null) {
+					stream.close();
+				}
+			} catch (IOException e1) {
+
+			}
+		}
+		return version;
+	}
+
+	private boolean rowEqual(Object[] expected, Cell[] actual) {
+		if (expected.length != actual.length) {
+			return false;
+		}
+
+		for (int i = 0; i < expected.length; i++) {
+			if (!expected[i].equals(actual[i].getValue())) {
+				return false;
+			}
+		}
+		return true;
+	}
+
+	public String getOperatingSystem() {
+		OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean();
+		return String.format("%s(%s) - %s", os.getName(), os.getArch(), os
+				.getVersion());
+	}
+
+	public String getJavaInfo() {
+		RuntimeMXBean rt = ManagementFactory.getRuntimeMXBean();
+		return String.format("%s(%s) - %s", rt.getVmVendor(), rt.getVmName(),
+				rt.getVmVersion());
+	}
+	
+	public static void startServer() {
+		new Thread(new StartUpThread()).start();
+		sleep();
+		UrlWaitLatch.waitFor(URL, USER, PASSWORD);
+	}
+
+	private static void sleep() {
+		try {
+			Thread.sleep(25000);
+		} catch (InterruptedException e) {
+		}
+	}
+	
+	public static void shutdownServer() {
+		new Thread(new ShutdownThread()).start();
+		UrlWaitLatch.waitForServerShutdownFully(SPLASHURL);
+	}
+	
+	private static class StartUpThread implements Runnable {
+
+		public StartUpThread() {
+
+		}
+
+		public void run() {
+			String[] args = null;
+			try {
+				if (os.getName().contains("Windows")) {
+					startup = new File(getServerBinDir(), "startup.bat");
+					startupURI = new File(startup.toURI());
+					startupFileName = startupURI.getCanonicalPath();
+
+				} else {
+					startup = new File(getServerBinDir(), "startup.sh");
+					startupURI = new File(startup.toURI());
+					startupFileName = startupURI.getCanonicalPath();
+				}
+				args = new String[] { startupFileName, "-clean" };
+				pb = new ProcessBuilder(args);
+				Map<String, String> env = pb.environment();
+				env.put("JAVA_HOME", System.getProperty("java.home"));
+				pb.redirectErrorStream(true);
+
+				process = pb.start();
+
+				InputStream is = process.getInputStream();
+				InputStreamReader isr = new InputStreamReader(is);
+				BufferedReader br = new BufferedReader(isr);
+				String line;
+				while ((line = br.readLine()) != null) {
+					System.out.println(line);
+				}
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	private static class ShutdownThread implements Runnable {
+
+		public ShutdownThread() {
+
+		}
+
+		public void run() {
+			String[] args = null;
+			try {
+				if (os.getName().contains("Windows")) {
+					shutdown = new File(getServerBinDir(), "shutdown.bat");
+					shutdownURI = new File(shutdown.toURI());
+					shutdownFileName = shutdownURI.getCanonicalPath();
+				} else {
+					shutdown = new File(getServerBinDir(), "shutdown.sh");
+					shutdownURI = new File(shutdown.toURI());
+					shutdownFileName = shutdownURI.getCanonicalPath();
+				}
+				args = new String[] { shutdownFileName, "-immediate" };
+				pb = new ProcessBuilder(args);
+				Map<String, String> env = pb.environment();
+				env.put("JAVA_HOME", System.getProperty("java.home"));
+				pb.redirectErrorStream(true);
+
+				process = pb.start();
+
+				InputStream is = process.getInputStream();
+				InputStreamReader isr = new InputStreamReader(is);
+				BufferedReader br = new BufferedReader(isr);
+				String line;
+				while ((line = br.readLine()) != null) {
+					System.out.println(line);
+				}
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+
+		}
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/UrlWaitLatch.java b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/UrlWaitLatch.java
new file mode 100644
index 0000000..280d71b
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/UrlWaitLatch.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.server.svt;
+
+import static org.junit.Assert.fail;
+
+import java.net.ConnectException;
+
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.UsernamePasswordCredentials;
+import org.apache.commons.httpclient.auth.AuthScope;
+import org.apache.commons.httpclient.methods.GetMethod;
+
+public class UrlWaitLatch {
+	public static final long HALF_SECOND = 500;
+
+	public static final long TWO_MINUTES = 120 * 1000;
+
+	public static void waitFor(String url) {
+		waitFor(url, HALF_SECOND, TWO_MINUTES);
+	}
+
+	public static void waitFor(String url, String username, String password) {
+		waitFor(url, username, password, HALF_SECOND, TWO_MINUTES);
+	}
+
+	public static void waitFor(String url, long interval, long duration) {
+		HttpClient client = new HttpClient();
+		wait(url, client, interval, duration);
+	}
+
+	public static void waitFor(String url, String username, String password,
+			long interval, long duration) {
+		HttpClient client = new HttpClient();
+		client.getParams().setAuthenticationPreemptive(true);
+		client.getState().setCredentials(AuthScope.ANY,
+				new UsernamePasswordCredentials(username, password));
+		wait(url, client, interval, duration);
+	}
+
+	private static void wait(String url, HttpClient client, long interval,
+			long duration) {
+		HttpMethod get = new GetMethod(url);
+
+		try {
+			long startTime = System.currentTimeMillis();
+
+			int statusCode = 999;
+			while (System.currentTimeMillis() - startTime < duration) {
+				try {
+					statusCode = client.executeMethod(get);
+					if (statusCode < 400) {
+						return;
+					}
+				} catch (ConnectException e) {
+					// Swallow this and retry
+				}
+				Thread.sleep(interval);
+			}
+
+			fail(String.format("After %d ms, status code was %d", duration,
+					statusCode));
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		} finally {
+			get.releaseConnection();
+		}
+	}
+
+	public static void waitForNotExistence(String url) {
+		HttpClient client = new HttpClient();
+		waitForNotExistence(url, client, 1000, 120000);
+	}
+
+	private static void waitForNotExistence(String url, HttpClient client,
+			long interval, long duration) {
+		HttpMethod get = new GetMethod(url);
+
+		try {
+			long startTime = System.currentTimeMillis();
+
+			int statusCode = 100;
+			while (System.currentTimeMillis() - startTime < duration) {
+				try {
+					statusCode = client.executeMethod(get);
+					if (statusCode > 400) {
+						return;
+					}
+				} catch (ConnectException e) {
+					// Swallow this and retry
+				}
+				Thread.sleep(interval);
+			}
+
+			fail(String.format("After %d ms, status code was %d", duration,
+					statusCode));
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		} finally {
+			get.releaseConnection();
+		}
+	}
+
+	public static void waitForServerShutdownFully(String url) {
+		HttpClient client = new HttpClient();
+		waitForServerShutdownFully(url, client, HALF_SECOND, TWO_MINUTES);
+	}
+
+	private static void waitForServerShutdownFully(String url,
+			HttpClient client, long interval, long duration) {
+		HttpMethod get = new GetMethod(url);
+
+		try {
+			for (;;) {
+				try {
+					client.executeMethod(get);
+					Thread.sleep(interval);
+				} catch (ConnectException e) {
+					break;
+				} catch (Exception e) {
+					e.printStackTrace();
+				}
+			}
+		} finally {
+			get.releaseConnection();
+		}
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/additional/DebugModeStartTests.java b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/additional/DebugModeStartTests.java
new file mode 100644
index 0000000..fb8757b
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/additional/DebugModeStartTests.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.server.svt.additional;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.BufferedReader;
+import java.io.File;
+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;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.junit.AfterClass;
+import org.junit.Test;
+
+
+public class DebugModeStartTests extends AbstractWebTests {
+
+	private static Process process = null;
+	private static ProcessBuilder pb = null;
+	private static File startup = null;
+	private static File startupURI = null;
+	private static File shutdownURI = null;
+	private static String startupFileName = null;
+	private static File shutdown = null;
+	private static String shutdownFileName = null;
+	private static OperatingSystemMXBean os = ManagementFactory
+			.getOperatingSystemMXBean();
+	private static String jvmMsg;
+	private static final String SPLASHURL = "http://localhost:8080/";
+
+	@Test
+	public void testdmServerStartWithDefaultRemoteDebugPort()
+			throws InterruptedException {
+		new Thread(new ShutdownThread()).start();
+		UrlWaitLatch.waitForServerShutdownFully(SPLASHURL);
+		new Thread(new StartUpThread()).start();
+		UrlWaitLatch.waitFor(URL, USER, PASSWORD);
+		assertEquals("Listening for transport dt_socket at address: 8000",
+				jvmMsg);
+	}
+
+	@Test
+	public void testdmServerStartWithSpecificDebugPort()
+			throws InterruptedException {
+		new Thread(new ShutdownThread()).start();
+		UrlWaitLatch.waitForServerShutdownFully(SPLASHURL);
+		new Thread(new StartUpThreadWithSpecificDebugPort()).start();
+		UrlWaitLatch.waitFor(URL, USER, PASSWORD);
+		assertEquals("Listening for transport dt_socket at address: 8001",
+				jvmMsg);
+	}
+
+	@AfterClass
+	public static void tearDown() throws InterruptedException {
+		new Thread(new ShutdownThread()).start();
+		UrlWaitLatch.waitForServerShutdownFully(SPLASHURL);
+	}
+
+	private static class StartUpThread implements Runnable {
+
+		public StartUpThread() {
+
+		}
+
+		public void run() {
+			String[] msg = new String[100];
+			String[] args = null;
+			try {
+				if (os.getName().contains("Windows")) {
+					startup = new File(getServerBinDir(), "startup.bat");
+					startupURI = new File(startup.toURI());
+					startupFileName = startupURI.getCanonicalPath();
+
+				} else {
+					startup = new File(getServerBinDir(), "startup.sh");
+					startupURI = new File(startup.toURI());
+					startupFileName = startupURI.getCanonicalPath();
+				}
+				args = new String[] { startupFileName, "-debug", "-clean" };
+				pb = new ProcessBuilder(args);
+				Map<String, String> env = pb.environment();
+				env.put("JAVA_HOME", System.getProperty("java.home"));
+				pb.redirectErrorStream(true);
+				process = pb.start();
+				InputStream is = process.getInputStream();
+				InputStreamReader isr = new InputStreamReader(is);
+				BufferedReader br = new BufferedReader(isr);
+				String line;
+				while ((line = br.readLine()) != null) {
+					System.out.println(line);
+					for (int i = 0; i < msg.length; i++) {
+						if (line
+								.contentEquals("Listening for transport dt_socket at address: 8000")) {
+							jvmMsg = line;
+						}
+					}
+				}
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	private static class StartUpThreadWithSpecificDebugPort implements Runnable {
+
+		public StartUpThreadWithSpecificDebugPort() {
+
+		}
+
+		public void run() {
+			String[] msg = new String[100];
+			String[] args = null;
+			try {
+				if (os.getName().contains("Windows")) {
+					startup = new File(getServerBinDir(), "startup.bat");
+					startupURI = new File(startup.toURI());
+					startupFileName = startupURI.getCanonicalPath();
+
+				} else {
+					startup = new File(getServerBinDir(), "startup.sh");
+					startupURI = new File(startup.toURI());
+					startupFileName = startupURI.getCanonicalPath();
+				}
+				args = new String[] { startupFileName, "-debug", "8001",
+						"-clean" };
+				pb = new ProcessBuilder(args);
+				Map<String, String> env = pb.environment();
+				env.put("JAVA_HOME", System.getProperty("java.home"));
+				pb.redirectErrorStream(true);
+				process = pb.start();
+				InputStream is = process.getInputStream();
+				InputStreamReader isr = new InputStreamReader(is);
+				BufferedReader br = new BufferedReader(isr);
+				String line;
+				while ((line = br.readLine()) != null) {
+					System.out.println(line);
+					for (int i = 0; i < msg.length; i++) {
+						if (line
+								.contentEquals("Listening for transport dt_socket at address: 8001")) {
+							jvmMsg = line;
+						}
+					}
+				}
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	private static class ShutdownThread implements Runnable {
+
+		public ShutdownThread() {
+
+		}
+
+		public void run() {
+			String[] args = null;
+			try {
+				if (os.getName().contains("Windows")) {
+					shutdown = new File(getServerBinDir(), "shutdown.bat");
+					shutdownURI = new File(shutdown.toURI());
+					shutdownFileName = shutdownURI.getCanonicalPath();
+				} else {
+					shutdown = new File(getServerBinDir(), "shutdown.sh");
+					shutdownURI = new File(shutdown.toURI());
+					shutdownFileName = shutdownURI.getCanonicalPath();
+				}
+				args = new String[] { shutdownFileName, "-immediate" };
+				pb = new ProcessBuilder(args);
+				Map<String, String> env = pb.environment();
+				env.put("JAVA_HOME", System.getProperty("java.home"));
+				pb.redirectErrorStream(true);
+				process = pb.start();
+				InputStream is = process.getInputStream();
+				InputStreamReader isr = new InputStreamReader(is);
+				BufferedReader br = new BufferedReader(isr);
+				String line;
+				while ((line = br.readLine()) != null) {
+					System.out.println(line);
+				}
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+
+		}
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/cleanstart/VerificationOfAdditionAndRemovalOfBundlesInTheRepositoryTests.java b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/cleanstart/VerificationOfAdditionAndRemovalOfBundlesInTheRepositoryTests.java
new file mode 100644
index 0000000..40831ad
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/cleanstart/VerificationOfAdditionAndRemovalOfBundlesInTheRepositoryTests.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.server.svt.cleanstart;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.management.MBeanServerConnection;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+
+public class VerificationOfAdditionAndRemovalOfBundlesInTheRepositoryTests
+		extends AbstractWebTests {
+	
+	private static MBeanServerConnection connection = null;
+	private static final String JMXURL = "service:jmx:rmi:///jndi/rmi://localhost:9875/jmxrmi";
+	private static final String KEYSTORE = "/config/keystore";
+	private static final String KEYPASSWORD = "changeit";
+	public static final long HALF_SECOND = 500;
+	public static final long TWO_MINUTES = 120 * 1000;
+	
+	@BeforeClass
+	public static void startUp() {
+		shutdownServer();
+		startServer();
+	}
+	
+	@AfterClass
+	public static void shutDown() {
+		shutdownServer();
+	}
+
+	@Test
+	public void testAddtionOfBundlesToTheExtRepository() throws Exception {
+		String repoName = (String) getMBeanServerConnection().getAttribute(
+				new ObjectName(
+						"org.eclipse.virgo.kernel:type=Repository,name=ext"),
+				"Name");
+		assertEquals("ext", repoName);
+		CompositeData[] object = (CompositeData[]) getMBeanServerConnection()
+				.getAttribute(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:type=Repository,name=ext"),
+						"AllArtifactDescriptorSummaries");
+
+		for (int i = 0; i < object.length; i++) {
+			if ((object[i].get("name")
+					.equals("org.springframework.dmServer.testtool.incoho"))) {
+				assertEquals("org.springframework.dmServer.testtool.incoho",
+						object[i].get("name"));
+				assertEquals("1.0.0.RELEASE", object[i].get("version"));
+				assertEquals("bundle", object[i].get("type"));
+			}
+		}
+	}
+
+	@Test
+	public void testAddtionOfBundlesToTheUsrRepository() throws Exception {
+		String repoName = (String) getMBeanServerConnection().getAttribute(
+				new ObjectName(
+						"org.eclipse.virgo.kernel:type=Repository,name=usr"),
+				"Name");
+		assertEquals("usr", repoName);
+		CompositeData[] object = (CompositeData[]) getMBeanServerConnection()
+				.getAttribute(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:type=Repository,name=usr"),
+						"AllArtifactDescriptorSummaries");
+
+		for (int i = 0; i < object.length; i++) {
+			if ((object[i].get("name")
+					.equals("org.springframework.dmServer.testtool.incoho"))) {
+				assertEquals("org.springframework.dmServer.testtool.incoho",
+						object[i].get("name"));
+				assertEquals("1.0.0.RELEASE", object[i].get("version"));
+				assertEquals("bundle", object[i].get("type"));
+			}
+		}
+	}
+
+	@Test
+	public void testAddtionOfLibrariesToTheExtRepository() throws Exception {
+		String repoName = (String) getMBeanServerConnection().getAttribute(
+				new ObjectName(
+						"org.eclipse.virgo.kernel:type=Repository,name=ext"),
+				"Name");
+		assertEquals("ext", repoName);
+		CompositeData[] object = (CompositeData[]) getMBeanServerConnection()
+				.getAttribute(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:type=Repository,name=ext"),
+						"AllArtifactDescriptorSummaries");
+
+		for (int i = 0; i < object.length; i++) {
+			if ((object[i].get("name").equals("org.springframework.spring") && object[i]
+					.get("version").equals("2.5.4.A"))) {
+				assertEquals("org.springframework.spring", object[i]
+						.get("name"));
+				assertEquals("2.5.4.A", object[i].get("version").toString());
+				assertEquals("library", object[i].get("type"));
+			}
+		}
+	}
+
+	@Test
+	public void testAddtionOfLibrariesToTheUsrRepository() throws Exception {
+		String repoName = (String) getMBeanServerConnection().getAttribute(
+				new ObjectName(
+						"org.eclipse.virgo.kernel:type=Repository,name=usr"),
+				"Name");
+		assertEquals("usr", repoName);
+		CompositeData[] object = (CompositeData[]) getMBeanServerConnection()
+				.getAttribute(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:type=Repository,name=usr"),
+						"AllArtifactDescriptorSummaries");
+
+		for (int i = 0; i < object.length; i++) {
+			if ((object[i].get("name").equals("org.springframework.spring") && object[i]
+					.get("version").equals("2.5.4.A"))) {
+				assertEquals("org.springframework.spring", object[i]
+						.get("name"));
+				assertEquals("2.5.4.A", object[i].get("version").toString());
+				assertEquals("library", object[i].get("type"));
+			}
+		}
+	}
+
+	@Test
+	public void testAddtionOfBundlesAndLibrariesToTheHostedRepository()
+			throws Exception {
+		String repoName = (String) getMBeanServerConnection()
+				.getAttribute(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:type=Repository,name=hosted-repository"),
+						"Name");
+		assertEquals("hosted-repository", repoName);
+		CompositeData[] object1 = (CompositeData[]) getMBeanServerConnection()
+				.getAttribute(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:type=Repository,name=hosted-repository"),
+						"AllArtifactDescriptorSummaries");
+
+		for (int i = 0; i < object1.length; i++) {
+			if (object1[i].get("name")
+					.equals("org.springframework.petclinic.domain") && object1[i].get("version").equals("2.0.1.BUILD-20091126110002")) {
+				assertEquals("org.springframework.petclinic.domain", object1[i]
+						.get("name"));
+				assertEquals("2.0.1.BUILD-20091126110002", object1[i].get("version")
+						.toString());
+				assertEquals("bundle", object1[i].get("type"));
+			}
+		}
+
+		CompositeData[] object2 = (CompositeData[]) getMBeanServerConnection()
+				.getAttribute(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:type=Repository,name=hosted-repository"),
+						"AllArtifactDescriptorSummaries");
+
+		for (int i = 0; i < object2.length; i++) {
+			if ((object2[i].get("name").equals("org.springframework.spring"))) {
+				assertEquals("org.springframework.spring", object2[i]
+						.get("name"));
+				assertEquals("2.5.4.A", object2[i].get("version").toString());
+				assertEquals("library", object2[i].get("type"));
+			}
+		}
+	}
+
+	@Test
+	public void testAddtionOfBundlesAndLibrariesToTheRemoteRepository()
+			throws Exception {
+		String repoName = (String) getMBeanServerConnection()
+				.getAttribute(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:type=Repository,name=remote-repo"),
+						"Name");
+		assertEquals("remote-repo", repoName);
+		CompositeData[] object1 = (CompositeData[]) getMBeanServerConnection()
+				.getAttribute(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:type=Repository,name=remote-repo"),
+						"AllArtifactDescriptorSummaries");
+
+		for (int i = 0; i < object1.length; i++) {
+			if (object1[i].get("name")
+					.equals("org.springframework.petclinic.domain") && object1[i].get("version").equals("2.0.1.BUILD-20091126110002")){
+				assertEquals("org.springframework.petclinic.domain", object1[i]
+						.get("name"));
+				assertEquals("2.0.1.BUILD-20091126110002", object1[i].get("version")
+						.toString());
+				assertEquals("bundle", object1[i].get("type"));
+			}
+		}
+
+		CompositeData[] object2 = (CompositeData[]) getMBeanServerConnection()
+				.getAttribute(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:type=Repository,name=remote-repo"),
+						"AllArtifactDescriptorSummaries");
+
+		for (int i = 0; i < object2.length; i++) {
+			if ((object2[i].get("name").equals("org.springframework.spring"))) {
+				assertEquals("org.springframework.spring", object2[i]
+						.get("name"));
+				assertEquals("2.5.4.A", object2[i].get("version").toString());
+				assertEquals("library", object2[i].get("type"));
+			}
+		}
+	}
+
+	@Test
+	public void testAddtionOfBundlesAndLibrariesToTheWatchedRepository()
+			throws Exception {
+		String repoName = (String) getMBeanServerConnection()
+				.getAttribute(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:type=Repository,name=watched-repo"),
+						"Name");
+		assertEquals("watched-repo", repoName);
+		CompositeData[] object1 = (CompositeData[]) getMBeanServerConnection()
+				.getAttribute(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:type=Repository,name=watched-repo"),
+						"AllArtifactDescriptorSummaries");
+
+		for (int i = 0; i < object1.length; i++) {
+			if ((object1[i].get("name")
+					.equals("org.springframework.petclinic.domain"))) {
+				assertEquals("org.springframework.petclinic.domain", object1[i]
+						.get("name"));
+				assertEquals("2.0.1.BUILD-20091126110002", object1[i].get("version")
+						.toString());
+				assertEquals("bundle", object1[i].get("type"));
+			}
+		}
+
+		CompositeData[] object2 = (CompositeData[]) getMBeanServerConnection()
+				.getAttribute(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:type=Repository,name=watched-repo"),
+						"AllArtifactDescriptorSummaries");
+
+		for (int i = 0; i < object2.length; i++) {
+			if ((object2[i].get("name").equals("org.springframework.spring"))) {
+				assertEquals("org.springframework.spring", object2[i]
+						.get("name"));
+				assertEquals("2.5.4.A", object2[i].get("version").toString());
+				assertEquals("library", object2[i].get("type"));
+			}
+		}
+	}
+
+	private static MBeanServerConnection getMBeanServerConnection()
+			throws Exception {
+		String severDir = null;
+		String[] creds = { "admin", "springsource" };
+		Map<String, String[]> env = new HashMap<String, String[]>();
+
+		File testExpanded = new File(
+				"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+		for (File mainDir : testExpanded.listFiles()) {
+			if (mainDir.isDirectory()) {
+				severDir = new File(mainDir.toURI()).getCanonicalPath();
+			}
+		}
+		env.put(JMXConnector.CREDENTIALS, creds);
+		System.setProperty("javax.net.ssl.trustStore", severDir + KEYSTORE);
+		System.setProperty("javax.net.ssl.trustStorePassword", KEYPASSWORD);
+		JMXServiceURL url = new JMXServiceURL(JMXURL);
+		connection = JMXConnectorFactory.connect(url, env)
+				.getMBeanServerConnection();
+		return connection;
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/cleanstart/VerificationOfPreventionOfRedeploymentOfFormTagsAppDeployedThroughAdminConsoleAfterCleanStartTests.java b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/cleanstart/VerificationOfPreventionOfRedeploymentOfFormTagsAppDeployedThroughAdminConsoleAfterCleanStartTests.java
new file mode 100644
index 0000000..55a2ad6
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/cleanstart/VerificationOfPreventionOfRedeploymentOfFormTagsAppDeployedThroughAdminConsoleAfterCleanStartTests.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.server.svt.cleanstart;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.management.MBeanServerConnection;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+
+public class VerificationOfPreventionOfRedeploymentOfFormTagsAppDeployedThroughAdminConsoleAfterCleanStartTests
+		extends AbstractWebTests {
+	
+	private static MBeanServerConnection connection = null;
+	private static final String JMXURL = "service:jmx:rmi:///jndi/rmi://localhost:9875/jmxrmi";
+	private static final String KEYSTORE = "/config/keystore";
+	private static final String KEYPASSWORD = "changeit";
+	public static final long HALF_SECOND = 500;
+	public static final long TWO_MINUTES = 120 * 1000;
+	
+	@BeforeClass
+	public static void startUp() {
+		shutdownServer();
+		startServer();
+	}
+	
+	@AfterClass
+	public static void shutDown() {
+		shutdownServer();
+	}
+
+	@Test
+	public void testPreventionOfArtifactsRedeploymentByCleanStart()
+			throws Exception {
+		waitForMBeanDeRegister("par", "formtags-par", "2.0.1.BUILD-20100413113234",
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch.waitForNotExistence("http://localhost:8080/formtags-par");
+		assertArtifactNotExists("par", "formtags-par", "2.0.1.BUILD-20100413113234");
+
+		waitForMBeanDeRegister("bundle", "/formtags-shared-services-war-2.0.1.BUILD-20100413113234.war",
+				"0.0.0", HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitForNotExistence("http://localhost:8080/formtags-war-2.0.1.BUILD-20100413113234");
+		assertArtifactNotExists("bundle", "formtags-war-2.0.1.BUILD-20100413113234.war",
+				"0.0.0");
+
+		waitForMBeanDeRegister("bundle",
+				"org.springframework.showcase.formtags_shared_libs",
+				"2.0.1.BUILD-20100413113234", HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitForNotExistence("http://localhost:8080/formtags-shared-libs-2.0.1.BUILD-20100413113234");
+		assertArtifactNotExists("bundle",
+				"org.springframework.showcase.formtags_shared_libs",
+				"2.0.1.BUILD-20100413113234");
+	}
+
+	private void assertArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format("Artifact %s:%s:%s is still exists", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private static MBeanServerConnection getMBeanServerConnection()
+			throws Exception {
+		String severDir = null;
+		String[] creds = { "admin", "springsource" };
+		Map<String, String[]> env = new HashMap<String, String[]>();
+
+		File testExpanded = new File(
+				"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+		for (File mainDir : testExpanded.listFiles()) {
+			if (mainDir.isDirectory()) {
+				severDir = new File(mainDir.toURI()).getCanonicalPath();
+			}
+		}
+		env.put(JMXConnector.CREDENTIALS, creds);
+		System.setProperty("javax.net.ssl.trustStore", severDir + KEYSTORE);
+		System.setProperty("javax.net.ssl.trustStorePassword", KEYPASSWORD);
+		JMXServiceURL url = new JMXServiceURL(JMXURL);
+		connection = JMXConnectorFactory.connect(url, env)
+				.getMBeanServerConnection();
+		return connection;
+	}
+
+	private void waitForMBeanDeRegister(String type, String name,
+			String version, long interval, long duration) throws Exception {
+		long startTime = System.currentTimeMillis();
+		boolean mbeanStatus = true;
+		while (System.currentTimeMillis() - startTime < duration) {
+			mbeanStatus = getMBeanServerConnection().isRegistered(
+					getObjectName(type, name, version));
+			if (!mbeanStatus) {
+				return;
+			}
+			Thread.sleep(interval);
+		}
+		fail(String.format("After %d ms, artifact %s mbean Status was",
+				duration, name)
+				+ mbeanStatus);
+	}
+
+	private static ObjectName getObjectName(String type, String name,
+			String version) throws MalformedObjectNameException {
+		return new ObjectName(
+				String
+						.format(
+								"org.eclipse.virgo.kernel:type=Model,artifact-type=%s,name=%s,version=%s",
+								type, name, version));
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/cleanstart/VerificationOfRemovalOfWorkAndServiceabilityDirectoriesUponCleanStartTests.java b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/cleanstart/VerificationOfRemovalOfWorkAndServiceabilityDirectoriesUponCleanStartTests.java
new file mode 100644
index 0000000..c748e3a
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/cleanstart/VerificationOfRemovalOfWorkAndServiceabilityDirectoriesUponCleanStartTests.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.server.svt.cleanstart;
+
+import java.io.File;
+
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.junit.Test;
+import static org.junit.Assert.assertFalse;
+
+
+public class VerificationOfRemovalOfWorkAndServiceabilityDirectoriesUponCleanStartTests
+		extends AbstractWebTests {
+
+	@Test
+	public void testRemovalOfWorkAndServiceabilityDir() throws Exception {
+
+		File file1 = new File(getWorkDir(), "temp.txt");
+		assertFalse("work dir is not cleaned up properly", file1.exists());
+		File file2= new File(getServiceabilityDir(), "temp.txt");
+		assertFalse("serviceability dir is not cleaned up properly", file2
+				.exists());
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/configadmin/ConfigAdminTests.java b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/configadmin/ConfigAdminTests.java
new file mode 100644
index 0000000..e2681ba
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/configadmin/ConfigAdminTests.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.server.svt.configadmin;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+
+public class ConfigAdminTests extends AbstractWebTests {
+
+	private static final String APPS_DIR = "src/test/resources";
+	private static final String[] APPLICATION_NAMES = new String[] { "configadminservice.war" };
+	
+	@BeforeClass
+	public static void startUp() {
+		shutdownServer();
+		startServer();
+	}
+	
+	@AfterClass
+	public static void shutDown() {
+		shutdownServer();
+	}
+
+	@Test
+	public void testConfigAdminPersistedData() throws Exception {
+
+		copyApplicationsToPickup(getPickupDir(), APPS_DIR, APPLICATION_NAMES);
+
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/configadminservice/list.htm");
+		getTester()
+				.beginAt("http://localhost:8080/configadminservice/list.htm");
+		getTester().assertTextPresent("spring");
+		getTester().assertTextPresent("source");
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/hostedrepo/LocalHostedRepositoryTests.java b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/hostedrepo/LocalHostedRepositoryTests.java
new file mode 100644
index 0000000..f194434
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/hostedrepo/LocalHostedRepositoryTests.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.server.svt.hostedrepo;
+
+import static org.junit.Assert.assertEquals;
+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.HashMap;
+import java.util.Map;
+
+import javax.management.MBeanServerConnection;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+
+public class LocalHostedRepositoryTests extends AbstractWebTests {
+
+	private static final String APP_URI_PLAN = "./../test-apps/scopedplan.plan";
+	private static MBeanServerConnection connection = null;
+	private static final String JMXURL = "service:jmx:rmi:///jndi/rmi://localhost:9875/jmxrmi";
+	private static final String KEYSTORE = "/config/keystore";
+	private static final String KEYPASSWORD = "changeit";
+	public static final long HALF_SECOND = 500;
+	public static final long TWO_MINUTES = 120 * 1000;
+
+	private static String artifactType = null;
+	private static String artifactName = null;
+	private static String artifactVersion = null;
+	private static String[] signature = null;
+	private static Object[] params = null;
+	
+	@BeforeClass
+	public static void startUp() {
+		shutdownServer();
+		startServer();
+	}
+	
+	@AfterClass
+	public static void shutDown() {
+		shutdownServer();
+	}
+
+	@Test
+	public void testPlanPickupDeployThatDependsUponArtifactsInLocalHostedRepo()
+			throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_PLAN).toURI().toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName = compositeData.get("symbolicName").toString();
+		artifactType = compositeData.get("type").toString();
+		artifactVersion = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType, artifactName, artifactVersion,
+				HALF_SECOND, TWO_MINUTES);
+		assertPlanArtifactExists(artifactType, artifactName,
+				artifactVersion);
+		assertPlanArtifactState(artifactType, artifactName,
+				artifactVersion, "ACTIVE");
+	}
+
+	@Test
+	public void testPlanPickupUnDeployThatDependsUponArtifactsInLocalHostedRepo()
+			throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName, artifactVersion };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType, artifactName, artifactVersion,
+				HALF_SECOND, TWO_MINUTES);
+		assertPlanArtifactNotExists(artifactType, artifactName, artifactVersion);
+	}
+
+	private static CompositeData deploy(String[] signature, Object[] params)
+			throws Exception {
+		CompositeData compsiteData = (CompositeData) getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		return compsiteData;
+	}
+
+	private void assertPlanArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format(
+				"Eclipselink plan artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertPlanArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format(
+				"Eclipselink plan artifact %s:%s:%s is not in state %s", type,
+				name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertPlanArtifactNotExists(String type,
+			String name, String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format(
+				"Eclipselink plan artifact %s:%s:%s is still exists", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private static MBeanServerConnection getMBeanServerConnection()
+			throws Exception {
+		String severDir = null;
+		String[] creds = { "admin", "springsource" };
+		Map<String, String[]> env = new HashMap<String, String[]>();
+
+		File testExpanded = new File(
+				"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+		for (File mainDir : testExpanded.listFiles()) {
+			if (mainDir.isDirectory()) {
+				severDir = new File(mainDir.toURI()).getCanonicalPath();
+			}
+		}
+		env.put(JMXConnector.CREDENTIALS, creds);
+		System.setProperty("javax.net.ssl.trustStore", severDir + KEYSTORE);
+		System.setProperty("javax.net.ssl.trustStorePassword", KEYPASSWORD);
+		JMXServiceURL url = new JMXServiceURL(JMXURL);
+		connection = JMXConnectorFactory.connect(url, env)
+				.getMBeanServerConnection();
+		return connection;
+	}
+
+	private void waitForMBeanRegister(String type, String name, String version,
+			long interval, long duration) throws Exception {
+		long startTime = System.currentTimeMillis();
+		boolean mbeanStatus = false;
+		while (System.currentTimeMillis() - startTime < duration) {
+			mbeanStatus = getMBeanServerConnection().isRegistered(
+					getObjectName(type, name, version));
+			if (mbeanStatus) {
+				return;
+			}
+			Thread.sleep(interval);
+		}
+		fail(String.format("After %d ms, artifact %s mbean Status was",
+				duration, name)
+				+ mbeanStatus);
+	}
+
+	private void waitForMBeanDeRegister(String type, String name,
+			String version, long interval, long duration) throws Exception {
+		long startTime = System.currentTimeMillis();
+		boolean mbeanStatus = true;
+		while (System.currentTimeMillis() - startTime < duration) {
+			mbeanStatus = getMBeanServerConnection().isRegistered(
+					getObjectName(type, name, version));
+			if (!mbeanStatus) {
+				return;
+			}
+			Thread.sleep(interval);
+		}
+		fail(String.format("After %d ms, artifact %s mbean Status was",
+				duration, name)
+				+ mbeanStatus);
+	}
+
+	private static ObjectName getObjectName(String type, String name,
+			String version) throws MalformedObjectNameException {
+		return new ObjectName(
+				String
+						.format(
+								"org.eclipse.virgo.kernel:type=Model,artifact-type=%s,name=%s,version=%s",
+								type, name, version));
+	}
+}
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/hostedrepo/RemoteHostedRepositoryOtherThan8080Tests.java b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/hostedrepo/RemoteHostedRepositoryOtherThan8080Tests.java
new file mode 100644
index 0000000..0859aab
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/hostedrepo/RemoteHostedRepositoryOtherThan8080Tests.java
@@ -0,0 +1,884 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.server.svt.hostedrepo;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.lang.management.ManagementFactory;
+import java.lang.management.OperatingSystemMXBean;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.management.MBeanServerConnection;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+import org.eclipse.virgo.util.io.FileSystemUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class RemoteHostedRepositoryOtherThan8080Tests extends AbstractWebTests {
+
+	private static String serverHomeDir1 = null;
+	private static String usrDir1 = null;
+	private static String binDir1 = null;
+	private static String configDir1 = null;
+
+	private static String serverHomeDir2 = null;
+	private static String usrDir2 = null;
+	private static String binDir2 = null;
+	private static String configDir2 = null;
+	private static String pickupDir = null;
+	private static String hostedDir = null;
+
+	protected static final String HOSTED_REPO_SPLASHURL = "http://localhost:8084/";
+	protected static final String HOSTED_REPO_ADMINURL = "http://localhost:8084/admin";
+	protected static final String CLIENT_SPLASHURL = "http://localhost:8083/";
+	protected static final String CLEINT_ADMINURL = "http://localhost:8083/admin";
+
+	private static final String APP_URI_PLAN_UNSCOPED = "./../org.eclipse.virgo.server.svt/apps/helloworld_unscoped-1.0.0.RELEASE.plan";
+	private static final String APP_URI_SHAREDSERVICES_WAR1 = "./../org.eclipse.virgo.server.svt/apps/hello_war_shared_services.war";
+	private static final String APP_URI_SHAREDSERVICES_WAR2 = "./../org.eclipse.virgo.server.svt/apps/formtags-shared-services-war-2.0.1.BUILD-20100413113234.war";
+	private static final String APP_URI_PAR = "./../org.eclipse.virgo.server.svt/apps/greenpages-solution-2.0.1.SNAPSHOT.par";
+	private static final String APP_URI_PLAN = "./../test-apps/scopedplan.plan";
+
+	private static final String resourcesDir1 = "./../org.eclipse.virgo.server.svt/bundles";
+	private static final String resourcesDir2 = "./../org.eclipse.virgo.server.svt/src/test/resources/bundles";
+    private static final String downloadDir = "target/bundles";
+
+	private static String[] bundleNames1 = new String[] {
+			"com.springsource.org.antlr-3.0.1.jar",
+			"com.springsource.javassist-3.9.0.GA.jar",
+			"com.springsource.net.sf.cglib-2.2.0.jar",
+			"com.springsource.org.apache.commons.collections-3.2.1.jar",
+			"com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar",
+			"com.springsource.org.apache.commons.logging-1.1.1.jar",
+			"com.springsource.org.apache.commons.pool-1.3.0.jar",
+			"com.springsource.org.dom4j-1.6.1.jar",
+			"com.springsource.org.eclipse.persistence-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.antlr-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.asm-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.jpa-1.0.0.jar",
+			"com.springsource.org.hsqldb-1.8.0.9.jar",
+			"com.springsource.org.objectweb.asm-1.5.3.jar",
+			"com.springsource.org.objectweb.asm.attrs-1.5.3.jar" };
+	
+	private static String[] downloadBundleNames1 = new String[] {
+            "com.springsource.org.hibernate-3.2.6.ga.jar" };
+
+	private static String[] bundleNames2 = new String[] {
+			"formtags-shared-services-service-2.0.1.BUILD-20100413113234.jar",
+			"com.springsource.freemarker-2.3.15.jar",
+			"com.springsource.javax.persistence-1.0.0.jar",
+			"com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar",
+			"com.springsource.org.apache.commons.pool-1.3.0.jar",
+			"com.springsource.org.eclipse.persistence-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.antlr-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.asm-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.jpa-1.0.0.jar",
+			"com.springsource.org.h2-1.0.71.jar", "hello.domain.jar",
+			"hello.service.api.jar", "hello.service.impl-en.jar",
+			"bundleA.jar", "bundleB.war", "foo.properties" };
+
+	private static Process process = null;
+	private static ProcessBuilder pb = null;
+	private static File startup = null;
+	private static File startupURI = null;
+	private static File shutdownURI = null;
+	private static String startupFileName = null;
+	private static File shutdown = null;
+	private static String shutdownFileName = null;
+	private static OperatingSystemMXBean os = ManagementFactory
+			.getOperatingSystemMXBean();
+
+	private static MBeanServerConnection connection = null;
+	private static final String JMXURL = "service:jmx:rmi:///jndi/rmi://localhost:4444/jmxrmi";
+	private static final String KEYSTORE = "/config/keystore";
+	private static final String KEYPASSWORD = "changeit";
+	public static final long HALF_SECOND = 500;
+	public static final long TWO_MINUTES = 120 * 1000;
+
+	private static String[] signature = null;
+	private static Object[] params = null;
+
+	private static String artifactType1 = null;
+	private static String artifactName1 = null;
+	private static String artifactVersion1 = null;
+
+	private static String artifactType4 = null;
+	private static String artifactName4 = null;
+	private static String artifactVersion4 = null;
+
+	private static String artifactType5 = null;
+	private static String artifactName5 = null;
+	private static String artifactVersion5 = null;
+
+	private static String artifactType6 = null;
+	private static String artifactName6 = null;
+	private static String artifactVersion6 = null;
+
+	private static String artifactType7 = null;
+	private static String artifactName7 = null;
+	private static String artifactVersion7 = null;
+
+	@BeforeClass
+	public static void testSetUp() throws IOException, Exception {
+		FileCopyUtils.copy(new File("src/test/resources/tomcat-server1.xml"),
+				new File(getConfiguredRemoteServerConfigDir1(),
+						"tomcat-server.xml"));
+		new File(getConfiguredRemoteServerConfigDir1(), "tomcat-server1.xml")
+				.renameTo(new File(getConfiguredRemoteServerConfigDir1(),
+						"tomcat-server.xml"));
+		FileCopyUtils.copy(new File(
+				"src/test/resources/org.eclipse.virgo.kernel4.properties"),
+				new File(getConfiguredRemoteServerConfigDir1(),
+						"org.eclipse.virgo.kernel.properties"));
+		new File(getConfiguredRemoteServerConfigDir1(),
+				"org.eclipse.virgo.kernel4.properties").renameTo(new File(
+				getConfiguredRemoteServerConfigDir1(),
+				"org.eclipse.virgo.kernel.properties"));
+		copyBundlesToHostedRepository(getConfiguredRemoteServerHostedBundlesDir());
+		new Thread(new StartUpThread1()).start();
+		Thread.sleep(5000);
+		UrlWaitLatch.waitFor(HOSTED_REPO_SPLASHURL);
+
+		FileSystemUtils.deleteRecursively(new File(
+				getConfiguredRemoteServerBundlesUsrDir2()));
+		new File(getConfiguredRemoteServerBundlesUsrDir2()).mkdir();
+		FileSystemUtils.deleteRecursively(new File(
+				getConfiguredRemoteServerConfigDir2(),
+				"org.eclipse.virgo.apps.repository.properties"));
+		FileCopyUtils.copy(new File(
+				"src/test/resources/org.eclipse.virgo.repository1.properties"),
+				new File(getConfiguredRemoteServerConfigDir2(),
+						"org.eclipse.virgo.repository.properties"));
+		new File(getConfiguredRemoteServerConfigDir2(),
+				"org.eclipse.virgo.repository1.properties").renameTo(new File(
+				getConfiguredRemoteServerConfigDir2(),
+				"org.eclipse.virgo.repository.properties"));
+		copyDependentBundlesToRepository(getConfiguredRemoteServerBundlesUsrDir2());
+		FileCopyUtils.copy(new File("src/test/resources/tomcat-server2.xml"),
+				new File(getConfiguredRemoteServerConfigDir2(),
+						"tomcat-server.xml"));
+		new File(getConfiguredRemoteServerConfigDir2(), "tomcat-server2.xml")
+				.renameTo(new File(getConfiguredRemoteServerConfigDir2(),
+						"tomcat-server.xml"));
+		FileCopyUtils.copy(new File(
+				"src/test/resources/org.eclipse.virgo.kernel5.properties"),
+				new File(getConfiguredRemoteServerConfigDir2(),
+						"org.eclipse.virgo.kernel.properties"));
+		new File(getConfiguredRemoteServerConfigDir2(),
+				"org.eclipse.virgo.kernel5.properties").renameTo(new File(
+				getConfiguredRemoteServerConfigDir2(),
+				"org.eclipse.virgo.kernel.properties"));
+		new Thread(new StartUpThread2()).start();
+		Thread.sleep(5000);
+		UrlWaitLatch.waitFor(CLIENT_SPLASHURL);
+	}
+
+	protected static String getConfiguredRemoteServerHomeDir1()
+			throws Exception {
+		if (serverHomeDir1 == null) {
+			File testExpanded = new File("src/test/resources");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()
+						&& candidate.getName().equals("virgo-web-server1")) {
+					serverHomeDir1 = new File(candidate.getCanonicalPath())
+							.getCanonicalPath();
+					break;
+				}
+			}
+		}
+		return serverHomeDir1;
+	}
+
+	protected static String getConfiguredRemoteServerHomeDir2()
+			throws Exception {
+		if (serverHomeDir2 == null) {
+			File testExpanded = new File("src/test/resources");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()
+						&& candidate.getName().equals("virgo-web-server2")) {
+					serverHomeDir2 = new File(candidate.getCanonicalPath())
+							.getCanonicalPath();
+					break;
+				}
+			}
+		}
+		return serverHomeDir2;
+	}
+
+	protected static String getConfiguredRemoteServerPickupDir()
+			throws Exception {
+		if (pickupDir == null) {
+			File testExpanded = new File(getConfiguredRemoteServerHomeDir2());
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()
+						&& candidate.getName().equals("pickup")) {
+					pickupDir = new File(candidate.getCanonicalPath())
+							.getCanonicalPath();
+					break;
+				}
+			}
+		}
+		return pickupDir;
+	}
+
+	public static String getConfiguredRemoteServerBinDir1() throws Exception {
+		if (binDir1 == null) {
+			File testExpanded = new File(getConfiguredRemoteServerHomeDir1());
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()
+						&& candidate.getName().equals("bin")) {
+					binDir1 = new File(candidate.getCanonicalPath())
+							.getCanonicalPath();
+					break;
+				}
+			}
+		}
+		return binDir1;
+	}
+
+	public static String getConfiguredRemoteServerConfigDir1() throws Exception {
+		if (configDir1 == null) {
+			File testExpanded = new File(getConfiguredRemoteServerHomeDir1());
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()
+						&& candidate.getName().equals("config")) {
+					configDir1 = new File(candidate.getCanonicalPath())
+							.getCanonicalPath();
+					break;
+				}
+			}
+		}
+		return configDir1;
+	}
+
+	public static String getConfiguredRemoteServerConfigDir2() throws Exception {
+		if (configDir2 == null) {
+			File testExpanded = new File(getConfiguredRemoteServerHomeDir2());
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()
+						&& candidate.getName().equals("config")) {
+					configDir2 = new File(candidate.getCanonicalPath())
+							.getCanonicalPath();
+					break;
+				}
+			}
+		}
+		return configDir2;
+	}
+
+	public static String getConfiguredRemoteServerBinDir2() throws Exception {
+		if (binDir2 == null) {
+			File testExpanded = new File(getConfiguredRemoteServerHomeDir2());
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()
+						&& candidate.getName().equals("bin")) {
+					binDir2 = new File(candidate.getCanonicalPath())
+							.getCanonicalPath();
+					break;
+				}
+			}
+		}
+		return binDir2;
+	}
+
+	public static void copyFile(File source, File dest) throws IOException {
+		if (!dest.exists()) {
+			dest.createNewFile();
+		}
+		InputStream in = null;
+		OutputStream out = null;
+		try {
+			in = new FileInputStream(source);
+			out = new FileOutputStream(dest);
+			byte[] buf = new byte[1024];
+			int len;
+			while ((len = in.read(buf)) > 0) {
+				out.write(buf, 0, len);
+			}
+		}
+
+		finally {
+			in.close();
+			out.close();
+		}
+	}
+
+	protected static String getConfiguredRemoteServerBundlesUsrDir1()
+			throws Exception {
+		if (usrDir1 == null) {
+			File serverHomeDir = new File(getConfiguredRemoteServerHomeDir1());
+			if (serverHomeDir.isDirectory()) {
+				File repositoryDir = new File(serverHomeDir, "repository")
+						.getCanonicalFile();
+				usrDir1 = new File(repositoryDir, "usr").getCanonicalPath();
+			}
+		}
+
+		return usrDir1;
+	}
+
+	protected static String getConfiguredRemoteServerBundlesUsrDir2()
+			throws Exception {
+		if (usrDir2 == null) {
+			File serverHomeDir = new File(getConfiguredRemoteServerHomeDir2());
+			if (serverHomeDir.isDirectory()) {
+				File repositoryDir = new File(serverHomeDir, "repository")
+						.getCanonicalFile();
+				usrDir2 = new File(repositoryDir, "usr").getCanonicalPath();
+			}
+		}
+
+		return usrDir2;
+	}
+
+	protected static String getConfiguredRemoteServerHostedBundlesDir()
+			throws Exception {
+		if (hostedDir == null) {
+			File testExpanded = new File(getConfiguredRemoteServerHomeDir1());
+			for (File mainDir : testExpanded.listFiles()) {
+				if (mainDir.isDirectory()
+						&& mainDir.getName().equals("repository")) {
+					new File(mainDir, "hosted").mkdir();
+					hostedDir = new File(mainDir, "hosted").getCanonicalPath();
+					break;
+				}
+			}
+		}
+
+		return hostedDir;
+	}
+
+	protected static void copyDependentBundlesToRepository(String bundlesUsrDir)
+			throws Exception {
+
+		for (String bundleName : bundleNames1) {
+
+			FileCopyUtils.copy(new File(resourcesDir1, bundleName), new File(
+					bundlesUsrDir, bundleName));
+		}
+		
+		for (String bundleName : downloadBundleNames1) {
+
+            FileCopyUtils.copy(new File(downloadDir, bundleName), new File(
+                    bundlesUsrDir, bundleName));
+        }
+	}
+
+	protected static void copyBundlesToHostedRepository(String bundlesUsrDir)
+			throws Exception {
+
+		for (String bundleName : bundleNames2) {
+
+			FileCopyUtils.copy(new File(resourcesDir2, bundleName), new File(
+					bundlesUsrDir, bundleName));
+		}
+	}
+
+	@Test
+	public void testScopedPlanArtifactDeployThatDependsUponArtifactsInRemoteHostedRepo()
+			throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_PLAN).toURI().toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName1 = compositeData.get("symbolicName").toString();
+		artifactType1 = compositeData.get("type").toString();
+		artifactVersion1 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType1, artifactName1, artifactVersion1,
+				HALF_SECOND, TWO_MINUTES);
+		assertArtifactExists(artifactType1, artifactName1, artifactVersion1);
+		waitForArtifactState("plan", "scoped.plan", "1.0.0", "ACTIVE",
+				HALF_SECOND, TWO_MINUTES);
+		ObjectName[] objectNameList = (ObjectName[]) getMBeanServerConnection()
+				.getAttribute(
+						getObjectName(artifactType1, artifactName1,
+								artifactVersion1), "Dependents");
+		for (ObjectName objectName : objectNameList) {
+			assertPlanReferencedArtifacts(objectName);
+		}
+		assertArtifactState(artifactType1, artifactName1, artifactVersion1,
+				"ACTIVE");
+	}
+
+	@Test
+	public void testScopedPlanArtifactUndeployThatDependsUponArtifactsInRemoteHostedRepo()
+			throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName1, artifactVersion1 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType1, artifactName1, artifactVersion1,
+				HALF_SECOND, TWO_MINUTES);
+		assertArtifactNotExists(artifactType1, artifactName1, artifactVersion1);
+	}
+
+	@Test
+	public void testUnscopedPlanThatDependsUponArtifactsInRemoteHostedRepo()
+			throws IOException, Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_PLAN_UNSCOPED).toURI()
+				.toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName4 = compositeData.get("symbolicName").toString();
+		artifactType4 = compositeData.get("type").toString();
+		artifactVersion4 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType4, artifactName4, artifactVersion4,
+				HALF_SECOND, TWO_MINUTES);
+		assertArtifactExists(artifactType4, artifactName4, artifactVersion4);
+		assertArtifactState(artifactType4, artifactName4, artifactVersion4,
+				"ACTIVE");
+	}
+
+	@Test
+	public void testDeploymentOfSharedServicesWarDependsOnArtfiactsInUnscopedPlan()
+			throws IOException, Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_SHAREDSERVICES_WAR1).toURI()
+				.toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName5 = compositeData.get("symbolicName").toString();
+		artifactType5 = compositeData.get("type").toString();
+		artifactVersion5 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType5, artifactName5, artifactVersion5,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitFor("http://localhost:8083/hello_war_shared_services/");
+		assertArtifactExists(artifactType5, artifactName5, artifactVersion5);
+		assertArtifactState(artifactType5, artifactName5, artifactVersion5,
+				"ACTIVE");
+	}
+
+	@Test
+	public void testUnDeploymentOfSharedServicesWarDependsOnArtfiactsInUnscopedPlan()
+			throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName5, artifactVersion5 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType5, artifactName5, artifactVersion5,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitForNotExistence("http://localhost:8083/hello_war_shared_services");
+		assertArtifactNotExists(artifactType5, artifactName5, artifactVersion5);
+	}
+
+	@Test
+	public void testSharedServicesWarDeployThatDependsUponArtifactsInRemoteHostedRepo()
+			throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_SHAREDSERVICES_WAR2).toURI()
+				.toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName6 = compositeData.get("symbolicName").toString();
+		artifactType6 = compositeData.get("type").toString();
+		artifactVersion6 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType6, artifactName6, artifactVersion6,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitFor("http://localhost:8083/formtags-shared-services-war-2.0.1.BUILD-20100413113234");
+		UrlWaitLatch
+				.waitFor("http://localhost:8083/formtags-shared-services-war-2.0.1.BUILD-20100413113234/list.htm");
+		UrlWaitLatch
+				.waitFor("http://localhost:8083/formtags-shared-services-war-2.0.1.BUILD-20100413113234/form.htm?id=1");
+		assertArtifactExists(artifactType6, artifactName6, artifactVersion6);
+		assertArtifactState(artifactType6, artifactName6, artifactVersion6,
+				"ACTIVE");
+	}
+
+	@Test
+	public void testSharedServicesWarUnDeployThatDependsUponArtifactsInRemoteHostedRepo()
+			throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName6, artifactVersion6 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType6, artifactName6, artifactVersion6,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitForNotExistence("http://localhost:8083/formtags-shared-services-war-2.0.1.BUILD-20100413113234");
+		assertArtifactNotExists(artifactType6, artifactName6, artifactVersion6);
+	}
+
+	@Test
+	public void testParDeployThatDependsUponArtifactsInRemoteHostedRepo()
+			throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_PAR).toURI().toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName7 = compositeData.get("symbolicName").toString();
+		artifactType7 = compositeData.get("type").toString();
+		artifactVersion7 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType7, artifactName7, artifactVersion7,
+				HALF_SECOND, TWO_MINUTES);
+		assertArtifactExists(artifactType7, artifactName7, artifactVersion7);
+		UrlWaitLatch.waitFor("http://localhost:8083/greenpages/app/home.htm");
+		assertArtifactState(artifactType7, artifactName7, artifactVersion7,
+				"ACTIVE");
+	}
+
+	@Test
+	public void testParUnDeployThatDependsUponArtifactsInRemoteHostedRepo()
+			throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName7, artifactVersion7 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType7, artifactName7, artifactVersion7,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch.waitForNotExistence("http://localhost:8083/greenpages");
+		assertArtifactNotExists(artifactType7, artifactName7, artifactVersion7);
+	}
+
+	@AfterClass
+	public static void shutdownRemoteInstance() throws Exception {
+		new Thread(new ShutdownThread1()).start();
+		UrlWaitLatch.waitForServerShutdownFully(HOSTED_REPO_SPLASHURL);
+		 FileSystemUtils.deleteRecursively(new File(
+		 getConfiguredRemoteServerHomeDir1()));
+		new Thread(new ShutdownThread2()).start();
+		UrlWaitLatch.waitForServerShutdownFully(CLIENT_SPLASHURL);
+		 FileSystemUtils.deleteRecursively(new File(
+		 getConfiguredRemoteServerHomeDir2()));
+	}
+
+	private static CompositeData deploy(String[] signature, Object[] params)
+			throws Exception {
+		CompositeData compsiteData = (CompositeData) getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		return compsiteData;
+	}
+
+	private static MBeanServerConnection getMBeanServerConnection()
+			throws Exception {
+		String severDir = null;
+		String[] creds = { "admin", "springsource" };
+		Map<String, String[]> env = new HashMap<String, String[]>();
+
+		File testExpanded = new File("src/test/resources");
+		for (File mainDir : testExpanded.listFiles()) {
+			if (mainDir.isDirectory()
+					&& mainDir.getName().equals("virgo-web-server2")) {
+				severDir = new File(mainDir.toURI()).getCanonicalPath();
+			}
+		}
+		env.put(JMXConnector.CREDENTIALS, creds);
+		System.setProperty("javax.net.ssl.trustStore", severDir + KEYSTORE);
+		System.setProperty("javax.net.ssl.trustStorePassword", KEYPASSWORD);
+		JMXServiceURL url = new JMXServiceURL(JMXURL);
+		connection = JMXConnectorFactory.connect(url, env)
+				.getMBeanServerConnection();
+		return connection;
+	}
+
+	private void waitForMBeanRegister(String type, String name, String version,
+			long interval, long duration) throws Exception {
+		long startTime = System.currentTimeMillis();
+		boolean mbeanStatus = false;
+		while (System.currentTimeMillis() - startTime < duration) {
+			mbeanStatus = getMBeanServerConnection().isRegistered(
+					getObjectName(type, name, version));
+			if (mbeanStatus) {
+				return;
+			}
+			Thread.sleep(interval);
+		}
+		fail(String.format("After %d ms, artifact %s mbean Status was",
+				duration, name)
+				+ mbeanStatus);
+	}
+
+	private void waitForMBeanDeRegister(String type, String name,
+			String version, long interval, long duration) throws Exception {
+		long startTime = System.currentTimeMillis();
+		boolean mbeanStatus = true;
+		while (System.currentTimeMillis() - startTime < duration) {
+			mbeanStatus = getMBeanServerConnection().isRegistered(
+					getObjectName(type, name, version));
+			if (!mbeanStatus) {
+				return;
+			}
+			Thread.sleep(interval);
+		}
+		fail(String.format("After %d ms, artifact %s mbean Status was",
+				duration, name)
+				+ mbeanStatus);
+	}
+
+	private 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);
+	}
+
+	private static ObjectName getObjectName(String type, String name,
+			String version) throws MalformedObjectNameException {
+		return new ObjectName(
+				String
+						.format(
+								"org.eclipse.virgo.kernel:type=Model,artifact-type=%s,name=%s,version=%s",
+								type, name, version));
+	}
+
+	private void assertArtifactExists(String type, String name, String version)
+			throws IOException, Exception, MalformedObjectNameException {
+		assertTrue(String.format("Artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertArtifactState(String type, String name, String version,
+			String state) throws MalformedObjectNameException, IOException,
+			Exception {
+		assertEquals(String.format("Artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format("Artifact %s:%s:%s is still exists", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertPlanReferencedArtifacts(ObjectName objectName)
+			throws MalformedObjectNameException, IOException, Exception {
+		assertTrue("plan referenced artifact does not exist",
+				getMBeanServerConnection().isRegistered(objectName));
+		assertEquals(String.format(
+				"plan referenced artifact is not in state %s", "ACTIVE"),
+				"ACTIVE", getMBeanServerConnection().getAttribute(objectName,
+						"State"));
+	}
+
+	private static class StartUpThread1 implements Runnable {
+		public StartUpThread1() {
+		}
+
+		public void run() {
+			String[] args = null;
+			try {
+				if (os.getName().contains("Windows")) {
+					startup = new File(getConfiguredRemoteServerBinDir1(),
+							"startup.bat");
+					startupURI = new File(startup.toURI());
+					startupFileName = startupURI.getCanonicalPath();
+
+				} else {
+					startup = new File(getConfiguredRemoteServerBinDir1(),
+							"startup.sh");
+					startupURI = new File(startup.toURI());
+					startupFileName = startupURI.getCanonicalPath();
+				}
+				args = new String[] { startupFileName, "-jmxport", "3333",
+						"-clean" };
+				pb = new ProcessBuilder(args);
+				Map<String, String> env = pb.environment();
+				env.put("JAVA_HOME", System.getProperty("java.home"));
+				pb.redirectErrorStream(true);
+
+				process = pb.start();
+
+				InputStream is = process.getInputStream();
+				InputStreamReader isr = new InputStreamReader(is);
+				BufferedReader br = new BufferedReader(isr);
+				String line;
+				while ((line = br.readLine()) != null) {
+					System.out.println(line);
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	private static class StartUpThread2 implements Runnable {
+		public StartUpThread2() {
+		}
+
+		public void run() {
+			String[] args = null;
+			try {
+				if (os.getName().contains("Windows")) {
+					startup = new File(getConfiguredRemoteServerBinDir2(),
+							"startup.bat");
+					startupURI = new File(startup.toURI());
+					startupFileName = startupURI.getCanonicalPath();
+
+				} else {
+					startup = new File(getConfiguredRemoteServerBinDir2(),
+							"startup.sh");
+					startupURI = new File(startup.toURI());
+					startupFileName = startupURI.getCanonicalPath();
+				}
+				args = new String[] { startupFileName, "-jmxport", "4444",
+						"-clean" };
+				pb = new ProcessBuilder(args);
+				Map<String, String> env = pb.environment();
+				env.put("JAVA_HOME", System.getProperty("java.home"));
+				pb.redirectErrorStream(true);
+
+				process = pb.start();
+
+				InputStream is = process.getInputStream();
+				InputStreamReader isr = new InputStreamReader(is);
+				BufferedReader br = new BufferedReader(isr);
+				String line;
+				while ((line = br.readLine()) != null) {
+					System.out.println(line);
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	private static class ShutdownThread1 implements Runnable {
+		public ShutdownThread1() {
+		}
+
+		public void run() {
+			String[] args = null;
+			try {
+				if (os.getName().contains("Windows")) {
+					shutdown = new File(getConfiguredRemoteServerBinDir1(),
+							"shutdown.bat");
+					shutdownURI = new File(shutdown.toURI());
+					shutdownFileName = shutdownURI.getCanonicalPath();
+				} else {
+					shutdown = new File(getConfiguredRemoteServerBinDir1(),
+							"shutdown.sh");
+					shutdownURI = new File(shutdown.toURI());
+					shutdownFileName = shutdownURI.getCanonicalPath();
+				}
+				args = new String[] { shutdownFileName, "-jmxport", "3333",
+						"-immediate" };
+				pb = new ProcessBuilder(args);
+				Map<String, String> env = pb.environment();
+				env.put("JAVA_HOME", System.getProperty("java.home"));
+				pb.redirectErrorStream(true);
+
+				process = pb.start();
+
+				InputStream is = process.getInputStream();
+				InputStreamReader isr = new InputStreamReader(is);
+				BufferedReader br = new BufferedReader(isr);
+				String line;
+				while ((line = br.readLine()) != null) {
+					System.out.println(line);
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+
+		}
+	}
+
+	private static class ShutdownThread2 implements Runnable {
+		public ShutdownThread2() {
+		}
+
+		public void run() {
+			String[] args = null;
+			try {
+				if (os.getName().contains("Windows")) {
+					shutdown = new File(getConfiguredRemoteServerBinDir2(),
+							"shutdown.bat");
+					shutdownURI = new File(shutdown.toURI());
+					shutdownFileName = shutdownURI.getCanonicalPath();
+				} else {
+					shutdown = new File(getConfiguredRemoteServerBinDir2(),
+							"shutdown.sh");
+					shutdownURI = new File(shutdown.toURI());
+					shutdownFileName = shutdownURI.getCanonicalPath();
+				}
+				args = new String[] { shutdownFileName, "-jmxport", "4444",
+						"-immediate" };
+				pb = new ProcessBuilder(args);
+				Map<String, String> env = pb.environment();
+				env.put("JAVA_HOME", System.getProperty("java.home"));
+				pb.redirectErrorStream(true);
+
+				process = pb.start();
+
+				InputStream is = process.getInputStream();
+				InputStreamReader isr = new InputStreamReader(is);
+				BufferedReader br = new BufferedReader(isr);
+				String line;
+				while ((line = br.readLine()) != null) {
+					System.out.println(line);
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+
+		}
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/hostedrepo/RemoteHostedRepositoryTests.java b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/hostedrepo/RemoteHostedRepositoryTests.java
new file mode 100644
index 0000000..3a8d32e
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/hostedrepo/RemoteHostedRepositoryTests.java
@@ -0,0 +1,665 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.server.svt.hostedrepo;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.lang.management.ManagementFactory;
+import java.lang.management.OperatingSystemMXBean;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.management.MBeanServerConnection;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+import org.eclipse.virgo.util.io.FileSystemUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.ElementNotFoundException;
+
+public class RemoteHostedRepositoryTests extends AbstractWebTests {
+
+	private static String serverHomeDir = null;
+	private static String usrDir = null;
+	private static String binDir = null;
+	private static String configDir = null;
+
+	protected static final String SPLASHURL = "http://localhost:8081/";
+	protected static final String ADMINURL = "http://localhost:8081/admin";
+	
+	private static final String APP_URI_SHAREDSERVICES_WAR1 = "./../org.eclipse.virgo.server.svt/apps/hello_war_shared_services.war";
+	private static final String APP_URI_PAR = "./../org.eclipse.virgo.server.svt/apps/greenpages-solution-2.0.1.SNAPSHOT.par";
+	private static final String APP_URI_UNSCOPED_PLAN = "./../org.eclipse.virgo.server.svt/apps/helloworld_unscoped-1.0.0.RELEASE.plan";
+	private static final String APP_URI_PLAN1 = "./../test-apps/scopedplan.plan";
+	private static final String APP_URI_PLAN2 = "src/test/resources/parreferencedplan.plan";
+
+	private static final String resourcesDir = "./../org.eclipse.virgo.server.svt/bundles";
+	private static final String downloadDir = "target/bundles";
+
+	private static String[] bundleNames = new String[] {
+			"com.springsource.org.antlr-3.0.1.jar",
+			"com.springsource.javassist-3.9.0.GA.jar",
+			"com.springsource.net.sf.cglib-2.2.0.jar",
+			"com.springsource.org.apache.commons.collections-3.2.1.jar",
+			"com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar",
+			"com.springsource.org.apache.commons.logging-1.1.1.jar",
+			"com.springsource.org.apache.commons.pool-1.3.0.jar",
+			"com.springsource.org.dom4j-1.6.1.jar",
+			"com.springsource.org.eclipse.persistence-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.antlr-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.asm-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.jpa-1.0.0.jar",
+			"com.springsource.org.hsqldb-1.8.0.9.jar",
+			"com.springsource.org.objectweb.asm-1.5.3.jar",
+			"com.springsource.org.objectweb.asm.attrs-1.5.3.jar" };
+	
+	private static String[] downloadBundleNames = new String[] {
+            "com.springsource.org.hibernate-3.2.6.ga.jar" };
+
+	private static Process process = null;
+	private static ProcessBuilder pb = null;
+	private static File startup = null;
+	private static File startupURI = null;
+	private static File shutdownURI = null;
+	private static String startupFileName = null;
+	private static File shutdown = null;
+	private static String shutdownFileName = null;
+	private static OperatingSystemMXBean os = ManagementFactory
+			.getOperatingSystemMXBean();
+	private static MBeanServerConnection connection = null;
+	private static final String JMXURL = "service:jmx:rmi:///jndi/rmi://localhost:3333/jmxrmi";
+	private static final String KEYSTORE = "/config/keystore";
+	private static final String KEYPASSWORD = "changeit";
+	public static final long HALF_SECOND = 500;
+	public static final long TWO_MINUTES = 120 * 1000;
+
+	private static String artifactType1 = null;
+	private static String artifactName1 = null;
+	private static String artifactVersion1 = null;
+	
+	private static String artifactType3 = null;
+	private static String artifactName3 = null;
+	private static String artifactVersion3 = null;
+	
+	private static String artifactType4 = null;
+	private static String artifactName4 = null;
+	private static String artifactVersion4 = null;
+	
+	private static String artifactType5 = null;
+	private static String artifactName5 = null;
+	private static String artifactVersion5 = null;
+
+	
+	private static String artifactType7 = null;
+	private static String artifactName7 = null;
+	private static String artifactVersion7 = null;
+	
+	private static String artifactType8 = null;
+	private static String artifactName8 = null;
+	private static String artifactVersion8 = null;
+	
+	private static String[] signature = null;
+	private static Object[] params = null;
+
+	@BeforeClass
+	public static void testSetUp() throws IOException, Exception {
+		startServer();
+		FileSystemUtils.deleteRecursively(new File(
+				getConfiguredServerConfigDir(),
+				"org.eclipse.virgo.apps.repository.properties"));
+		FileSystemUtils.deleteRecursively(new File(
+				getConfiguredServerRepositoryUsrDir()));
+		new File(getConfiguredServerRepositoryUsrDir()).mkdir();
+		FileCopyUtils.copy(new File(
+				"src/test/resources/org.eclipse.virgo.repository.properties"),
+				new File(getConfiguredServerConfigDir(),
+						"org.eclipse.virgo.repository.properties"));
+		FileCopyUtils.copy(new File("src/test/resources/tomcat-server.xml"),
+				new File(getConfiguredServerConfigDir(), "tomcat-server.xml"));
+		FileCopyUtils.copy(new File(
+				"src/test/resources/org.eclipse.virgo.kernel3.properties"),
+				new File(getConfiguredServerConfigDir(),
+						"org.eclipse.virgo.kernel.properties"));
+		new File(getConfiguredServerConfigDir(),
+				"org.eclipse.virgo.kernel3.properties").renameTo(new File(
+				getConfiguredServerConfigDir(),
+				"org.eclipse.virgo.kernel.properties"));
+		copyDependentBundlesToRepository(getConfiguredServerRepositoryUsrDir());
+		new Thread(new StartUpThread()).start();
+		UrlWaitLatch.waitFor(SPLASHURL);
+	}
+
+	private static String getConfiguredServerHomeDir() throws Exception {
+		if (serverHomeDir == null) {
+			File testExpanded = new File("src/test/resources");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()
+						&& candidate.getName().equals("virgo-web-server")) {
+					serverHomeDir = new File(candidate.getCanonicalPath())
+							.getCanonicalPath();
+					break;
+				}
+			}
+		}
+		return serverHomeDir;
+	}
+
+	private static String getConfiguredServerConfigDir() throws Exception {
+		if (configDir == null) {
+			File serverHomeDir = new File(getConfiguredServerHomeDir());
+			if (serverHomeDir.isDirectory()) {
+				configDir = new File(serverHomeDir, "config")
+						.getCanonicalPath();
+			}
+		}
+		return configDir;
+	}
+
+	private static String getConfiguredServerBinDir() throws Exception {
+		if (binDir == null) {
+			File serverHomeDir = new File(getConfiguredServerHomeDir());
+			if (serverHomeDir.isDirectory()) {
+				binDir = new File(serverHomeDir, "bin").getCanonicalPath();
+			}
+		}
+		return binDir;
+	}
+
+	public static void copyFile(File source, File dest) throws IOException {
+		if (!dest.exists()) {
+			dest.createNewFile();
+		}
+		InputStream in = null;
+		OutputStream out = null;
+		try {
+			in = new FileInputStream(source);
+			out = new FileOutputStream(dest);
+			byte[] buf = new byte[1024];
+			int len;
+			while ((len = in.read(buf)) > 0) {
+				out.write(buf, 0, len);
+			}
+		}
+
+		finally {
+			in.close();
+			out.close();
+		}
+	}
+
+	protected static String getConfiguredServerRepositoryUsrDir()
+			throws Exception {
+		if (usrDir == null) {
+			File serverHomeDir = new File(getConfiguredServerHomeDir());
+			if (serverHomeDir.isDirectory()) {
+				File repositoryDir = new File(serverHomeDir, "repository")
+						.getCanonicalFile();
+				usrDir = new File(repositoryDir, "usr").getCanonicalPath();
+			}
+		}
+
+		return usrDir;
+	}
+
+	protected static void copyDependentBundlesToRepository(String bundlesUsrDir)
+			throws Exception {
+
+		for (String bundleName : bundleNames) {
+
+			FileCopyUtils.copy(new File(resourcesDir, bundleName), new File(
+					bundlesUsrDir, bundleName));
+		}
+		
+		for (String bundleName : downloadBundleNames) {
+
+            FileCopyUtils.copy(new File(downloadDir, bundleName), new File(
+                    bundlesUsrDir, bundleName));
+        }
+	}
+
+
+	@Test
+	public void testPlanArtifactDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_PLAN1).toURI().toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName1 = compositeData.get("symbolicName").toString();
+		artifactType1 = compositeData.get("type").toString();
+		artifactVersion1 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType1, artifactName1, artifactVersion1,
+				HALF_SECOND, TWO_MINUTES);
+		assertArtifactExists(artifactType1, artifactName1, artifactVersion1);
+		waitForArtifactState("plan", "scoped.plan", "1.0.0", "ACTIVE",
+				HALF_SECOND, TWO_MINUTES);
+		ObjectName[] objectNameList = (ObjectName[]) getMBeanServerConnection()
+				.getAttribute(
+						getObjectName(artifactType1, artifactName1,
+								artifactVersion1), "Dependents");
+		for (ObjectName objectName : objectNameList) {
+			assertPlanReferencedArtifacts(objectName);
+		}
+		assertArtifactState(artifactType1, artifactName1, artifactVersion1,
+				"ACTIVE");
+	}
+
+	
+	@Test
+	public void testPlanArtifactUndeploy() throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName1, artifactVersion1 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType1, artifactName1, artifactVersion1,
+				HALF_SECOND, TWO_MINUTES);
+		assertArtifactNotExists(artifactType1, artifactName1, artifactVersion1);
+	}
+	
+	@Ignore
+	@Test
+	public void planDeployReferencesParArtifactFromRemoteRepository() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_PLAN2).toURI().toString() };
+
+		CompositeData compositeData = deploy(signature, params);
+		artifactName8 = compositeData.get("symbolicName").toString();
+		artifactType8 = compositeData.get("type").toString();
+		artifactVersion8 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType8, artifactName8, artifactVersion8, HALF_SECOND, TWO_MINUTES);
+		assertArtifactExists(artifactType8, artifactName8, artifactVersion8);
+		assertArtifactState(artifactType8, artifactName8, artifactVersion8, "ACTIVE");
+	}
+	
+	@Ignore
+	@Test
+	public void planUnDeployReferencesParArtifactFromRemoteRepository() throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName8, artifactVersion8 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType8, artifactName8, artifactVersion8, HALF_SECOND, TWO_MINUTES);
+		assertArtifactNotExists(artifactType8, artifactName8, artifactVersion8);
+	}
+
+	
+
+	@Test
+	public void testUnscopedPlanDeployThatDependsUponArtifactsInRemoteHostedRepo()
+			throws IOException, Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_UNSCOPED_PLAN).toURI().toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName3 = compositeData.get("symbolicName").toString();
+		artifactType3 = compositeData.get("type").toString();
+		artifactVersion3 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType3, artifactName3, artifactVersion3,
+				HALF_SECOND, TWO_MINUTES);
+		assertArtifactExists(artifactType3, artifactName3, artifactVersion3);
+		assertArtifactState(artifactType3, artifactName3, artifactVersion3,
+				"ACTIVE");
+	}
+
+	@Test
+	public void testUnscopedPlanUnDeployThatDependsUponArtifactsInRemoteHostedRepo()
+			throws IOException, Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName3, artifactVersion3 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType3, artifactName3, artifactVersion3,
+				HALF_SECOND, TWO_MINUTES);
+		assertArtifactNotExists(artifactType3, artifactName3, artifactVersion3);
+	}
+
+	@Test
+	public void testJmxDeploymentOfUnscopedPlanThatDependsUponArtifactsInRemoteHostedRepo()
+			throws IOException, Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_UNSCOPED_PLAN).toURI().toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName4 = compositeData.get("symbolicName").toString();
+		artifactType4 = compositeData.get("type").toString();
+		artifactVersion4 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType4, artifactName4, artifactVersion4,
+				HALF_SECOND, TWO_MINUTES);
+		assertArtifactExists(artifactType4, artifactName4, artifactVersion4);
+		assertArtifactState(artifactType4, artifactName4, artifactVersion4,
+				"ACTIVE");
+	}
+
+	@Test
+	public void testDeploymentOfSharedServicesWarDependsOnArtfiactsInUnscopedPlan()
+			throws IOException, Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_SHAREDSERVICES_WAR1).toURI()
+				.toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName5 = compositeData.get("symbolicName").toString();
+		artifactType5 = compositeData.get("type").toString();
+		artifactVersion5 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType5, artifactName5, artifactVersion5,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitFor("http://localhost:8081/hello_war_shared_services/");
+		assertArtifactExists(artifactType5, artifactName5, artifactVersion5);
+		assertArtifactState(artifactType5, artifactName5, artifactVersion5,
+				"ACTIVE");
+	}
+
+	@Test
+	public void testUnDeploymentOfSharedServicesWarDependsOnArtfiactsInUnscopedPlan()
+			throws ElementNotFoundException, Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName5, artifactVersion5 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType5, artifactName5, artifactVersion5,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitForNotExistence("http://localhost:8081/hello_war_shared_services");
+		assertArtifactNotExists(artifactType5, artifactName5, artifactVersion5);
+	}
+
+	
+
+	@Test
+	public void testParDeployThatDependsUponArtifactsInRemoteHostedRepo()
+			throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_PAR).toURI().toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName7 = compositeData.get("symbolicName").toString();
+		artifactType7 = compositeData.get("type").toString();
+		artifactVersion7 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType7, artifactName7, artifactVersion7,
+				HALF_SECOND, TWO_MINUTES);
+		assertArtifactExists(artifactType7, artifactName7, artifactVersion7);
+		UrlWaitLatch.waitFor("http://localhost:8081/greenpages/app/home.htm");
+		assertArtifactState(artifactType7, artifactName7, artifactVersion7,
+				"ACTIVE");
+	}
+
+	@Test
+	public void testParUndeployThatDependsUponArtifactsInRemoteHostedRepo()
+			throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName7, artifactVersion7 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType7, artifactName7, artifactVersion7,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch.waitForNotExistence("http://localhost:8081/greenpages");
+		assertArtifactNotExists(artifactType7, artifactName7, artifactVersion7);
+	}
+
+	@AfterClass
+	public static void shutdownRemoteInstance() throws Exception {
+		new Thread(new ShutdownThread()).start();
+		UrlWaitLatch.waitForServerShutdownFully(SPLASHURL);
+		FileSystemUtils
+				.deleteRecursively(new File(getConfiguredServerHomeDir()));
+		shutdownServer();
+	}
+
+	private static CompositeData deploy(String[] signature, Object[] params)
+			throws Exception {
+		CompositeData compsiteData = (CompositeData) getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		return compsiteData;
+	}
+
+	private void assertArtifactExists(String type, String name, String version)
+			throws IOException, Exception, MalformedObjectNameException {
+		assertTrue(String.format("Artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertArtifactState(String type, String name, String version,
+			String state) throws MalformedObjectNameException, IOException,
+			Exception {
+		assertEquals(String.format("Artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format("Artifact %s:%s:%s is still exists", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertPlanReferencedArtifacts(ObjectName objectName)
+			throws MalformedObjectNameException, IOException, Exception {
+		assertTrue("plan referenced artifact does not exist",
+				getMBeanServerConnection().isRegistered(objectName));
+		assertEquals(String.format(
+				"plan referenced artifact is not in state %s", "ACTIVE"),
+				"ACTIVE", getMBeanServerConnection().getAttribute(objectName,
+						"State"));
+	}
+
+	private static MBeanServerConnection getMBeanServerConnection()
+			throws Exception {
+		String severDir = null;
+		String[] creds = { "admin", "springsource" };
+		Map<String, String[]> env = new HashMap<String, String[]>();
+
+		File testExpanded = new File("src/test/resources");
+		for (File mainDir : testExpanded.listFiles()) {
+			if (mainDir.isDirectory()
+					&& mainDir.getName().equals("virgo-web-server")) {
+				severDir = new File(mainDir.toURI()).getCanonicalPath();
+			}
+		}
+		env.put(JMXConnector.CREDENTIALS, creds);
+		System.setProperty("javax.net.ssl.trustStore", severDir + KEYSTORE);
+		System.setProperty("javax.net.ssl.trustStorePassword", KEYPASSWORD);
+		JMXServiceURL url = new JMXServiceURL(JMXURL);
+		connection = JMXConnectorFactory.connect(url, env)
+				.getMBeanServerConnection();
+		return connection;
+	}
+
+	private void waitForMBeanRegister(String type, String name, String version,
+			long interval, long duration) throws Exception {
+		long startTime = System.currentTimeMillis();
+		boolean mbeanStatus = false;
+		while (System.currentTimeMillis() - startTime < duration) {
+			mbeanStatus = getMBeanServerConnection().isRegistered(
+					getObjectName(type, name, version));
+			if (mbeanStatus) {
+				return;
+			}
+			Thread.sleep(interval);
+		}
+		fail(String.format("After %d ms, artifact %s mbean Status was",
+				duration, name)
+				+ mbeanStatus);
+	}
+
+	private void waitForMBeanDeRegister(String type, String name,
+			String version, long interval, long duration) throws Exception {
+		long startTime = System.currentTimeMillis();
+		boolean mbeanStatus = true;
+		while (System.currentTimeMillis() - startTime < duration) {
+			mbeanStatus = getMBeanServerConnection().isRegistered(
+					getObjectName(type, name, version));
+			if (!mbeanStatus) {
+				return;
+			}
+			Thread.sleep(interval);
+		}
+		fail(String.format("After %d ms, artifact %s mbean Status was",
+				duration, name)
+				+ mbeanStatus);
+	}
+
+	private 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);
+	}
+
+	private static ObjectName getObjectName(String type, String name,
+			String version) throws MalformedObjectNameException {
+		return new ObjectName(
+				String
+						.format(
+								"org.eclipse.virgo.kernel:type=Model,artifact-type=%s,name=%s,version=%s",
+								type, name, version));
+	}
+
+	private static class StartUpThread implements Runnable {
+		public StartUpThread() {
+		}
+
+		public void run() {
+			String[] args = null;
+			try {
+				if (os.getName().contains("Windows")) {
+					startup = new File(getConfiguredServerBinDir(),
+							"startup.bat");
+					startupURI = new File(startup.toURI());
+					startupFileName = startupURI.getCanonicalPath();
+				} else {
+					startup = new File(getConfiguredServerBinDir(),
+							"startup.sh");
+					startupURI = new File(startup.toURI());
+					startupFileName = startupURI.getCanonicalPath();
+				}
+				args = new String[] { startupFileName, "-jmxport", "3333" ,"-clean"};
+				pb = new ProcessBuilder(args);
+				pb.redirectErrorStream(true);
+				Map<String, String> env = pb.environment();
+				env.put("JAVA_HOME", System.getProperty("java.home"));
+
+				process = pb.start();
+
+				InputStream is = process.getInputStream();
+				InputStreamReader isr = new InputStreamReader(is);
+				BufferedReader br = new BufferedReader(isr);
+				String line;
+				while ((line = br.readLine()) != null) {
+					System.out.println(line);
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	private static class ShutdownThread implements Runnable {
+		public ShutdownThread() {
+
+		}
+
+		public void run() {
+			String[] args = null;
+			try {
+				if (os.getName().contains("Windows")) {
+					shutdown = new File(getConfiguredServerBinDir(),
+							"shutdown.bat");
+					shutdownURI = new File(shutdown.toURI());
+					shutdownFileName = shutdownURI.getCanonicalPath();
+				} else {
+					shutdown = new File(getConfiguredServerBinDir(),
+							"shutdown.sh");
+					shutdownURI = new File(shutdown.toURI());
+					shutdownFileName = shutdownURI.getCanonicalPath();
+				}
+				args = new String[] { shutdownFileName, "-jmxport", "3333" };
+				pb = new ProcessBuilder(args);
+				Map<String, String> env = pb.environment();
+				env.put("JAVA_HOME", System.getProperty("java.home"));
+				pb.redirectErrorStream(true);
+
+				process = pb.start();
+
+				InputStream is = process.getInputStream();
+				InputStreamReader isr = new InputStreamReader(is);
+				BufferedReader br = new BufferedReader(isr);
+				String line;
+				while ((line = br.readLine()) != null) {
+					System.out.println(line);
+				}
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
+
+		}
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/watchrepo/WatchedRepositoryTests.java b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/watchrepo/WatchedRepositoryTests.java
new file mode 100644
index 0000000..923dfef
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/java/org/eclipse/virgo/server/svt/watchrepo/WatchedRepositoryTests.java
@@ -0,0 +1,370 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.server.svt.watchrepo;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.BufferedReader;
+import java.io.File;
+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.HashMap;
+import java.util.Map;
+
+import javax.management.MBeanServerConnection;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class WatchedRepositoryTests extends AbstractWebTests {
+
+	private static String[] bundleNames = new String[] {
+			"formtags-shared-services-service-2.0.1.BUILD-20100413113234.jar",
+			"com.springsource.freemarker-2.3.15.jar",
+			"com.springsource.javax.persistence-1.0.0.jar",
+			"com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar",
+			"com.springsource.org.apache.commons.pool-1.3.0.jar",
+			"com.springsource.org.eclipse.persistence-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.antlr-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.asm-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.jpa-1.0.0.jar",
+			"com.springsource.org.h2-1.0.71.jar"};
+	private static final String bundlesDir = "src/test/resources/bundles";
+
+	private static final String APP_URI_SHAREDSERVICES_WAR = "./../org.eclipse.virgo.server.svt/apps/formtags-shared-services-war-2.0.1.BUILD-20100413113234.war";
+	private static final String APP_URI_PAR = "./../org.eclipse.virgo.server.svt/apps/greenpages-solution-2.0.1.SNAPSHOT.par";
+	
+	private static Process process = null;
+	private static ProcessBuilder pb = null;
+	private static File startup = null;
+	private static String startupFileName = null;
+	private static File shutdown = null;
+	private static String shutdownFileName = null;
+	private static File startupURI = null;
+	private static File shutdownURI = null;
+	private static OperatingSystemMXBean os = ManagementFactory
+			.getOperatingSystemMXBean();
+	private static MBeanServerConnection connection = null;
+	private static final String JMXURL = "service:jmx:rmi:///jndi/rmi://localhost:9875/jmxrmi";
+	private static final String KEYSTORE = "/config/keystore";
+	private static final String KEYPASSWORD = "changeit";
+	public static final long HALF_SECOND = 500;
+	public static final long TWO_MINUTES = 120 * 1000;
+
+	private static String artifactType1 = null;
+	private static String artifactName1 = null;
+	private static String artifactVersion1 = null;
+	
+	private static String artifactType2 = null;
+	private static String artifactName2 = null;
+	private static String artifactVersion2 = null;
+
+	private static String[] signature = null;
+	private static Object[] params = null;
+
+	@BeforeClass
+	public static void watchRepoSetUp() throws Exception {
+		addBundlesToWatchedRepository(getWatchedRepoDir());
+		new Thread(new ShutdownThread()).start();
+		UrlWaitLatch.waitForServerShutdownFully("http://localhost:8080/");
+		new Thread(new StartUpThread()).start();
+		UrlWaitLatch.waitFor("http://localhost:8080/");
+	}
+
+	public static void addBundlesToWatchedRepository(String repoDir)
+			throws Exception {
+		for (String bundleName : bundleNames) {
+			FileCopyUtils.copy(new File(bundlesDir, bundleName), new File(
+					repoDir, bundleName));
+		}
+
+	}
+
+	@Test
+	public void testSharedServicesWarDeployThatDependsUponArtifactsInWatchRepo()
+			throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_SHAREDSERVICES_WAR).toURI()
+				.toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName1 = compositeData.get("symbolicName").toString();
+		artifactType1 = compositeData.get("type").toString();
+		artifactVersion1 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType1, artifactName1, artifactVersion1,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-shared-services-war-2.0.1.BUILD-20100413113234");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-shared-services-war-2.0.1.BUILD-20100413113234/list.htm");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-shared-services-war-2.0.1.BUILD-20100413113234/form.htm?id=1");
+		assertArtifactExists(artifactType1, artifactName1, artifactVersion1);
+		assertArtifactState(artifactType1, artifactName1, artifactVersion1,
+				"ACTIVE");
+	}
+
+	@Test
+	public void testSharedServicesWarUndeployThatDependsUponArtifactsInWatchRepo()
+			throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName1, artifactVersion1 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType1, artifactName1, artifactVersion1,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitForNotExistence("http://localhost:8080/formtags-shared-services-war-2.0.1.BUILD-20100413113234");
+		assertArtifactNotExists(artifactType1, artifactName1, artifactVersion1);
+	}
+
+	@Test
+	public void testParDeployThatDependsUponArtifactsInWatchRepo()
+			throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_PAR).toURI().toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName2 = compositeData.get("symbolicName").toString();
+		artifactType2 = compositeData.get("type").toString();
+		artifactVersion2 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType2, artifactName2, artifactVersion2,
+				HALF_SECOND, TWO_MINUTES);
+		assertArtifactExists(artifactType2, artifactName2, artifactVersion2);
+		UrlWaitLatch.waitFor("http://localhost:8080/greenpages/app/home.htm");
+		assertArtifactState(artifactType2, artifactName2, artifactVersion2,
+				"ACTIVE");
+	}
+
+	@Test
+	public void testParUndeployThatDependsUponArtifactsInWatchRepo()
+			throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName2, artifactVersion2 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType2, artifactName2, artifactVersion2,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch.waitForNotExistence("http://localhost:8080/greenpages");
+		assertArtifactNotExists(artifactType2, artifactName2, artifactVersion2);
+	}
+
+	
+	@AfterClass
+	public static void shutdownServerInstance() {
+		new Thread(new ShutdownThread()).start();
+		UrlWaitLatch.waitForServerShutdownFully("http://localhost:8080/");
+	}
+
+	private static CompositeData deploy(String[] signature, Object[] params)
+			throws Exception {
+		CompositeData compsiteData = (CompositeData) getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		return compsiteData;
+	}
+
+	private void assertArtifactExists(String type, String name, String version)
+			throws IOException, Exception, MalformedObjectNameException {
+		assertTrue(String.format("Artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertArtifactState(String type, String name, String version,
+			String state) throws MalformedObjectNameException, IOException,
+			Exception {
+		assertEquals(String.format("Artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format("Artifact %s:%s:%s is still exists", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private static MBeanServerConnection getMBeanServerConnection()
+			throws Exception {
+		String severDir = null;
+		String[] creds = { "admin", "springsource" };
+		Map<String, String[]> env = new HashMap<String, String[]>();
+
+		File testExpanded = new File(
+				"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+		for (File mainDir : testExpanded.listFiles()) {
+			if (mainDir.isDirectory()) {
+				severDir = new File(mainDir.toURI()).getCanonicalPath();
+			}
+		}
+		env.put(JMXConnector.CREDENTIALS, creds);
+		System.setProperty("javax.net.ssl.trustStore", severDir + KEYSTORE);
+		System.setProperty("javax.net.ssl.trustStorePassword", KEYPASSWORD);
+		JMXServiceURL url = new JMXServiceURL(JMXURL);
+		connection = JMXConnectorFactory.connect(url, env)
+				.getMBeanServerConnection();
+		return connection;
+	}
+
+	private void waitForMBeanRegister(String type, String name, String version,
+			long interval, long duration) throws Exception {
+		long startTime = System.currentTimeMillis();
+		boolean mbeanStatus = false;
+		while (System.currentTimeMillis() - startTime < duration) {
+			mbeanStatus = getMBeanServerConnection().isRegistered(
+					getObjectName(type, name, version));
+			if (mbeanStatus) {
+				return;
+			}
+			Thread.sleep(interval);
+		}
+		fail(String.format("After %d ms, artifact %s mbean Status was",
+				duration, name)
+				+ mbeanStatus);
+	}
+
+	private void waitForMBeanDeRegister(String type, String name,
+			String version, long interval, long duration) throws Exception {
+		long startTime = System.currentTimeMillis();
+		boolean mbeanStatus = true;
+		while (System.currentTimeMillis() - startTime < duration) {
+			mbeanStatus = getMBeanServerConnection().isRegistered(
+					getObjectName(type, name, version));
+			if (!mbeanStatus) {
+				return;
+			}
+			Thread.sleep(interval);
+		}
+		fail(String.format("After %d ms, artifact %s mbean Status was",
+				duration, name)
+				+ mbeanStatus);
+	}
+
+	private static ObjectName getObjectName(String type, String name,
+			String version) throws MalformedObjectNameException {
+		return new ObjectName(
+				String
+						.format(
+								"org.eclipse.virgo.kernel:type=Model,artifact-type=%s,name=%s,version=%s",
+								type, name, version));
+	}
+
+	private static class StartUpThread implements Runnable {
+
+		public StartUpThread() {
+
+		}
+
+		public void run() {
+			String[] args = null;
+			try {
+				if (os.getName().contains("Windows")) {
+					startup = new File(getServerBinDir(), "startup.bat");
+					startupURI = new File(startup.toURI());
+					startupFileName = startupURI.getCanonicalPath();
+				} else {
+					startup = new File(getServerBinDir(), "startup.sh");
+					startupURI = new File(startup.toURI());
+					startupFileName = startupURI.getCanonicalPath();
+				}
+				args = new String[] { startupFileName, "-clean" };
+				pb = new ProcessBuilder(args);
+				Map<String, String> env = pb.environment();
+				env.put("JAVA_HOME", System.getProperty("java.home"));
+				pb.redirectErrorStream(true);
+
+				process = pb.start();
+
+				InputStream is = process.getInputStream();
+				InputStreamReader isr = new InputStreamReader(is);
+				BufferedReader br = new BufferedReader(isr);
+				String line;
+				while ((line = br.readLine()) != null) {
+					System.out.println(line);
+				}
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+		}
+	}
+
+	private static class ShutdownThread implements Runnable {
+
+		public ShutdownThread() {
+
+		}
+
+		public void run() {
+			String[] args = null;
+			try {
+
+				if (os.getName().contains("Windows")) {
+					shutdown = new File(getServerBinDir(), "shutdown.bat");
+					shutdownURI = new File(shutdown.toURI());
+					shutdownFileName = shutdownURI.getCanonicalPath();
+				} else {
+					shutdown = new File(getServerBinDir(), "shutdown.sh");
+					shutdownURI = new File(shutdown.toURI());
+					shutdownFileName = shutdownURI.getCanonicalPath();
+				}
+				args = new String[] { shutdownFileName, "-immediate" };
+				pb = new ProcessBuilder(args);
+				Map<String, String> env = pb.environment();
+				env.put("JAVA_HOME", System.getProperty("java.home"));
+				pb.redirectErrorStream(true);
+
+				process = pb.start();
+
+				InputStream is = process.getInputStream();
+				InputStreamReader isr = new InputStreamReader(is);
+				BufferedReader br = new BufferedReader(isr);
+				String line;
+				while ((line = br.readLine()) != null) {
+					System.out.println(line);
+				}
+			} catch (IOException e) {
+				e.printStackTrace();
+			}
+
+		}
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.freemarker-2.3.15.jar b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.freemarker-2.3.15.jar
new file mode 100644
index 0000000..9bf1020
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.freemarker-2.3.15.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.javax.persistence-1.0.0.jar b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.javax.persistence-1.0.0.jar
new file mode 100644
index 0000000..9fcc5ae
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.javax.persistence-1.0.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
new file mode 100644
index 0000000..a8ef066
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.apache.commons.pool-1.3.0.jar b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.apache.commons.pool-1.3.0.jar
new file mode 100644
index 0000000..7e45c21
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.apache.commons.pool-1.3.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.eclipse.persistence-1.0.0.jar b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.eclipse.persistence-1.0.0.jar
new file mode 100644
index 0000000..8a27959
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.eclipse.persistence-1.0.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.eclipse.persistence.antlr-1.0.0.jar b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.eclipse.persistence.antlr-1.0.0.jar
new file mode 100644
index 0000000..31d1164
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.eclipse.persistence.antlr-1.0.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.eclipse.persistence.asm-1.0.0.jar b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.eclipse.persistence.asm-1.0.0.jar
new file mode 100644
index 0000000..3b9a810
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.eclipse.persistence.asm-1.0.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.eclipse.persistence.jpa-1.0.0.jar b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.eclipse.persistence.jpa-1.0.0.jar
new file mode 100644
index 0000000..1508f97
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.eclipse.persistence.jpa-1.0.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.h2-1.0.71.jar b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.h2-1.0.71.jar
new file mode 100644
index 0000000..41dc982
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/com.springsource.org.h2-1.0.71.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/formtags-shared-services-service-2.0.1.BUILD-20100413113234.jar b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/formtags-shared-services-service-2.0.1.BUILD-20100413113234.jar
new file mode 100644
index 0000000..5ed2f3b
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/bundles/formtags-shared-services-service-2.0.1.BUILD-20100413113234.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/configadminservice.war b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/configadminservice.war
new file mode 100644
index 0000000..4593ad2
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/configadminservice.war
Binary files differ
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/keystore b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/keystore
new file mode 100644
index 0000000..9684caa
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/keystore
Binary files differ
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel.properties b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel.properties
new file mode 100644
index 0000000..bbe21d0
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel.properties
@@ -0,0 +1,12 @@
+########################
+# Deployer Configuration
+########################
+# Note: use 0 to disable deployment timeouts
+deployer.timeout=			0
+deployer.pickupDirectory=	pickup
+
+##########################
+# OSGi Shell Configuration
+##########################
+shell.enabled=				true
+shell.port=					2401
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel1.properties b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel1.properties
new file mode 100644
index 0000000..45c0023
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel1.properties
@@ -0,0 +1,12 @@
+########################
+# Deployer Configuration
+########################
+# Note: use 0 to disable deployment timeouts
+deployer.timeout=			90
+deployer.pickupDirectory=	pickup
+
+##########################
+# OSGi Shell Configuration
+##########################
+shell.enabled=				true
+shell.port=					2401
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel2.properties b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel2.properties
new file mode 100644
index 0000000..58dc8a4
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel2.properties
@@ -0,0 +1,12 @@
+########################
+# Deployer Configuration
+########################
+# Note: use 0 to disable deployment timeouts
+deployer.timeout=			1000
+deployer.pickupDirectory=	pickup
+
+##########################
+# OSGi Shell Configuration
+##########################
+shell.enabled=				true
+shell.port=					2401
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel3.properties b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel3.properties
new file mode 100644
index 0000000..742febc
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel3.properties
@@ -0,0 +1,12 @@
+########################
+# Deployer Configuration
+########################
+# Note: use 0 to disable deployment timeouts
+deployer.timeout=			300
+deployer.pickupDirectory=	pickup
+
+##########################
+# OSGi Shell Configuration
+##########################
+shell.enabled=				true
+shell.port=					2402
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel4.properties b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel4.properties
new file mode 100644
index 0000000..583f871
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel4.properties
@@ -0,0 +1,12 @@
+########################
+# Deployer Configuration
+########################
+# Note: use 0 to disable deployment timeouts
+deployer.timeout=			300
+deployer.pickupDirectory=	pickup
+
+##########################
+# OSGi Shell Configuration
+##########################
+shell.enabled=				true
+shell.port=					2403
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel5.properties b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel5.properties
new file mode 100644
index 0000000..7cae5e8
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.kernel5.properties
@@ -0,0 +1,12 @@
+########################
+# Deployer Configuration
+########################
+# Note: use 0 to disable deployment timeouts
+deployer.timeout=			300
+deployer.pickupDirectory=	pickup
+
+##########################
+# OSGi Shell Configuration
+##########################
+shell.enabled=				true
+shell.port=					2404
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.repository.properties b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.repository.properties
new file mode 100644
index 0000000..66c38e9
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.repository.properties
@@ -0,0 +1,13 @@
+ext.type=external
+ext.searchPattern=repository/ext/{artifact}
+
+usr.type=watched
+usr.watchDirectory=repository/usr
+
+remote-repo.type=remote
+remote-repo.uri=http://localhost:8080/org.eclipse.virgo.apps.repository/hosted-repository
+remote-repo.indexRefreshInterval=1
+
+chain=ext,usr,remote-repo
+
+
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.repository1.properties b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.repository1.properties
new file mode 100644
index 0000000..8b2c1c8
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/org.eclipse.virgo.repository1.properties
@@ -0,0 +1,13 @@
+ext.type=external
+ext.searchPattern=repository/ext/{artifact}
+
+usr.type=watched
+usr.watchDirectory=repository/usr
+
+remote-repo.type=remote
+remote-repo.uri=http://localhost:8084/org.eclipse.virgo.apps.repository/hosted-repository
+remote-repo.indexRefreshInterval=1
+
+chain=ext,usr,remote-repo
+
+
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/parreferencedplan.plan b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/parreferencedplan.plan
new file mode 100644
index 0000000..f569eaa
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/parreferencedplan.plan
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="parreferenced.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="appA123" version="[1.0.0,2.0)"/>
+ 
+</plan>
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/tomcat-server.xml b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/tomcat-server.xml
new file mode 100644
index 0000000..5bb440b
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/tomcat-server.xml
@@ -0,0 +1,56 @@
+<?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="8006" shutdown="SHUTDOWN">
+
+	<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
+	<Listener className="org.apache.catalina.core.JasperListener" />
+	<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
+	<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
+
+	<Listener className="org.eclipse.virgo.web.tomcat.ServerLifecycleLoggingListener"/>
+
+	<Service name="Catalina">
+		<Connector port="8081" protocol="HTTP/1.1"
+			connectionTimeout="20000"
+			redirectPort="8444" />
+
+		<Connector port="8444" protocol="HTTP/1.1" SSLEnabled="true"
+			maxThreads="150" scheme="https" secure="true"
+			clientAuth="false" sslProtocol="TLS"
+			keystoreFile="config/keystore"
+			keystorePass="changeit"/>
+
+		<Connector port="8010" protocol="AJP/1.3" redirectPort="8444" />
+
+		<Engine name="Catalina" defaultHost="localhost">
+			<Realm className="org.apache.catalina.realm.JAASRealm" appName="dm-kernel"
+					userClassNames="org.eclipse.virgo.kernel.authentication.User"
+					roleClassNames="org.eclipse.virgo.kernel.authentication.Role"/>
+
+			<Host name="localhost"  appBase="webapps"
+					unpackWARs="true" autoDeploy="true"
+					xmlValidation="false" xmlNamespaceAware="false">
+
+				<Valve className="org.apache.catalina.valves.AccessLogValve" directory="serviceability/logs/access"
+					prefix="localhost_access_log." suffix=".txt" pattern="common" resolveHosts="false"/>
+					
+				<Valve className="org.eclipse.virgo.web.tomcat.ApplicationNameTrackingValve"/>
+			</Host>
+		</Engine>
+	</Service>
+</Server>
diff --git a/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/tomcat-server1.xml b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/tomcat-server1.xml
new file mode 100644
index 0000000..e46b1a2
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/tomcat-server1.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 port="8007" shutdown="SHUTDOWN">
+
+	<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
+	<Listener className="org.apache.catalina.core.JasperListener" />
+	<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
+	<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
+
+	<Listener className="org.eclipse.virgo.web.tomcat.ServerLifecycleLoggingListener"/>
+
+	<Service name="Catalina">
+		<Connector port="8084" protocol="HTTP/1.1"
+			connectionTimeout="20000"
+			redirectPort="8445" />
+
+		<Connector port="8445" protocol="HTTP/1.1" SSLEnabled="true"
+			maxThreads="150" scheme="https" secure="true"
+			clientAuth="false" sslProtocol="TLS"
+			keystoreFile="config/keystore"
+			keystorePass="changeit"/>
+
+		<Connector port="8011" protocol="AJP/1.3" redirectPort="8445" />
+
+		<Engine name="Catalina" defaultHost="localhost">
+			<Realm className="org.apache.catalina.realm.JAASRealm" appName="dm-kernel"
+					userClassNames="org.eclipse.virgo.kernel.authentication.User"
+					roleClassNames="org.eclipse.virgo.kernel.authentication.Role"/>
+
+			<Host name="localhost"  appBase="webapps"
+					unpackWARs="true" autoDeploy="true"
+					xmlValidation="false" xmlNamespaceAware="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/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/tomcat-server2.xml b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/tomcat-server2.xml
new file mode 100644
index 0000000..1ad31cb
--- /dev/null
+++ b/org.eclipse.virgo.server.svt.cleanstart/src/test/resources/tomcat-server2.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 port="8008" shutdown="SHUTDOWN">
+
+	<Listener className="org.apache.catalina.core.AprLifecycleListener" SSLEngine="on" />
+	<Listener className="org.apache.catalina.core.JasperListener" />
+	<Listener className="org.apache.catalina.mbeans.ServerLifecycleListener" />
+	<Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener" />
+
+	<Listener className="org.eclipse.virgo.web.tomcat.ServerLifecycleLoggingListener"/>
+
+	<Service name="Catalina">
+		<Connector port="8083" protocol="HTTP/1.1"
+			connectionTimeout="20000"
+			redirectPort="8446" />
+
+		<Connector port="8446" protocol="HTTP/1.1" SSLEnabled="true"
+			maxThreads="150" scheme="https" secure="true"
+			clientAuth="false" sslProtocol="TLS"
+			keystoreFile="config/keystore"
+			keystorePass="changeit"/>
+
+		<Connector port="8012" protocol="AJP/1.3" redirectPort="8446" />
+
+		<Engine name="Catalina" defaultHost="localhost">
+			<Realm className="org.apache.catalina.realm.JAASRealm" appName="dm-kernel"
+					userClassNames="org.eclipse.virgo.kernel.authentication.User"
+					roleClassNames="org.eclipse.virgo.kernel.authentication.Role"/>
+
+			<Host name="localhost"  appBase="webapps"
+					unpackWARs="true" autoDeploy="true"
+					xmlValidation="false" xmlNamespaceAware="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/org.eclipse.virgo.server.svt/.classpath b/org.eclipse.virgo.server.svt/.classpath
new file mode 100644
index 0000000..37512c1
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/.classpath
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/resources"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.junit/com.springsource.org.junit/4.5.0/com.springsource.org.junit-4.5.0.jar" sourcepath="/SERVER_IVY_CACHE/org.junit/com.springsource.org.junit/4.5.0/com.springsource.org.junit-sources-4.5.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.slf4j/com.springsource.slf4j.api/1.5.10/com.springsource.slf4j.api-1.5.10.jar" sourcepath="/SERVER_IVY_CACHE/org.slf4j/com.springsource.slf4j.api/1.5.10/com.springsource.slf4j.api-sources-1.5.10.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.regexp/com.springsource.org.apache.regexp/1.5.0/com.springsource.org.apache.regexp-1.5.0.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.regexp/com.springsource.org.apache.regexp/1.5.0/com.springsource.org.apache.regexp-sources-1.5.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.httpclient/3.1.0/com.springsource.org.apache.commons.httpclient-3.1.0.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.httpclient/3.1.0/com.springsource.org.apache.commons.httpclient-sources-3.1.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.w3.sac/com.springsource.org.w3c.css.sac/1.3.0/com.springsource.org.w3c.css.sac-1.3.0.jar" sourcepath="/SERVER_IVY_CACHE/org.w3.sac/com.springsource.org.w3c.css.sac/1.3.0/com.springsource.org.w3c.css.sac-sources-1.3.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.io/1.4.0/com.springsource.org.apache.commons.io-1.4.0.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.io/1.4.0/com.springsource.org.apache.commons.io-sources-1.4.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.logging/1.1.1/com.springsource.org.apache.commons.logging-1.1.1.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.logging"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.lang/2.4.0/com.springsource.org.apache.commons.lang-2.4.0.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.lang/2.4.0/com.springsource.org.apache.commons.lang-sources-2.4.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.collections/3.2.1/com.springsource.org.apache.commons.collections-3.2.1.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.collections/3.2.1/com.springsource.org.apache.commons.collections-sources-3.2.1.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/net.sourceforge.cssparser/com.springsource.com.steadystate.css/0.9.5/com.springsource.com.steadystate.css-0.9.5.jar" sourcepath="/SERVER_IVY_CACHE/net.sourceforge.cssparser/com.springsource.com.steadystate.css/0.9.5/com.springsource.com.steadystate.css-sources-0.9.5.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.slf4j/com.springsource.slf4j.nop/1.5.10/com.springsource.slf4j.nop-1.5.10.jar" sourcepath="/SERVER_IVY_CACHE/org.slf4j/com.springsource.slf4j.nop/1.5.10/com.springsource.slf4j.nop-sources-1.5.10.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.eclipse.virgo.util/org.eclipse.virgo.util.io/2.1.0.D-20100420091708/org.eclipse.virgo.util.io-2.1.0.D-20100420091708.jar" sourcepath="/SERVER_IVY_CACHE/org.eclipse.virgo.util/org.eclipse.virgo.util.io/2.1.0.D-20100420091708/org.eclipse.virgo.util.io-sources-2.1.0.D-20100420091708.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.eclipse.virgo.util/org.eclipse.virgo.util.common/2.1.0.D-20100420091708/org.eclipse.virgo.util.common-2.1.0.D-20100420091708.jar" sourcepath="/SERVER_IVY_CACHE/org.eclipse.virgo.util/org.eclipse.virgo.util.common/2.1.0.D-20100420091708/org.eclipse.virgo.util.common-sources-2.1.0.D-20100420091708.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/com.dumbster/com.springsource.com.dumbster.smtp/1.6.0/com.springsource.com.dumbster.smtp-1.6.0.jar" sourcepath="/SERVER_IVY_CACHE/com.dumbster/com.springsource.com.dumbster.smtp/1.6.0/com.springsource.com.dumbster.smtp-sources-1.6.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/net.sourceforge.htmlunit/com.springsource.com.gargoylesoftware.htmlunit/2.6.0/com.springsource.com.gargoylesoftware.htmlunit-2.6.0.jar" sourcepath="/SERVER_IVY_CACHE/net.sourceforge.htmlunit/com.springsource.com.gargoylesoftware.htmlunit/2.6.0/com.springsource.com.gargoylesoftware.htmlunit-sources-2.6.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/net.sourceforge.jwebunit/com.springsource.net.sourceforge.jwebunit/2.2.0/com.springsource.net.sourceforge.jwebunit-2.2.0.jar" sourcepath="/SERVER_IVY_CACHE/net.sourceforge.jwebunit/com.springsource.net.sourceforge.jwebunit/2.2.0/com.springsource.net.sourceforge.jwebunit-sources-2.2.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/net.sourceforge.nekohtml/com.springsource.org.cyberneko.html/1.9.13/com.springsource.org.cyberneko.html-1.9.13.jar" sourcepath="/SERVER_IVY_CACHE/net.sourceforge.nekohtml/com.springsource.org.cyberneko.html/1.9.13/com.springsource.org.cyberneko.html-sources-1.9.13.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.xalan/com.springsource.org.apache.xalan/2.7.1/com.springsource.org.apache.xalan-2.7.1.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.xalan/com.springsource.org.apache.xalan/2.7.1/com.springsource.org.apache.xalan-sources-2.7.1.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.xerces/com.springsource.org.apache.xerces/2.9.1/com.springsource.org.apache.xerces-2.9.1.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.xerces/com.springsource.org.apache.xerces/2.9.1/com.springsource.org.apache.xerces-sources-2.9.1.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.codec/1.4.0/com.springsource.org.apache.commons.codec-1.4.0.jar" sourcepath="/SERVER_IVY_CACHE/org.apache.commons/com.springsource.org.apache.commons.codec/1.4.0/com.springsource.org.apache.commons.codec-sources-1.4.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/net.sourceforge.jwebunit/com.springsource.net.sourceforge.jwebunit.htmlunit/2.2.0/com.springsource.net.sourceforge.jwebunit.htmlunit-2.2.0.jar" sourcepath="/SERVER_IVY_CACHE/net.sourceforge.jwebunit/com.springsource.net.sourceforge.jwebunit.htmlunit/2.2.0/com.springsource.net.sourceforge.jwebunit.htmlunit-sources-2.2.0.jar"/>
+	<classpathentry kind="var" path="SERVER_IVY_CACHE/net.sourceforge.htmlunit/com.springsource.net.sourceforge.htmlunit.corejs/2.6.0/com.springsource.net.sourceforge.htmlunit.corejs-2.6.0.jar"/>
+	<classpathentry kind="output" path="target/classes"/>
+</classpath>
diff --git a/org.eclipse.virgo.server.svt/.project b/org.eclipse.virgo.server.svt/.project
new file mode 100644
index 0000000..1bfac27
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.virgo.server.svt</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.eclipse.virgo.server.svt/apps/email-shared-libs-war.war b/org.eclipse.virgo.server.svt/apps/email-shared-libs-war.war
new file mode 100644
index 0000000..3a92243
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/email-shared-libs-war.war
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/apps/email-standard-war.war b/org.eclipse.virgo.server.svt/apps/email-standard-war.war
new file mode 100644
index 0000000..5ea5914
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/email-standard-war.war
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/apps/formtags-email-par.par b/org.eclipse.virgo.server.svt/apps/formtags-email-par.par
new file mode 100644
index 0000000..60e3a2c
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/formtags-email-par.par
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/apps/formtags-par-2.0.1.BUILD-20100413113234.par b/org.eclipse.virgo.server.svt/apps/formtags-par-2.0.1.BUILD-20100413113234.par
new file mode 100644
index 0000000..dcc860c
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/formtags-par-2.0.1.BUILD-20100413113234.par
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/apps/formtags-shared-libs-2.0.1.BUILD-20100413113234.war b/org.eclipse.virgo.server.svt/apps/formtags-shared-libs-2.0.1.BUILD-20100413113234.war
new file mode 100644
index 0000000..22b4228
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/formtags-shared-libs-2.0.1.BUILD-20100413113234.war
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/apps/formtags-shared-services-service-2.0.1.BUILD-20100413113234.jar b/org.eclipse.virgo.server.svt/apps/formtags-shared-services-service-2.0.1.BUILD-20100413113234.jar
new file mode 100644
index 0000000..5ed2f3b
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/formtags-shared-services-service-2.0.1.BUILD-20100413113234.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/apps/formtags-shared-services-war-2.0.1.BUILD-20100413113234.war b/org.eclipse.virgo.server.svt/apps/formtags-shared-services-war-2.0.1.BUILD-20100413113234.war
new file mode 100644
index 0000000..e2f2c38
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/formtags-shared-services-war-2.0.1.BUILD-20100413113234.war
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/apps/formtags-war-2.0.1.BUILD-20100413113234.war b/org.eclipse.virgo.server.svt/apps/formtags-war-2.0.1.BUILD-20100413113234.war
new file mode 100644
index 0000000..ff76d5a
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/formtags-war-2.0.1.BUILD-20100413113234.war
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/apps/greenpages-solution-2.0.1.SNAPSHOT.par b/org.eclipse.virgo.server.svt/apps/greenpages-solution-2.0.1.SNAPSHOT.par
new file mode 100644
index 0000000..c660123
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/greenpages-solution-2.0.1.SNAPSHOT.par
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/apps/hello.domain.jar b/org.eclipse.virgo.server.svt/apps/hello.domain.jar
new file mode 100644
index 0000000..097a95c
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/hello.domain.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/apps/hello.service.api.jar b/org.eclipse.virgo.server.svt/apps/hello.service.api.jar
new file mode 100644
index 0000000..55d136d
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/hello.service.api.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/apps/hello.service.impl-en.jar b/org.eclipse.virgo.server.svt/apps/hello.service.impl-en.jar
new file mode 100644
index 0000000..6bbfdeb
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/hello.service.impl-en.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/apps/hello_war_shared_services.war b/org.eclipse.virgo.server.svt/apps/hello_war_shared_services.war
new file mode 100644
index 0000000..bb8b061
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/hello_war_shared_services.war
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/apps/helloworld_unscoped-1.0.0.RELEASE.plan b/org.eclipse.virgo.server.svt/apps/helloworld_unscoped-1.0.0.RELEASE.plan
new file mode 100644
index 0000000..33b12f8
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/helloworld_unscoped-1.0.0.RELEASE.plan
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="helloworld_unscoped.plan" version="1.0.0.RELEASE" 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="hello.domain" version="0"/>
+    <artifact type="bundle" name="hello.service.api" version="0"/>
+    <artifact type="bundle" name="hello.service.impl_en" version="0"/>
+  
+</plan>
diff --git a/org.eclipse.virgo.server.svt/apps/org.springframework.showcase.formtags-1.5.0.RELEASE.plan b/org.eclipse.virgo.server.svt/apps/org.springframework.showcase.formtags-1.5.0.RELEASE.plan
new file mode 100644
index 0000000..7ca2ec3
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/org.springframework.showcase.formtags-1.5.0.RELEASE.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="org.springframework.showcase.formtags.plan" version="1.5.0.RELEASE" 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.showcase.formtags.domain_par" version="[1.5.0.RELEASE,2.0)"/>
+    <artifact type="bundle" name="org.springframework.showcase.formtags.service_par" version="[1.5.0.RELEASE,2.0)"/>
+    <artifact type="bundle" name="org.springframework.showcase.formtags.web_par" version="[1.5.0.RELEASE,2.0)"/>
+</plan>
diff --git a/org.eclipse.virgo.server.svt/apps/per-app-logging.war b/org.eclipse.virgo.server.svt/apps/per-app-logging.war
new file mode 100644
index 0000000..b9190d9
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/per-app-logging.war
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/apps/servlet2.4-war.war b/org.eclipse.virgo.server.svt/apps/servlet2.4-war.war
new file mode 100644
index 0000000..d2460e4
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/servlet2.4-war.war
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/apps/servlet2.5-war.war b/org.eclipse.virgo.server.svt/apps/servlet2.5-war.war
new file mode 100644
index 0000000..6cdf968
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/servlet2.5-war.war
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/apps/wicket-phonebook.war b/org.eclipse.virgo.server.svt/apps/wicket-phonebook.war
new file mode 100644
index 0000000..fb2fa31
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/apps/wicket-phonebook.war
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/build.xml b/org.eclipse.virgo.server.svt/build.xml
new file mode 100644
index 0000000..e09a40b
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/build.xml
@@ -0,0 +1,109 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project name="org.eclipse.virgo.server.svt" xmlns:ivy="antlib:org.apache.ivy.ant" xmlns:maven="antlib:org.apache.maven.artifact.ant">
+	
+	<property name="ivy.cache.dir" value="${basedir}/../ivy-cache" />
+	<property name="integration.repo.dir" value="${basedir}/../integration-repo"/>
+	<property name="download.dir" value="${basedir}/target/bundles"/>
+
+	<property file="${basedir}/../build.properties"/>
+	<property file="${basedir}/../build.versions"/>
+	<import file="${basedir}/../virgo-build/standard/default.xml"/>
+	<import file="${basedir}/../build-svt/test-package.xml"/>
+
+	<property name="bundles.dir" value="${basedir}/bundles"/>
+	<property name="libraries.dir" value="${basedir}/libraries"/>
+	<property name="greenpagesdb.dir" value="${basedir}/../org.eclipse.virgo.server.svt/greenpages-db"/>
+	<property name="svt.cleanstart.dir" value="${basedir}/../org.eclipse.virgo.server.svt.cleanstart"/>
+	
+	<target name="maven.init" depends="ivy.init">
+		<ivy:cachepath resolveId="maven.ant.tasks.classpath" pathid="maven.ant.tasks.classpath"
+				organisation="org.apache.maven" module="com.springsource.org.apache.maven.ant"
+				revision="${org.apache.maven.ant.version}" conf="runtime" type="jar" inline="true" log="download-only"/>
+		<taskdef resource="org/apache/maven/artifact/ant/antlib.xml" uri="antlib:org.apache.maven.artifact.ant"
+				classpathref="maven.ant.tasks.classpath"/>
+		<maven:install-provider groupId="org.springframework.build.aws" artifactId="org.springframework.build.aws.maven"
+				version="${org.springframework.build.aws.maven.version}"/>
+	</target>
+	   
+	<target name="maven.download" depends="maven.init">
+	    <delete dir="${download.dir}" quiet="true"/>
+	    <mkdir dir="${download.dir}"/>
+	    
+	    <maven:dependencies filesetId="maven.fileset" versionsId="maven.versions">
+	        <dependency groupId="org.apache.struts" artifactId="struts2-mailreader" version="2.1.8" type="war" scope="compile" />
+	        <dependency groupId="org.wicketstuff" artifactId="phonebook" version="1.4.8" type="war" scope="compile" />
+	        <remoteRepository id="maven.central" url="http://repo1.maven.org/maven2" />
+	    </maven:dependencies>
+
+	    <copy todir="${download.dir}">
+	        <fileset refid="maven.fileset" />
+	        <mapper classpathref="maven.ant.tasks.classpath" classname="org.apache.maven.artifact.ant.VersionMapper" from="${maven.versions}" to="flatten" />
+	    </copy>
+	</target>
+  
+	<target name="download" depends="ivy.init,maven.download">
+		<ivy:resolve resolveId="download.deps" file="${basedir}/ivy.xml" transitive="false"/>
+		<ivy:retrieve resolveId="download.deps" pattern="${download.dir}/[artifact]-[revision].[ext]" conf="test" type="jar"/>
+	</target>
+
+    <target name="startup.pre">
+		<copy todir="${usr.dir}">
+			<fileset dir="${bundles.dir}"/>
+		</copy>
+		<copy todir="${usr.dir}">
+			<fileset dir="${libraries.dir}"/>
+		</copy>
+    <antcall target="startup.greenpages.h2db"/>
+     <sleep milliseconds="1000"/>
+    <antcall target="refresh.greenpages.h2db"/>
+   </target>
+	
+	<path id="hsqldb.classpath">
+		<fileset dir="${test.package.dir}/repository/usr">
+			<include name="com.springsource.org.hsqldb-1.8.0.9.jar" />
+		</fileset>
+	</path>
+	
+	<path id="h2db.classpath">
+		<fileset dir="${test.package.dir}/repository/usr">
+			<include name="com.springsource.org.h2-1.0.71.jar" />
+		</fileset>
+	</path>
+
+    <target name="startup.greenpages.h2db">
+	 	<java classname="org.h2.tools.Server" fork="true" spawn="true">
+			<classpath refid="h2db.classpath"/>
+		</java>
+       <fail if="start.failed" message="h2 db start up failed"/>
+    </target>
+
+  <target name="refresh.greenpages.h2db">
+	 <path id="svt.test.db">
+		<pathelement location="${greenpagesdb.dir}" />
+	  </path>
+	 <all-bundles target="setupGreenPagesDB" buildpathRef="svt.test.db">
+		<property name="server.dir" value="${test.package.dir}"/>
+	  </all-bundles>
+   </target>
+
+ <target name="test-clean-startup">
+  <antcall target="startup.clean"/>
+	 <path id="svt.test.clean">
+		<pathelement location="${svt.cleanstart.dir}" />
+	 </path>
+    <all-bundles target="startup.clean.post" buildpathRef="svt.test.clean"/>
+  <antcall target="shutdown"/>
+ </target>
+
+
+	<target name="shutdown.post">
+		<echo message="Testing warm restart"/>
+		<sleep seconds="5"/>
+		<antcall target="startup"/>
+	<!--	<antcall target="test.do"/>-->
+		<antcall target="shutdown"/>
+	<echo message="Testing clean start"/>
+	    <antcall target="test-clean-startup"/>
+    </target>
+	
+</project>
diff --git a/org.eclipse.virgo.server.svt/bundles/appA.par b/org.eclipse.virgo.server.svt/bundles/appA.par
new file mode 100644
index 0000000..6042240
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/appA.par
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.com.mysql.jdbc-5.1.6.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.com.mysql.jdbc-5.1.6.jar
new file mode 100644
index 0000000..e9a0717
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.com.mysql.jdbc-5.1.6.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.com.sun.facelets-1.1.14.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.com.sun.facelets-1.1.14.jar
new file mode 100644
index 0000000..1053e53
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.com.sun.facelets-1.1.14.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.freemarker-2.3.15.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.freemarker-2.3.15.jar
new file mode 100644
index 0000000..9bf1020
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.freemarker-2.3.15.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.javassist-3.9.0.GA.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.javassist-3.9.0.GA.jar
new file mode 100644
index 0000000..0da478b
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.javassist-3.9.0.GA.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.javax.persistence-1.0.0.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.javax.persistence-1.0.0.jar
new file mode 100644
index 0000000..9fcc5ae
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.javax.persistence-1.0.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.javax.xml.stream-1.0.1.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.javax.xml.stream-1.0.1.jar
new file mode 100644
index 0000000..ce68dd7
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.javax.xml.stream-1.0.1.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.net.sf.cglib-2.2.0.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.net.sf.cglib-2.2.0.jar
new file mode 100644
index 0000000..a4f97dc
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.net.sf.cglib-2.2.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.oracle.toplink.essentials-2.0.0.b41-beta2.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.oracle.toplink.essentials-2.0.0.b41-beta2.jar
new file mode 100644
index 0000000..b3f95b9
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.oracle.toplink.essentials-2.0.0.b41-beta2.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.aopalliance-1.0.0.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.aopalliance-1.0.0.jar
new file mode 100644
index 0000000..150af80
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.aopalliance-1.0.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.beanutils-1.7.0.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.beanutils-1.7.0.jar
new file mode 100644
index 0000000..92d2173
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.beanutils-1.7.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.codec-1.3.0.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.codec-1.3.0.jar
new file mode 100644
index 0000000..c69504a
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.codec-1.3.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.collections-3.2.1.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.collections-3.2.1.jar
new file mode 100644
index 0000000..aee7281
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.collections-3.2.1.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
new file mode 100644
index 0000000..de49d6f
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.digester-1.8.0.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.digester-1.8.0.jar
new file mode 100644
index 0000000..a0dcd93
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.digester-1.8.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.discovery-0.4.0.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.discovery-0.4.0.jar
new file mode 100644
index 0000000..53d661e
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.discovery-0.4.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.lang-2.1.0.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.lang-2.1.0.jar
new file mode 100644
index 0000000..1213ff2
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.lang-2.1.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.logging-1.1.1.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.logging-1.1.1.jar
new file mode 100644
index 0000000..d5dfe76
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.logging-1.1.1.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.pool-1.3.0.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.pool-1.3.0.jar
new file mode 100644
index 0000000..715790f
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.commons.pool-1.3.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.myfaces-1.2.2.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.myfaces-1.2.2.jar
new file mode 100644
index 0000000..c3d990d
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.myfaces-1.2.2.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.myfaces.javax.faces-1.2.2.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.myfaces.javax.faces-1.2.2.jar
new file mode 100644
index 0000000..8f14dec
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.apache.myfaces.javax.faces-1.2.2.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.dom4j-1.6.1.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.dom4j-1.6.1.jar
new file mode 100644
index 0000000..f2075d0
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.dom4j-1.6.1.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.eclipse.persistence-1.0.0.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.eclipse.persistence-1.0.0.jar
new file mode 100644
index 0000000..e93073d
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.eclipse.persistence-1.0.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.eclipse.persistence.antlr-1.0.0.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.eclipse.persistence.antlr-1.0.0.jar
new file mode 100644
index 0000000..b9b3be8
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.eclipse.persistence.antlr-1.0.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.eclipse.persistence.asm-1.0.0.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.eclipse.persistence.asm-1.0.0.jar
new file mode 100644
index 0000000..39d9a54
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.eclipse.persistence.asm-1.0.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.eclipse.persistence.jpa-1.0.0.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.eclipse.persistence.jpa-1.0.0.jar
new file mode 100644
index 0000000..f92fd82
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.eclipse.persistence.jpa-1.0.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.h2-1.0.71.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.h2-1.0.71.jar
new file mode 100644
index 0000000..41dc982
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.h2-1.0.71.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.hsqldb-1.8.0.9.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.hsqldb-1.8.0.9.jar
new file mode 100644
index 0000000..b94487b
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.hsqldb-1.8.0.9.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.objectweb.asm-1.5.3.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.objectweb.asm-1.5.3.jar
new file mode 100644
index 0000000..4c70679
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.objectweb.asm-1.5.3.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.org.objectweb.asm.attrs-1.5.3.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.objectweb.asm.attrs-1.5.3.jar
new file mode 100644
index 0000000..e45c51a
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.org.objectweb.asm.attrs-1.5.3.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.slf4j.api-1.5.6.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.slf4j.api-1.5.6.jar
new file mode 100644
index 0000000..44f166d
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.slf4j.api-1.5.6.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/com.springsource.slf4j.jcl-1.5.6.jar b/org.eclipse.virgo.server.svt/bundles/com.springsource.slf4j.jcl-1.5.6.jar
new file mode 100644
index 0000000..cf87be9
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/com.springsource.slf4j.jcl-1.5.6.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/org.springframework.aop-2.5.6.A.jar b/org.eclipse.virgo.server.svt/bundles/org.springframework.aop-2.5.6.A.jar
new file mode 100644
index 0000000..7de0e61
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/org.springframework.aop-2.5.6.A.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/org.springframework.aspects-2.5.6.A.jar b/org.eclipse.virgo.server.svt/bundles/org.springframework.aspects-2.5.6.A.jar
new file mode 100644
index 0000000..16cd0d5
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/org.springframework.aspects-2.5.6.A.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/org.springframework.beans-2.5.6.A.jar b/org.eclipse.virgo.server.svt/bundles/org.springframework.beans-2.5.6.A.jar
new file mode 100644
index 0000000..aae6f1b
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/org.springframework.beans-2.5.6.A.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/org.springframework.context-2.5.6.A.jar b/org.eclipse.virgo.server.svt/bundles/org.springframework.context-2.5.6.A.jar
new file mode 100644
index 0000000..05f0233
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/org.springframework.context-2.5.6.A.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/org.springframework.context.support-2.5.6.A.jar b/org.eclipse.virgo.server.svt/bundles/org.springframework.context.support-2.5.6.A.jar
new file mode 100644
index 0000000..bbbeb39
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/org.springframework.context.support-2.5.6.A.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/org.springframework.core-2.5.6.A.jar b/org.eclipse.virgo.server.svt/bundles/org.springframework.core-2.5.6.A.jar
new file mode 100644
index 0000000..d41bd0a
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/org.springframework.core-2.5.6.A.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/org.springframework.jdbc-2.5.6.A.jar b/org.eclipse.virgo.server.svt/bundles/org.springframework.jdbc-2.5.6.A.jar
new file mode 100644
index 0000000..8e72392
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/org.springframework.jdbc-2.5.6.A.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/org.springframework.jms-2.5.6.A.jar b/org.eclipse.virgo.server.svt/bundles/org.springframework.jms-2.5.6.A.jar
new file mode 100644
index 0000000..8eb8c71
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/org.springframework.jms-2.5.6.A.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/org.springframework.orm-2.5.6.A.jar b/org.eclipse.virgo.server.svt/bundles/org.springframework.orm-2.5.6.A.jar
new file mode 100644
index 0000000..3005f17
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/org.springframework.orm-2.5.6.A.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/org.springframework.transaction-2.5.6.A.jar b/org.eclipse.virgo.server.svt/bundles/org.springframework.transaction-2.5.6.A.jar
new file mode 100644
index 0000000..68a8662
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/org.springframework.transaction-2.5.6.A.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/org.springframework.web-2.5.6.A.jar b/org.eclipse.virgo.server.svt/bundles/org.springframework.web-2.5.6.A.jar
new file mode 100644
index 0000000..ec25efb
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/org.springframework.web-2.5.6.A.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/bundles/org.springframework.web.servlet-2.5.6.A.jar b/org.eclipse.virgo.server.svt/bundles/org.springframework.web.servlet-2.5.6.A.jar
new file mode 100644
index 0000000..8646a6b
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/bundles/org.springframework.web.servlet-2.5.6.A.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/greenpages-db/build.xml b/org.eclipse.virgo.server.svt/greenpages-db/build.xml
new file mode 100644
index 0000000..1dc5008
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/greenpages-db/build.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0"?>
+
+<project name="setupGreenPagesDB" basedir="." default="all">
+	<property file="${basedir}/../../build.properties"/>
+	<import file="${basedir}/../../build-svt/test-package.xml"/>
+	
+    <property name="server.home" value="${server.dir}"/>
+	
+    <path id="h2db.classpath">
+		<fileset dir="${server.home}/repository/usr">
+			<include name="com.springsource.org.h2-1.0.71.jar" />
+		</fileset>
+	</path>
+	
+    <target name="setH2DBProperties" >
+		<property name="db.driver" value="org.h2.Driver"/>
+		<property name="db.url" value="jdbc:h2:~/greenpages-db/greenpages"/>
+		<property name="db.user" value="greenpages"/>
+		<property name="db.pw" value="pass"/>
+	</target>
+	
+    <target name="populateH2DBData"  depends="setH2DBProperties">
+		<echo message="Create tables using: ${db.driver} ${db.url}" />
+		<sql driver="${db.driver}" url="${db.url}" userid="${db.user}" password="${db.pw}" onerror="continue">
+			<classpath refid="h2db.classpath"/>
+			<transaction src="db.sql" />
+		</sql>
+	</target>
+
+    <target name="setupGreenPagesDB" depends="populateH2DBData" />
+
+</project>
diff --git a/org.eclipse.virgo.server.svt/greenpages-db/data.bat b/org.eclipse.virgo.server.svt/greenpages-db/data.bat
new file mode 100644
index 0000000..0fdc44c
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/greenpages-db/data.bat
@@ -0,0 +1,5 @@
+@echo off
+setlocal
+
+call h2
+java -cp "%H2CP%" org.h2.tools.RunScript -url jdbc:h2:tcp://localhost/~/greenpages-db/greenpages -user greenpages -password pass -script db.sql
diff --git a/org.eclipse.virgo.server.svt/greenpages-db/data.sh b/org.eclipse.virgo.server.svt/greenpages-db/data.sh
new file mode 100755
index 0000000..f2cc337
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/greenpages-db/data.sh
@@ -0,0 +1,4 @@
+#!/usr/bin/env bash
+. ./h2.sh
+
+java -cp $CLASSPATH org.h2.tools.RunScript -url jdbc:h2:~/greenpages-db/greenpages -user greenpages -password pass -script ./db.sql
diff --git a/org.eclipse.virgo.server.svt/greenpages-db/db.sql b/org.eclipse.virgo.server.svt/greenpages-db/db.sql
new file mode 100644
index 0000000..394c60c
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/greenpages-db/db.sql
@@ -0,0 +1,17 @@
+DROP TABLE IF EXISTS LISTING;
+
+CREATE TABLE LISTING (
+	LISTING_NUMBER INT PRIMARY KEY,
+	FIRST_NAME VARCHAR(255),
+	LAST_NAME VARCHAR(255),
+	EMAIL_ADDRESS VARCHAR(255)
+);
+
+INSERT INTO LISTING VALUES(1, 'Rod', 'Johnson', 'rod.johnson@springsource.com');
+INSERT INTO LISTING VALUES(2, 'Rob', 'Harrop', 'rob.harrop@springsource.com');
+INSERT INTO LISTING VALUES(3, 'Glyn', 'Normington', 'glyn.normington@springsource.com');
+INSERT INTO LISTING VALUES(4, 'Andy', 'Wilkinson', 'andy.wilkinson@springsource.com');
+INSERT INTO LISTING VALUES(5, 'Ben', 'Hale', 'ben.hale@springsource.com');
+INSERT INTO LISTING VALUES(6, 'Chris', 'Frost', 'chris.frost@springsource.com');
+INSERT INTO LISTING VALUES(7, 'Steve', 'Powell', 'steve.powell@springsource.com');
+INSERT INTO LISTING VALUES(8, 'Christian', 'Dupuis', 'christian.dupuis@springsource.com');
diff --git a/org.eclipse.virgo.server.svt/greenpages-db/h2.bat b/org.eclipse.virgo.server.svt/greenpages-db/h2.bat
new file mode 100644
index 0000000..e79da93
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/greenpages-db/h2.bat
@@ -0,0 +1,9 @@
+for /r "%HOMEPATH%\.m2" %%X in (*h2*.jar) do (set H2CP=%H2CP%;%%X)
+
+if "%H2CP%" == "" (goto h2NotFound) else goto end
+
+:h2NotFound
+echo Cannot find H2 jars in .m2 Maven repository
+exit /b -1s
+
+:end
diff --git a/org.eclipse.virgo.server.svt/greenpages-db/h2.sh b/org.eclipse.virgo.server.svt/greenpages-db/h2.sh
new file mode 100755
index 0000000..4ffc5eb
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/greenpages-db/h2.sh
@@ -0,0 +1,13 @@
+#!/usr/bin/env bash
+JARS=`find $HOME/.m2 -iname "com.springsource.org.h2*"`
+
+for JAR in $JARS
+do
+	CLASSPATH=$CLASSPATH:$JAR
+done
+
+if [ -z $CLASSPATH ]
+then
+	echo "Cannot find H2 jars in .m2 Maven repository"
+	exit -1
+fi
diff --git a/org.eclipse.virgo.server.svt/greenpages-db/run.bat b/org.eclipse.virgo.server.svt/greenpages-db/run.bat
new file mode 100644
index 0000000..6c67dd9
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/greenpages-db/run.bat
@@ -0,0 +1,5 @@
+@echo off
+setlocal
+
+call h2
+start java -cp "%H2CP%" org.h2.tools.Server
diff --git a/org.eclipse.virgo.server.svt/greenpages-db/run.sh b/org.eclipse.virgo.server.svt/greenpages-db/run.sh
new file mode 100755
index 0000000..c3403e4
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/greenpages-db/run.sh
@@ -0,0 +1,5 @@
+#!/usr/bin/env bash
+. ./h2.sh
+
+java -cp $CLASSPATH org.h2.tools.Server
+
diff --git a/org.eclipse.virgo.server.svt/ivy.xml b/org.eclipse.virgo.server.svt/ivy.xml
new file mode 100644
index 0000000..78963f3
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/ivy.xml
@@ -0,0 +1,36 @@
+<?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.svt" 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.util" name="org.eclipse.virgo.util.io" rev="${org.eclipse.virgo.util}" conf="test->runtime"/>
+	
+		<dependency org="org.junit" name="com.springsource.org.junit" rev="${org.junit}" conf="test->runtime"/>
+		<dependency org="net.sourceforge.jwebunit" name="com.springsource.net.sourceforge.jwebunit" rev="${net.sourceforge.jwebunit}" conf="test->runtime"/>
+		<dependency org="net.sourceforge.jwebunit" name="com.springsource.net.sourceforge.jwebunit.htmlunit" rev="${net.sourceforge.jwebunit}" conf="test->runtime"/>
+
+		<dependency org="org.slf4j" name="com.springsource.slf4j.api" rev="${org.slf4j}" conf="test->runtime"/>
+		<dependency org="org.slf4j" name="com.springsource.slf4j.nop" rev="${org.slf4j}" conf="runtime->runtime"/>
+		<dependency org="com.dumbster" name="com.springsource.com.dumbster.smtp" rev="${com.dumbster}" conf="test->runtime"/>
+		
+		<!-- Dependencies which cannot be checked in to Eclipse repositories because of their licenses, e.g. LGPL. -->
+		<dependency org="org.hibernate" name="com.springsource.org.hibernate" rev="${org.hibernate}" conf="test->runtime"/>
+
+		<exclude org="org.slf4j" module="com.springsource.slf4j.org.apache.log4j" />
+	</dependencies>
+
+</ivy-module>
diff --git a/org.eclipse.virgo.server.svt/libraries/oracle.toplink.essentials-library-2.0.0.b41-beta2.libd b/org.eclipse.virgo.server.svt/libraries/oracle.toplink.essentials-library-2.0.0.b41-beta2.libd
new file mode 100644
index 0000000..d4b3b92
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/libraries/oracle.toplink.essentials-library-2.0.0.b41-beta2.libd
@@ -0,0 +1,6 @@
+Library-SymbolicName: oracle.toplink.essentials
+Library-Version: 2.0.0.b41-beta2
+Library-Name: TopLink Essentials
+Import-Bundle: 
+ com.springsource.oracle.toplink.essentials;version="[2.0.0.b41-beta2, 2.0.0.b41-beta2]",
+ com.springsource.javax.persistence;version="[1.0.0, 1.0.0]"
diff --git a/org.eclipse.virgo.server.svt/libraries/org.apache.myfaces-library-1.2.2.libd b/org.eclipse.virgo.server.svt/libraries/org.apache.myfaces-library-1.2.2.libd
new file mode 100644
index 0000000..6a7db90
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/libraries/org.apache.myfaces-library-1.2.2.libd
@@ -0,0 +1,6 @@
+Library-SymbolicName: org.apache.myfaces
+Library-Version: 1.2.2
+Library-Name: Apache MyFaces Java Server Faces Implementation
+Import-Bundle: 
+ com.springsource.org.apache.myfaces;version="[1.2.2, 1.2.2]",
+ com.springsource.org.apache.myfaces.javax.faces;version="[1.2.2, 1.2.2]"
diff --git a/org.eclipse.virgo.server.svt/libraries/org.hibernate.ejb-library-3.3.2.GA.libd b/org.eclipse.virgo.server.svt/libraries/org.hibernate.ejb-library-3.3.2.GA.libd
new file mode 100644
index 0000000..94cc6be
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/libraries/org.hibernate.ejb-library-3.3.2.GA.libd
@@ -0,0 +1,9 @@
+Library-SymbolicName: org.hibernate.ejb
+Library-Version: 3.3.2.GA
+Library-Name: Hibernate JPA
+Import-Bundle: 
+ com.springsource.org.hibernate;version="[3.2.6.ga, 3.2.6.ga]",
+ com.springsource.org.hibernate.annotations;version="[3.3.1.ga, 3.3.1.ga]",
+ com.springsource.org.hibernate.annotations.common;version="[3.3.0.ga, 3.3.0.ga]",
+ com.springsource.org.hibernate.ejb;version="[3.3.2.GA, 3.3.2.GA]",
+ com.springsource.javax.persistence;version="[1.0.0, 1.0.0]"
diff --git a/org.eclipse.virgo.server.svt/libraries/org.springframework.spring-library-2.5.6.A.libd b/org.eclipse.virgo.server.svt/libraries/org.springframework.spring-library-2.5.6.A.libd
new file mode 100644
index 0000000..9875801
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/libraries/org.springframework.spring-library-2.5.6.A.libd
@@ -0,0 +1,17 @@
+Library-SymbolicName: org.springframework.spring
+Library-Version: 2.5.6.A
+Library-Name: Spring Framework
+Import-Bundle: 
+ org.springframework.aop;version="[2.5.6.A, 2.5.6.A]",
+ org.springframework.aspects;version="[2.5.6.A, 2.5.6.A]";import-scope:=application,
+ org.springframework.beans;version="[2.5.6.A, 2.5.6.A]",
+ org.springframework.context;version="[2.5.6.A, 2.5.6.A]",
+ org.springframework.context.support;version="[2.5.6.A, 2.5.6.A]",
+ org.springframework.core;version="[2.5.6.A, 2.5.6.A]",
+ org.springframework.jdbc;version="[2.5.6.A, 2.5.6.A]",
+ org.springframework.jms;version="[2.5.6.A, 2.5.6.A]",
+ org.springframework.orm;version="[2.5.6.A, 2.5.6.A]",
+ org.springframework.transaction;version="[2.5.6.A, 2.5.6.A]",
+ org.springframework.web;version="[2.5.6.A, 2.5.6.A]",
+ org.springframework.web.servlet;version="[2.5.6.A, 2.5.6.A]",
+ com.springsource.org.aopalliance;version="[1.0.0, 1.0.0]"
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/AbstractWebTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/AbstractWebTests.java
new file mode 100644
index 0000000..a11cac5
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/AbstractWebTests.java
@@ -0,0 +1,551 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.server.svt;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.management.ManagementFactory;
+import java.lang.management.OperatingSystemMXBean;
+import java.lang.management.RuntimeMXBean;
+import java.text.DateFormat;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.management.MBeanServerConnection;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.remote.JMXConnector;
+import javax.management.remote.JMXConnectorFactory;
+import javax.management.remote.JMXServiceURL;
+
+import net.sourceforge.jwebunit.html.Cell;
+import net.sourceforge.jwebunit.html.Row;
+import net.sourceforge.jwebunit.junit.WebTester;
+import net.sourceforge.jwebunit.util.TestContext;
+
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+
+public abstract class AbstractWebTests {
+	protected static final String URL = "http://localhost:8080/admin/web/artifact/overview.htm";
+	protected static final String USER = "admin";
+	protected static final String PASSWORD = "springsource";
+
+	static final String TXT_FILE_SUFFIX = ".txt";
+	static final String TXT_FILE_PREFIX = "summary";
+
+	private static String pickupDir = null;
+	private static String repositoryUsrDir = null;
+	private static String repositoryExtDir = null;
+	private static String repoPropertiesDir = null;
+	private static String hostedRepoPropertiesDir = null;
+	private static String kernelPropertiesDir = null;
+
+	private static String workDir = null;
+	private static String serviceabilityDir = null;
+	private static String versionFile = null;
+
+	private static MBeanServerConnection connection = null;
+	private static final String JMXURL = "service:jmx:rmi:///jndi/rmi://localhost:9875/jmxrmi";
+	private static final String KEYSTORE = "/config/keystore";
+	private static final String KEYPASSWORD = "changeit";
+	public static final long HALF_SECOND = 500;
+	public static final long TWO_MINUTES = 120 * 1000;
+
+	private final WebTester tester = new WebTester();
+
+	protected final TestContext getTestContext() {
+		return this.tester.getTestContext();
+	}
+
+	protected final WebTester getTester() {
+		return this.tester;
+	}
+
+	@SuppressWarnings("unchecked")
+	protected void assertTableContent(String tableId, Object[][] expectedRows) {
+		ArrayList<Row> actualRows = getTester().getTable(tableId).getRows();
+
+		boolean tableMatched = true;
+		for (Object[] expectedRow : expectedRows) {
+			Object bsn = expectedRow[0];
+			boolean rowMatched = false;
+			for (Row actualRow : actualRows) {
+				Cell[] cells = ((ArrayList<Cell>) actualRow.getCells())
+						.toArray(new Cell[actualRow.getCellCount()]);
+				if (bsn.equals(cells[0].getValue())) {
+					rowMatched = rowEqual(expectedRow, cells);
+
+					break;
+				}
+			}
+			tableMatched &= rowMatched;
+
+		}
+		assertTrue("Table did not match", tableMatched);
+	}
+
+	protected static void copyApplicationsToPickup(String pickupDir,
+			String appsDir, String[] applicationNames) throws IOException,
+			InterruptedException {
+		for (String applicationName : applicationNames) {
+
+			FileCopyUtils.copy(new File(appsDir, applicationName), new File(
+					pickupDir, applicationName));
+			Thread.sleep(1500);
+		}
+	}
+
+	protected static void copyDependentBundlesToUsrRepository(String usrDir,
+			String bundlesDir, String[] bundleNames) throws IOException {
+		for (String bundleName : bundleNames) {
+			FileCopyUtils.copy(new File(bundlesDir, bundleName), new File(
+					usrDir, bundleName));
+		}
+	}
+
+	protected static void deleteApplicationsFromPickup(String pickupDir,
+			String[] applicationNames) throws IOException {
+		for (String applicationName : applicationNames) {
+			new File(pickupDir, applicationName).delete();
+		}
+	}
+
+	protected static String getPickupDir() throws IOException {
+		if (pickupDir == null) {
+			File testExpanded = new File("./target/test-expanded/");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()) {
+					pickupDir = new File(candidate, "pickup")
+							.getCanonicalPath();
+					break;
+				}
+			}
+		}
+		return pickupDir;
+	}
+
+	protected static String getWorkDir() throws IOException {
+		if (workDir == null) {
+			File testExpanded = new File("./target/test-expanded/");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()) {
+					workDir = new File(candidate, "work").getCanonicalPath();
+					break;
+				}
+			}
+		}
+		return workDir;
+	}
+
+	protected static String getServiceabilityDir() throws IOException {
+		if (serviceabilityDir == null) {
+			File testExpanded = new File("./target/test-expanded/");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()) {
+					serviceabilityDir = new File(candidate, "serviceability")
+							.getCanonicalPath();
+					break;
+				}
+			}
+		}
+		return serviceabilityDir;
+	}
+
+	protected static String getRepositoryUsrDir() throws IOException {
+		if (repositoryUsrDir == null) {
+			File testExpanded = new File("./target/test-expanded/");
+			for (File mainDir : testExpanded.listFiles()) {
+				if (mainDir.isDirectory()) {
+					File repositoryDir = new File(mainDir, "repository")
+							.getCanonicalFile();
+					repositoryUsrDir = new File(repositoryDir, "usr")
+							.getCanonicalPath();
+				}
+			}
+		}
+		return repositoryUsrDir;
+	}
+
+	protected static String getRepositoryExtDir() throws IOException {
+		if (repositoryExtDir == null) {
+			File testExpanded = new File("./target/test-expanded/");
+			for (File mainDir : testExpanded.listFiles()) {
+				if (mainDir.isDirectory()) {
+					File repositoryDir = new File(mainDir, "repository")
+							.getCanonicalFile();
+					repositoryExtDir = new File(repositoryDir, "ext")
+							.getCanonicalPath();
+				}
+			}
+		}
+		return repositoryExtDir;
+	}
+
+	protected static String getHostedRepoDir() throws IOException {
+
+		/*
+		 * File hostedDir = null;
+		 * 
+		 * File testExpanded = new File("./target/test-expanded/"); for (File
+		 * mainDir : testExpanded.listFiles()) { if (mainDir.isDirectory()) {
+		 * File repositoryDir = new File(mainDir, "repository")
+		 * .getCanonicalFile();
+		 * 
+		 * hostedDir = new File(repositoryDir, "hosted"); hostedDir.mkdir();
+		 * 
+		 * } } return hostedDir.getCanonicalPath();
+		 */
+
+		File hostedDir = new File(System.getProperty("user.home"), "hosted");
+		if (!hostedDir.exists()) {
+			hostedDir.mkdir();
+		}
+		return hostedDir.getCanonicalPath();
+	}
+
+	protected static String getRepositoryPropertiesDir() throws IOException {
+		if (repoPropertiesDir == null) {
+			File testExpanded = new File(
+					"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()) {
+					File configDir = new File(candidate, "config");
+					if (configDir.isDirectory()) {
+						repoPropertiesDir = new File(configDir,
+								"org.eclipse.virgo.repository.properties")
+								.getCanonicalPath();
+
+					}
+
+				}
+			}
+		}
+
+		return repoPropertiesDir;
+	}
+
+	protected static String getConfigDir() throws IOException {
+		File configDir = null;
+		if (configDir == null) {
+			File testExpanded = new File(
+					"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()) {
+					configDir = new File(candidate, "config");
+
+				}
+			}
+		}
+
+		return configDir.getCanonicalPath();
+	}
+
+	protected static String getHostedRepositoryPropertiesDir()
+			throws IOException {
+		if (hostedRepoPropertiesDir == null) {
+			File testExpanded = new File(
+					"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()) {
+					File configDir = new File(candidate, "config");
+					if (configDir.isDirectory()) {
+						hostedRepoPropertiesDir = new File(configDir,
+								"org.eclipse.virgo.apps.repository.properties")
+								.getCanonicalPath();
+
+					}
+
+				}
+			}
+		}
+
+		return hostedRepoPropertiesDir;
+	}
+
+	protected static String getKernelPropertiesDir() throws IOException {
+
+		if (kernelPropertiesDir == null) {
+			File testExpanded = new File(
+					"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()) {
+					File configDir = new File(candidate, "config");
+					if (configDir.isDirectory()) {
+						kernelPropertiesDir = new File(configDir,
+								"org.eclipse.virgo.kernel.properties")
+								.getCanonicalPath();
+
+					}
+
+				}
+			}
+		}
+
+		return kernelPropertiesDir;
+	}
+
+	protected static String getWatchedRepoDir() throws IOException {
+		File watchedRepoDir = null;
+
+		File testExpanded = new File(
+				"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+		for (File candidate : testExpanded.listFiles()) {
+			if (candidate.isDirectory()) {
+				watchedRepoDir = new File(candidate, "watched-repo");
+				if (!watchedRepoDir.exists()) {
+					watchedRepoDir.mkdir();
+				}
+			}
+		}
+		return watchedRepoDir.getCanonicalPath();
+
+	}
+
+	protected File[] getDumpIds() throws IOException {
+
+		File[] dumpFiles = null;
+
+		File testExpanded = new File(
+				"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+		for (File candidate : testExpanded.listFiles()) {
+			if (candidate.isDirectory()) {
+				File serviceabilityDir = new File(candidate, "serviceability");
+
+				for (File serviceabilityFile : serviceabilityDir.listFiles()) {
+
+					if (serviceabilityFile.isDirectory()
+							&& serviceabilityFile.getName().equals("dump")) {
+
+						dumpFiles = serviceabilityFile.listFiles();
+
+					}
+				}
+			}
+		}
+		return dumpFiles;
+	}
+
+	protected File[] getDumpEntries(File dumpFile) throws IOException {
+
+		File[] dumpSummaries = dumpFile.listFiles();
+
+		return dumpSummaries;
+	}
+
+	protected static String getDumpDir() throws IOException {
+		File dumpDir = null;
+		File testExpanded = new File(
+				"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+		for (File candidate : testExpanded.listFiles()) {
+			if (candidate.isDirectory()) {
+				File serviceabilityDir = new File(candidate, "serviceability");
+
+				if (serviceabilityDir.isDirectory()) {
+
+					dumpDir = new File(serviceabilityDir, "dump");
+
+				}
+			}
+		}
+		return dumpDir.getCanonicalPath();
+	}
+
+	public String applyNameFormatting(File sourceFolder) {
+		String modDate = DateFormat.getDateInstance(DateFormat.MEDIUM).format(
+				sourceFolder.lastModified());
+		String modTime = DateFormat.getTimeInstance(DateFormat.MEDIUM).format(
+				sourceFolder.lastModified());
+		return String.format("%s at %s", modDate, modTime);
+	}
+
+	final FilenameFilter summaryFilenameFilter = new FilenameFilter() {
+
+		public boolean accept(File dir, String name) {
+			return name.endsWith(TXT_FILE_SUFFIX)
+					&& name.startsWith(TXT_FILE_PREFIX);
+		}
+	};
+
+	protected static String getServerVersion() throws IOException {
+
+		String version;
+		if (versionFile == null) {
+			File testExpanded = new File("./target/test-expanded/");
+			for (File candidate : testExpanded.listFiles()) {
+				if (candidate.isDirectory()) {
+					versionFile = new File(candidate, "lib/.version")
+							.getCanonicalPath();
+					break;
+				}
+			}
+		}
+
+		Properties versions = new Properties();
+		InputStream stream = null;
+		try {
+			stream = new FileInputStream(versionFile);
+			versions.load(stream);
+			version = versions.getProperty("virgo.server.version");
+			stream.close();
+		} catch (IOException e) {
+			version = "Unknown";
+			try {
+				if (stream != null) {
+					stream.close();
+				}
+			} catch (IOException e1) {
+
+			}
+		}
+		return version;
+	}
+
+	private boolean rowEqual(Object[] expected, Cell[] actual) {
+		if (expected.length != actual.length) {
+
+			return false;
+		}
+
+		for (int i = 0; i < expected.length; i++) {
+			if (!expected[i].equals(actual[i].getValue())) {
+
+				return false;
+			}
+		}
+		return true;
+	}
+
+	public String getOperatingSystem() {
+		OperatingSystemMXBean os = ManagementFactory.getOperatingSystemMXBean();
+		return String.format("%s(%s) - %s", os.getName(), os.getArch(), os
+				.getVersion());
+	}
+
+	public String getJavaVMDescription() {
+		RuntimeMXBean rt = ManagementFactory.getRuntimeMXBean();
+		return String.format("%s(%s) - %s", rt.getVmVendor(), rt.getVmName(),
+				rt.getVmVersion());
+	}
+
+	public String getJavaVersion() {
+		String vendor = System.getProperty("java.vendor");
+		String version = System.getProperty("java.version");
+		return String.format("%s - %s", vendor, version);
+	}
+
+	protected static MBeanServerConnection getMBeanServerConnection()
+			throws Exception {
+		String severDir = null;
+		String[] creds = { "admin", "springsource" };
+		Map<String, String[]> env = new HashMap<String, String[]>();
+
+		File testExpanded = new File(
+				"./../org.eclipse.virgo.server.svt/target/test-expanded/");
+		for (File mainDir : testExpanded.listFiles()) {
+			if (mainDir.isDirectory()) {
+				severDir = new File(mainDir.toURI()).getCanonicalPath();
+			}
+		}
+		env.put(JMXConnector.CREDENTIALS, creds);
+		System.setProperty("javax.net.ssl.trustStore", severDir + KEYSTORE);
+		System.setProperty("javax.net.ssl.trustStorePassword", KEYPASSWORD);
+		JMXServiceURL url = new JMXServiceURL(JMXURL);
+		connection = JMXConnectorFactory.connect(url, env)
+				.getMBeanServerConnection();
+		return connection;
+	}
+
+	protected void waitForMBeanRegister(String type, String name,
+			String version, long interval, long duration) throws Exception {
+		long startTime = System.currentTimeMillis();
+		boolean mbeanStatus = false;
+		while (System.currentTimeMillis() - startTime < duration) {
+			mbeanStatus = getMBeanServerConnection().isRegistered(
+					getObjectName(type, name, version));
+			if (mbeanStatus) {
+				return;
+			}
+			Thread.sleep(interval);
+		}
+		fail(String.format("After %d ms, artifact %s mbean Status was",
+				duration, name)
+				+ mbeanStatus);
+	}
+
+	protected void waitForMBeanDeRegister(String type, String name,
+			String version, long interval, long duration) throws Exception {
+		long startTime = System.currentTimeMillis();
+		boolean mbeanStatus = true;
+		while (System.currentTimeMillis() - startTime < duration) {
+			mbeanStatus = getMBeanServerConnection().isRegistered(
+					getObjectName(type, name, version));
+			if (!mbeanStatus) {
+				return;
+			}
+			Thread.sleep(interval);
+		}
+		fail(String.format("After %d ms, artifact %s mbean Status was",
+				duration, name)
+				+ mbeanStatus);
+	}
+
+	protected static ObjectName getObjectName(String type, String name,
+			String version) throws MalformedObjectNameException {
+		return new ObjectName(
+				String
+						.format(
+								"org.eclipse.virgo.kernel:type=Model,artifact-type=%s,name=%s,version=%s",
+								type, name, version));
+	}
+
+	protected 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);
+	}
+	
+	protected static HtmlElement getHtmlChildElement(HtmlElement htmlElement, int index) {
+		Iterable<HtmlElement> htmlChildElements = htmlElement.getAllHtmlChildElements();
+		Iterator<HtmlElement> iterator = htmlChildElements.iterator();
+
+		HtmlElement child = null;
+		for (int childIndex = 0; childIndex <= index; childIndex++) {
+			assertTrue(iterator.hasNext());
+			child = iterator.next();
+		}
+
+		return child;
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/UrlWaitLatch.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/UrlWaitLatch.java
new file mode 100644
index 0000000..da9ba25
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/UrlWaitLatch.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.server.svt;
+
+import static org.junit.Assert.fail;
+
+import java.net.ConnectException;
+
+import org.apache.commons.httpclient.HttpClient;
+import org.apache.commons.httpclient.HttpMethod;
+import org.apache.commons.httpclient.UsernamePasswordCredentials;
+import org.apache.commons.httpclient.auth.AuthScope;
+import org.apache.commons.httpclient.methods.GetMethod;
+
+public class UrlWaitLatch {
+
+	public static final long HALF_SECOND = 500;
+
+	public static final long TWO_MINUTES = 120 * 1000;
+
+	public static void waitFor(String url) {
+		waitFor(url, HALF_SECOND, TWO_MINUTES);
+	}
+
+	public static void waitFor(String url, String username, String password) {
+		waitFor(url, username, password, HALF_SECOND, TWO_MINUTES);
+	}
+
+	public static void waitFor(String url, long interval, long duration) {
+		HttpClient client = new HttpClient();
+		wait(url, client, interval, duration);
+	}
+
+	public static void waitFor(String url, String username, String password,
+			long interval, long duration) {
+		HttpClient client = new HttpClient();
+		client.getParams().setAuthenticationPreemptive(true);
+		client.getState().setCredentials(AuthScope.ANY,
+				new UsernamePasswordCredentials(username, password));
+		wait(url, client, interval, duration);
+	}
+
+	private static void wait(String url, HttpClient client, long interval,
+			long duration) {
+		HttpMethod get = new GetMethod(url);
+
+		try {
+			long startTime = System.currentTimeMillis();
+
+			int statusCode = 999;
+			while (System.currentTimeMillis() - startTime < duration) {
+				try {
+					statusCode = client.executeMethod(get);
+					if (statusCode < 400) {
+						return;
+					}
+				} catch (ConnectException e) {
+					// Swallow this and retry
+				}
+				Thread.sleep(interval);
+			}
+
+			fail(String.format("After %d ms, status code was %d", duration,
+					statusCode));
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		} finally {
+			get.releaseConnection();
+		}
+	}
+
+	public static void waitForNotExistence(String url) {
+		HttpClient client = new HttpClient();
+		waitForNotExistence(url, client, 1000, 120000);
+	}
+
+	private static void waitForNotExistence(String url, HttpClient client,
+			long interval, long duration) {
+		HttpMethod get = new GetMethod(url);
+
+		try {
+			long startTime = System.currentTimeMillis();
+
+			int statusCode = 100;
+			while (System.currentTimeMillis() - startTime < duration) {
+				try {
+					statusCode = client.executeMethod(get);
+					if (statusCode >= 400) {
+						return;
+					}
+				} catch (ConnectException e) {
+					// Swallow this and retry
+				}
+				Thread.sleep(interval);
+			}
+			fail(String.format("After %d ms, status code was %d", duration,
+					statusCode));
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		} finally {
+			get.releaseConnection();
+		}
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/AdminConsoleAppTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/AdminConsoleAppTests.java
new file mode 100644
index 0000000..18524eb
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/AdminConsoleAppTests.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.server.svt.adminconsole;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import java.io.IOException;
+import javax.management.MalformedObjectNameException;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.junit.Test;
+
+
+public class AdminConsoleAppTests extends AbstractWebTests {
+
+	@Test
+	public void adminApplicationProperties() throws Exception {
+		waitForMBeanRegister("plan", "org.eclipse.virgo.apps.admin.plan", "3.0.0", HALF_SECOND,
+				TWO_MINUTES);
+		UrlWaitLatch.waitFor("http://localhost:8080/admin");
+		assertAdminConsoleArtifactExists("plan", "org.eclipse.virgo.apps.admin.plan", "3.0.0");
+		assertAdminConsoleArtifactState("plan", "org.eclipse.virgo.apps.admin.plan", "3.0.0",
+				"ACTIVE");
+	}
+
+	private void assertAdminConsoleArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format(
+				"admin console plan artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertAdminConsoleArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format(
+				"admin console plan artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/BundleArtifactDeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/BundleArtifactDeployTests.java
new file mode 100644
index 0000000..abf02a2
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/BundleArtifactDeployTests.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.server.svt.adminconsole;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.management.MalformedObjectNameException;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class BundleArtifactDeployTests extends AbstractWebTests {
+
+	private static HtmlPage adminPage = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+	private static WebClient webClient = null;
+
+	@BeforeClass
+	public static void testContextSetup() throws Exception {
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+	}
+
+	@Test
+	public void bundleArtifactDeploy() throws Exception {
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/bundleA.jar"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/bundleA.jar");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+		waitForArtifactState("bundle","bundleA","1.0.0","ACTIVE",HALF_SECOND, TWO_MINUTES);
+		assertBundleArtifactState("bundle", "bundleA", "1.0.0", "ACTIVE");
+	}
+
+	private void assertBundleArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertBundleArtifactExists(type, name, version);
+		assertEquals(String.format(
+				"Bundle Artifact %s:%s:%s is not in state %s", type, name,
+				version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertBundleArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format("Bundle Artifact %s:%s:%s does not exist",
+				type, name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	@AfterClass
+	public static void tearDown() throws Exception {
+		Object[] params = {};
+		String[] signature = {};
+		getMBeanServerConnection().invoke(
+				getObjectName("bundle", "bundleA", "1.0.0"), "uninstall",
+				params, signature);
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/BundleArtifactRefreshTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/BundleArtifactRefreshTests.java
new file mode 100644
index 0000000..95364f9
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/BundleArtifactRefreshTests.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.server.svt.adminconsole;
+
+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.Iterator;
+import javax.management.MalformedObjectNameException;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class BundleArtifactRefreshTests extends AbstractWebTests {
+
+	private static HtmlPage adminPage = null;
+	private static WebClient webClient = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+
+	@BeforeClass
+	public static void testContextSetup() throws Exception {
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/bundleA.jar"));
+		HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/bundleA.jar");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+	}
+
+	@Test
+	public void bundleArtifactRefreshForBSN() throws Exception {
+		assertBundleArtifactBSNBeforeRefresh("bundle", "bundleA", "1.0.0");
+		assertBundleArtifactStateBeforeRefresh("bundle", "bundleA", "1.0.0",
+				"ACTIVE");
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"src/test/resources/bundleA.jar"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("src/test/resources/bundleA.jar");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("bundle");
+		assertNotNull("Bundle Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					if (adminPage
+							.getElementById("bundlebundlebundleA_Updated2.0.0") != null) {
+						adminPage.getElementById(
+								"bundlebundlebundleA_Updated2.0.0").click();
+						assertNotNull(
+								"Refresh button is not listed out in admin console",
+								adminPage.getElementById("dijit_form_Button_2"));
+						adminPage.getElementById("dijit_form_Button_2").click();
+						assertBundleArtifactBSNAfterRefresh("bundle",
+								"bundleA_Updated", "2.0.0");
+						waitForArtifactState("bundle","bundleA_Updated","2.0.0","ACTIVE",HALF_SECOND, TWO_MINUTES);
+						assertBundleArtifactStateAfterRefresh("bundle",
+								"bundleA_Updated", "2.0.0", "ACTIVE");
+					}
+
+					break;
+				}
+			}
+		}
+	}
+
+	private void assertBundleArtifactBSNAfterRefresh(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format("Bundle Artifact With BSN %s does not exist",
+				name), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertBundleArtifactStateAfterRefresh(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format(
+				"Bundle Artifact %s:%s:%s is not in state %s After Refresh",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertBundleArtifactBSNBeforeRefresh(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format("Bundle Artifact With BSN %s does not exist",
+				name), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertBundleArtifactStateBeforeRefresh(String type,
+			String name, String version, String state)
+			throws MalformedObjectNameException, IOException, Exception {
+		assertEquals(String.format(
+				"Bundle Artifact %s:%s:%s is not in state After Refresh %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	@AfterClass
+	public static void tearDown() throws Exception {
+		Object[] params = {};
+		String[] signature = {};
+		getMBeanServerConnection().invoke(
+				getObjectName("bundle", "bundleA_Updated", "2.0.0"),
+				"uninstall", params, signature);
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/BundleArtifactRenderTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/BundleArtifactRenderTests.java
new file mode 100644
index 0000000..f579abf
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/BundleArtifactRenderTests.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.server.svt.adminconsole;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class BundleArtifactRenderTests extends AbstractWebTests {
+
+	private static HtmlPage adminPage = null;
+	private static WebClient webClient = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+
+	@BeforeClass
+	public static void testContextSetup() throws IOException {
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/bundleA.jar"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/bundleA.jar");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+	}
+
+	@Test
+	public void bundleArtifactRenderInAdminConsole() throws Exception {
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("bundle");
+		assertNotNull("Bundle Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					assertBundleArtifactRender("bundle", "bundleA", "1.0.0");
+					assertBundleArtifactState("ACTIVE");
+					assertBundleArtifactDependents(
+							"com.springsource.javax.servlet", "2.5.0", "ACTIVE");
+					break;
+				}
+			}
+		}
+	}
+
+	private void assertBundleArtifactRender(String type, String name,
+			String version) throws Exception {
+		if (adminPage.getElementById("bundlebundlebundleA1.0.0") != null) {
+			assertNotNull(String.format(
+					"Bundle Artifact %s:%s:%s does not exist", type, name,
+					version), adminPage
+					.getElementById("bundlebundlebundleA1.0.0"));
+			assertTrue(String.format(
+					"Bundle Artifact %s is not rendered properly", name),
+					adminPage.getElementById("bundlebundlebundleA1.0.0")
+							.getTextContent().contains("bundleA"));
+			assertTrue(String.format(
+                "Bundle Artifact %s is not rendered properly", name),
+                adminPage.getElementById("bundlebundlebundleA1.0.0")
+                        .getTextContent().contains("1.0.0"));
+		}
+	}
+
+	private void assertBundleArtifactState(String state) throws IOException {
+		if (adminPage.getElementById("bundlebundlebundleA1.0.0") != null) {
+			assertNotNull(
+					"User installed bundle artifact is not listed out in admin console",
+					adminPage.getElementById("bundlebundlebundleA1.0.0"));
+			if (adminPage.getElementById("bundlebundlebundleA1.0.0") != null) {
+				HtmlElement bundleChildElement = adminPage
+						.getElementById("bundlebundlebundleA1.0.0");
+				Iterator<HtmlElement> subIterator = bundleChildElement
+						.getFirstChild().getAllHtmlChildElements().iterator();
+				while (subIterator.hasNext()) {
+					HtmlElement bundleChildHtmlElement = subIterator.next();
+					if (bundleChildHtmlElement.getTagName().equals("img")) {
+						bundleChildHtmlElement.click();
+						webClient
+								.waitForBackgroundJavaScriptStartingBefore(500);
+						assertTrue(
+								String
+										.format(
+												"Bundle Artifact state %s is not Exists",
+												state),
+								adminPage
+										.getElementById(
+												"bundlebundlebundleA1.0.0bundlebundleA1.0.0ACTIVE")
+										.getTextContent().contains(state));
+						assertTrue(
+								String
+										.format(
+												"Bundle Artifact %s is not showing up the User installed status",
+												"bundleA 1.0.0"),
+								adminPage
+										.getElementById(
+												"bundlebundlebundleA1.0.0bundlebundleA1.0.0user.installed")
+										.getTextContent().contains(
+												"user.installed"));
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	private void assertBundleArtifactDependents(String name, String version, String state)
+			throws IOException {
+		if (adminPage.getElementById("bundlebundlebundleA1.0.0") != null) {
+			assertNotNull(
+					String
+							.format(
+									"Bundle Dependent artifact %s is not listed out in admin console",
+									name),
+					adminPage
+							.getElementById("bundlebundlebundleA1.0.0bundlecom.springsource.javax.servlet2.5.0"));
+			if (adminPage
+					.getElementById("bundlebundlebundleA1.0.0bundlecom.springsource.javax.servlet2.5.0") != null) {
+				HtmlElement bundleChildChildElement = adminPage
+						.getElementById("bundlebundlebundleA1.0.0bundlecom.springsource.javax.servlet2.5.0");
+				Iterator<HtmlElement> subIterator = bundleChildChildElement
+						.getFirstChild().getAllHtmlChildElements().iterator();
+				while (subIterator.hasNext()) {
+					HtmlElement bundleChildChildHtmlElement = subIterator
+							.next();
+					if (bundleChildChildHtmlElement.getTagName().equals("img")) {
+						bundleChildChildHtmlElement.click();
+						webClient
+								.waitForBackgroundJavaScriptStartingBefore(500);
+						assertTrue(
+								String
+										.format(
+												"Dependent Bundle Artifact %s does not exist",
+												name),
+								adminPage
+										.getElementById(
+												"bundlebundlebundleA1.0.0bundlecom.springsource.javax.servlet2.5.0")
+										.getTextContent().contains(name));
+						assertTrue(
+                            String
+                                    .format(
+                                            "Dependent Bundle Artifact %s does not exist",
+                                            name),
+                            adminPage
+                                    .getElementById(
+                                            "bundlebundlebundleA1.0.0bundlecom.springsource.javax.servlet2.5.0")
+                                    .getTextContent().contains(version));
+						assertTrue(
+								String
+										.format(
+												"Dependent Bundle Artifact %s state %s does not exist",
+												name, state),
+								adminPage
+										.getElementById(
+												"bundlebundlebundleA1.0.0bundlecom.springsource.javax.servlet2.5.0bundlecom.springsource.javax.servlet2.5.0ACTIVE")
+										.getTextContent().contains(state));
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	@AfterClass
+	public static void tearDown() throws Exception {
+		Object[] params = {};
+		String[] signature = {};
+		getMBeanServerConnection().invoke(
+				getObjectName("bundle", "bundleA", "1.0.0"), "uninstall",
+				params, signature);
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/BundleArtifactStartAndStopTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/BundleArtifactStartAndStopTests.java
new file mode 100644
index 0000000..17430cf
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/BundleArtifactStartAndStopTests.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.server.svt.adminconsole;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+
+import javax.management.MalformedObjectNameException;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+public class BundleArtifactStartAndStopTests extends AbstractWebTests {
+	private static HtmlPage adminPage = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+	private static WebClient webClient = null;;
+
+	@BeforeClass
+	public static void testContextSetup() throws IOException {
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/bundleA.jar"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/bundleA.jar");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+	}
+
+	@Test
+	public void bundleArtifactStop() throws MalformedObjectNameException,
+			Exception {
+	adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("bundle");
+		assertNotNull("Bundle Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					HtmlElement bundleANode = adminPage
+							.getElementById("bundlebundlebundleA1.0.0");
+					if (bundleANode != null) {
+						clickBundleA(bundleANode);
+
+						HtmlElement stopButton = adminPage
+								.getElementById("dijit_form_Button_1");
+						assertNotNull(
+								"Stop button is not listed out in admin console",
+								stopButton);
+						stopButton.click();
+						waitForArtifactState("bundle", "bundleA", "1.0.0",
+								"RESOLVED", HALF_SECOND, TWO_MINUTES);
+						assertBundleArtifactState("bundle", "bundleA", "1.0.0",
+								"RESOLVED");
+					}
+					break;
+				}
+			}
+		}
+	}
+
+	private void clickBundleA(HtmlElement bundleANode) throws IOException {
+		// 1st child -> 3rd child -> 2nd child -> click
+		getHtmlChildElement(getHtmlChildElement(getHtmlChildElement(bundleANode, 0), 2), 1).click();
+	}
+
+	@Test
+	public void bundleArtifactStart() throws MalformedObjectNameException,
+			IOException, Exception {
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("bundle");
+		assertNotNull("Bundle Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					HtmlElement bundleANode = adminPage.getElementById("bundlebundlebundleA1.0.0");
+					if (bundleANode != null) {
+						clickBundleA(bundleANode);
+						
+						assertNotNull(
+								"Start button is not listed out in admin console",
+								adminPage.getElementById("dijit_form_Button_0"));
+						adminPage.getElementById("dijit_form_Button_0").click();
+						waitForArtifactState("bundle", "bundleA", "1.0.0",
+								"ACTIVE", HALF_SECOND, TWO_MINUTES);
+						assertBundleArtifactState("bundle", "bundleA", "1.0.0",
+								"ACTIVE");
+					}
+					break;
+				}
+			}
+		}
+	}
+
+	private void assertBundleArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format(
+				"Bundle Artifact %s:%s:%s is not in state %s", type, name,
+				version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	@AfterClass
+	public static void tearDown() throws Exception {
+		Object[] params = {};
+		String[] signature = {};
+		getMBeanServerConnection().invoke(
+				getObjectName("bundle", "bundleA", "1.0.0"), "uninstall",
+				params, signature);
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/BundleArtifactUninstallTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/BundleArtifactUninstallTests.java
new file mode 100644
index 0000000..941f7db
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/BundleArtifactUninstallTests.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.server.svt.adminconsole;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+
+import javax.management.MalformedObjectNameException;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class BundleArtifactUninstallTests extends AbstractWebTests {
+
+	private static HtmlPage adminPage = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+	private static WebClient webClient = null;
+
+
+	@BeforeClass
+	public static void testContextSetup() throws IOException {
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/bundleA.jar"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/bundleA.jar");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+	}
+
+
+	@Test
+	public void bundleArtifactUninstall() throws MalformedObjectNameException,
+			IOException, Exception {
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("bundle");
+		assertNotNull("Bundle Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					HtmlElement bundleANode = adminPage.getElementById("bundlebundlebundleA1.0.0");
+					if (bundleANode != null) {
+						clickBundleA(bundleANode);
+						assertNotNull(
+								"Uninstall button is not listed out in admin console",
+								adminPage.getElementById("dijit_form_Button_3"));
+						adminPage.getElementById("dijit_form_Button_3").click();
+						waitForMBeanDeRegister("bundle","bundleA","1.0.0",HALF_SECOND, TWO_MINUTES);
+						assertBundleArtifactNotExists("bundle", "bundleA", "1.0.0");
+					}
+					break;
+				}
+			}
+		}
+	}
+
+	private void assertBundleArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format("Bundle Artifact %s:%s:%s is still exist",
+				type, name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void clickBundleA(HtmlElement bundleANode) throws IOException {
+		// 1st child -> 3rd child -> 2nd child -> click
+		getHtmlChildElement(getHtmlChildElement(getHtmlChildElement(bundleANode, 0), 2), 1).click();
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ConfigurationArtifactDeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ConfigurationArtifactDeployTests.java
new file mode 100644
index 0000000..189f761
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ConfigurationArtifactDeployTests.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.server.svt.adminconsole;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import javax.management.MalformedObjectNameException;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class ConfigurationArtifactDeployTests extends AbstractWebTests {
+
+	private static HtmlPage adminPage = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+	private static WebClient webClient = null;
+
+	@BeforeClass
+	public static void testContextSetup() throws Exception {
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+	}
+
+	@Test
+	public void configurationArtifactDeploy() throws Exception {
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/foo.properties"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/foo.properties");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+		waitForArtifactState("configuration","foo","0.0.0","ACTIVE",HALF_SECOND, TWO_MINUTES);
+		assertConfigurationArtifactState("configuration", "foo", "0.0.0",
+				"ACTIVE");
+	}
+
+	private void assertConfigurationArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertConfigurationArtifactExists(type, name, version);
+		assertEquals(String.format(
+				"Configuration Artifact %s:%s:%s is not in state %s", type,
+				name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertConfigurationArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format(
+				"Configuration Artifact %s:%s:%s does not exist", type, name,
+				version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	@AfterClass
+	public static void tearDown() throws Exception {
+		Object[] params = {};
+		String[] signature = {};
+		getMBeanServerConnection().invoke(
+				getObjectName("configuration", "foo", "0.0.0"), "uninstall",
+				params, signature);
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ConfigurationArtifactRefreshTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ConfigurationArtifactRefreshTests.java
new file mode 100644
index 0000000..9ed1f75
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ConfigurationArtifactRefreshTests.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.server.svt.adminconsole;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+@Ignore("bug 353996: user region configuration properties are not visible via JMX")
+public class ConfigurationArtifactRefreshTests extends AbstractWebTests {
+
+	private static HtmlPage adminPage = null;
+	private static WebClient webClient = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+
+
+	@BeforeClass
+	public static void testContextSetup() throws Exception {
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/foo.properties"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/foo.properties");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+	}
+
+
+	@Test
+	public void configurationArtifactRefresh()
+			throws MalformedObjectNameException, IOException, Exception {
+		assertConfigurationArtifactExists("configuration", "foo", "0.0.0");
+		assertConfigurationArtifactRefresh();
+	}
+
+	private void assertConfigurationArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format(
+				"Configuration Artifact %s:%s:%s does not exist", type, name,
+				version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+		// The following no longer works. See bug 353996.
+		assertTrue(getMBeanServerConnection().getAttribute(
+				getConfigObjectName("foo"), "Properties").toString().contains(
+				"bar"));
+	}
+
+	private void assertConfigurationArtifactRefresh()
+			throws MalformedObjectNameException, IOException, Exception {
+		assertTrue(getMBeanServerConnection().getAttribute(
+				getConfigObjectName("foo"), "Properties").toString().contains(
+				"bar"));
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"src/test/resources/foo.properties"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("src/test/resources/foo.properties");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("configuration");
+		assertNotNull("Configuration Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					if (adminPage
+							.getElementById("configurationconfigurationfoo0.0.0") != null) {
+						adminPage.getElementById(
+								"configurationconfigurationfoo0.0.0").click();
+						assertNotNull(
+								"Refresh button is not listed out in admin console",
+								adminPage.getElementById("dijit_form_Button_2"));
+						adminPage.getElementById("dijit_form_Button_2").click();
+						webClient
+								.waitForBackgroundJavaScriptStartingBefore(500);
+					}
+
+					break;
+				}
+			}
+		}
+		assertTrue("Configuration Artifact Refresh is Not Successful",
+				getMBeanServerConnection().getAttribute(
+						getConfigObjectName("foo"), "Properties").toString()
+						.contains("boo"));
+	}
+
+	private ObjectName getConfigObjectName(String name)
+			throws MalformedObjectNameException {
+		return new ObjectName(String.format(
+				"org.eclipse.virgo.kernel:type=Configuration,name=%s", name));
+	}
+
+
+	@AfterClass
+	public static void tearDown() throws Exception {
+		Object[] params = {};
+		String[] signature = {};
+		getMBeanServerConnection().invoke(
+				getObjectName("configuration", "foo", "0.0.0"), "uninstall",
+				params, signature);
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ConfigurationArtifactRenderTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ConfigurationArtifactRenderTests.java
new file mode 100644
index 0000000..b0a1ebd
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ConfigurationArtifactRenderTests.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.server.svt.adminconsole;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class ConfigurationArtifactRenderTests extends AbstractWebTests {
+
+	private static HtmlPage adminPage = null;
+	private static WebClient webClient = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+
+
+	@BeforeClass
+	public static void testContextSetup() throws Exception {
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/foo.properties"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/foo.properties");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+	}
+
+
+	@Test
+	public void configurationArtifactRenderInAdminConsole() throws Exception {
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement propertiesElement = adminPage.getElementById("configuration");
+		assertNotNull("Configuration Artifacts are not Listed out Properly",
+				propertiesElement);
+		if (propertiesElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = propertiesElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement propertiesHtmlElement = iterator.next();
+				if (propertiesHtmlElement.getTagName().equals("img")) {
+					propertiesHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					assertConfigurationArtifactRender("configuration", "foo",
+							"0.0.0");
+					assertConfigurationArtifactState("foo 0.0.0", "ACTIVE");
+					break;
+				}
+			}
+		}
+	}
+
+	private void assertConfigurationArtifactRender(String type, String name,
+			String version) throws Exception {
+		if (adminPage.getElementById("configurationconfigurationfoo0.0.0") != null) {
+			assertNotNull(String.format(
+					"Configration Artifact %s:%s:%s does not exist", type,
+					name, version), adminPage
+					.getElementById("configurationconfigurationfoo0.0.0"));
+			assertTrue(String.format(
+					"Configuration Artifact %s does not render properly", name),
+					adminPage.getElementById(
+							"configurationconfigurationfoo0.0.0")
+							.getTextContent().contains("foo"));
+			assertTrue(String.format(
+                "Configuration Artifact %s does not render properly", name),
+                adminPage.getElementById(
+                        "configurationconfigurationfoo0.0.0")
+                        .getTextContent().contains("0.0.0"));
+		}
+	}
+
+	private void assertConfigurationArtifactState(String name, String state)
+			throws IOException {
+		HtmlElement propertiesChildElement = adminPage
+				.getElementById("configurationconfigurationfoo0.0.0");
+		if (propertiesChildElement != null) {
+			Iterator<HtmlElement> subIterator = propertiesChildElement
+					.getFirstChild().getAllHtmlChildElements().iterator();
+			while (subIterator.hasNext()) {
+				HtmlElement propertiesChildHtmlElement = subIterator.next();
+				if (propertiesChildHtmlElement.getTagName().equals("img")) {
+					propertiesChildHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					assertTrue(
+							String
+									.format(
+											"Configuration Artifact %s state %s is not render",
+											name, state),
+							adminPage
+									.getElementById(
+											"configurationconfigurationfoo0.0.0configurationfoo0.0.0ACTIVE")
+									.getTextContent().contains(state));
+					assertTrue(
+							String
+									.format(
+											"Configuration Artifact %s is not showing up the User installed status",
+											name),
+							adminPage
+									.getElementById(
+											"configurationconfigurationfoo0.0.0configurationfoo0.0.0user.installed")
+									.getTextContent().contains(
+											"user.installed"));
+					break;
+				}
+			}
+		}
+	}
+
+	@AfterClass
+	public static void tearDown() throws Exception {
+		Object[] params = {};
+		String[] signature = {};
+		getMBeanServerConnection().invoke(
+				getObjectName("configuration", "foo", "0.0.0"), "uninstall",
+				params, signature);
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ConfigurationArtifactStartAndStopTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ConfigurationArtifactStartAndStopTests.java
new file mode 100644
index 0000000..5e52940
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ConfigurationArtifactStartAndStopTests.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.server.svt.adminconsole;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.io.IOException;
+
+import java.util.Iterator;
+import javax.management.MalformedObjectNameException;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class ConfigurationArtifactStartAndStopTests extends AbstractWebTests {
+
+	private static HtmlPage adminPage = null;
+	private static WebClient webClient = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+
+	@BeforeClass
+	public static void testContextSetup() throws Exception {
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/foo.properties"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/foo.properties");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+	}
+
+	@Test
+	public void configurationArtifactStop()
+			throws MalformedObjectNameException, Exception {
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("configuration");
+		assertNotNull("Configuration Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					HtmlElement configNode = adminPage
+							.getElementById("configurationconfigurationfoo0.0.0");
+					if (configNode != null) {
+						clickConfig(configNode);
+						assertNotNull(
+								"Stop button is not listed out in admin console",
+								adminPage.getElementById("dijit_form_Button_1"));
+						adminPage.getElementById("dijit_form_Button_1").click();
+						waitForArtifactState("configuration","foo","0.0.0","RESOLVED",HALF_SECOND, TWO_MINUTES);
+						assertConfigurationArtifactState("configuration",
+								"foo", "0.0.0", "RESOLVED");
+					}
+					break;
+				}
+			}
+		}
+	}
+	
+	private void clickConfig(HtmlElement configNode) throws IOException {
+		// 1st child -> 3rd child -> 2nd child -> click
+		getHtmlChildElement(getHtmlChildElement(getHtmlChildElement(configNode, 0), 2), 1).click();
+	}
+
+	@Test
+	public void configurationArtifactStart()
+			throws MalformedObjectNameException, Exception {
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("configuration");
+		assertNotNull("Configuration Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					HtmlElement configNode = adminPage
+							.getElementById("configurationconfigurationfoo0.0.0");
+					if (configNode != null) {
+						clickConfig(configNode);
+						assertNotNull(
+								"Start button is not listed out in admin console",
+								adminPage.getElementById("dijit_form_Button_0"));
+						adminPage.getElementById("dijit_form_Button_0").click();
+						waitForArtifactState("configuration","foo","0.0.0","ACTIVE",HALF_SECOND, TWO_MINUTES);
+						assertConfigurationArtifactState("configuration",
+								"foo", "0.0.0", "ACTIVE");
+					}
+					break;
+				}
+			}
+		}
+	}
+
+	private void assertConfigurationArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format(
+				"Configuration Artifact %s:%s:%s is not in state %s", type,
+				name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	@AfterClass
+	public static void tearDown() throws Exception {
+		Object[] params = {};
+		String[] signature = {};
+		getMBeanServerConnection().invoke(
+				getObjectName("configuration", "foo", "0.0.0"), "uninstall",
+				params, signature);
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ConfigurationArtifactUninstallTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ConfigurationArtifactUninstallTests.java
new file mode 100644
index 0000000..82600c1
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ConfigurationArtifactUninstallTests.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.server.svt.adminconsole;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+
+import javax.management.MalformedObjectNameException;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class ConfigurationArtifactUninstallTests extends AbstractWebTests {
+
+	private static HtmlPage adminPage = null;
+	private static WebClient webClient = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+
+	@BeforeClass
+	public static void testContextSetup() throws Exception {
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/foo.properties"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/foo.properties");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+	}
+
+	@Test
+	public void configurationArtifactUninstall()
+			throws MalformedObjectNameException, Exception {
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("configuration");
+		assertNotNull("Configuration Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					HtmlElement configNode = adminPage
+							.getElementById("configurationconfigurationfoo0.0.0");
+					if (configNode != null) {
+						clickConfig(configNode);
+						assertNotNull(
+								"Uninstall button is not listed out in admin console",
+								adminPage.getElementById("dijit_form_Button_3"));
+						adminPage.getElementById("dijit_form_Button_3").click();
+						waitForMBeanDeRegister("configuration","foo","0.0.0",HALF_SECOND, TWO_MINUTES);
+						assertConfigurationArtifactNotExists("configuration",
+								"foo", "0.0.0");
+					}
+					break;
+				}
+			}
+		}
+	}
+
+	private void assertConfigurationArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format(
+				"Configuration Artifact %s:%s:%s is still exist", type, name,
+				version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+	
+	private void clickConfig(HtmlElement configNode) throws IOException {
+		// 1st child -> 3rd child -> 2nd child -> click
+		getHtmlChildElement(getHtmlChildElement(getHtmlChildElement(configNode, 0), 2), 1).click();
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ParArtifactDeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ParArtifactDeployTests.java
new file mode 100644
index 0000000..b12af8f
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ParArtifactDeployTests.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.server.svt.adminconsole;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class ParArtifactDeployTests extends AbstractWebTests {
+
+	private static HtmlPage adminPage = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+	private static WebClient webClient = null;
+
+	@BeforeClass
+	public static void testContextSetup() throws Exception {
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+	}
+
+	@Test
+	public void parArtifactDeploy() throws Exception {
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/appA.par"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/appA.par");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+		waitForArtifactState("par","appA","1.0.0","ACTIVE",HALF_SECOND, TWO_MINUTES);
+		assertParArtifactState("par", "appA", "1.0.0", "ACTIVE");
+		assertParArtifactDependents("bundle", "bundleA", "1.0.0");
+		assertParArtifactDependents("bundle", "bundleB", "1.0.0");
+		assertParArtifactDependents("configuration", "foo", "0.0.0");
+		assertParArtifactDependents("bundle", "appA-synthetic.context", "1.0.0");
+	}
+
+	private void assertParArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertParArtifactExists(type, name, version);
+		assertEquals(String.format("Par Artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertParArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format("Par Artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertParArtifactDependents(String type, String name,
+			String version) throws MalformedObjectNameException, IOException,
+			Exception {
+		ObjectName[] objectNameList = (ObjectName[]) getMBeanServerConnection()
+				.getAttribute(getObjectName("par", "appA", "1.0.0"),
+						"Dependents");
+		for (ObjectName objectName : objectNameList) {
+			assertTrue(String.format(
+					"Par Dependent Artifact %s:%s:%s does not exist", type,
+					name, version), getMBeanServerConnection().isRegistered(
+					objectName));
+		}
+	}
+
+	@AfterClass
+	public static void tearDown() throws Exception {
+		Object[] params = {};
+		String[] signature = {};
+		getMBeanServerConnection().invoke(
+				getObjectName("par", "appA", "1.0.0"), "uninstall", params,
+				signature);
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ParArtifactRefreshTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ParArtifactRefreshTests.java
new file mode 100644
index 0000000..97dec9f
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ParArtifactRefreshTests.java
@@ -0,0 +1,157 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.server.svt.adminconsole;
+
+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.Iterator;
+
+import javax.management.MalformedObjectNameException;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class ParArtifactRefreshTests extends AbstractWebTests {
+	private static HtmlPage adminPage = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+	private static WebClient webClient = null;
+
+	@BeforeClass
+	public static void testContextSetup() throws Exception {
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/appA.par"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/appA.par");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+	}
+
+	@Test
+	public void parArtifactRefreshForASN() throws Exception {
+		assertParArtifactASNBeforeRefresh("par", "appA", "1.0.0");
+		assertParArtifactStateBeforeRefresh("par", "appA", "1.0.0", "ACTIVE");
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"src/test/resources/appA.par"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("src/test/resources/appA.par");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("par");
+		assertNotNull("Par Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					if (adminPage.getElementById("parparappA_Updated2.0.0") != null) {
+						adminPage.getElementById("parparappA_Updated2.0.0")
+								.click();
+						assertNotNull(
+								"Refresh button is not listed out in admin console",
+								adminPage.getElementById("dijit_form_Button_2"));
+						adminPage.getElementById("dijit_form_Button_2").click();
+						waitForArtifactState("par","appA_Updated","2.0.0","ACTIVE",HALF_SECOND, TWO_MINUTES);
+						assertParArtifactASNAfterRefresh("par", "appA_Updated",
+								"2.0.0");
+						assertParArtifactStateAfterRefresh("par",
+								"appA_Updated", "2.0.0", "ACTIVE");
+					}
+
+					break;
+				}
+			}
+		}
+	}
+
+	private void assertParArtifactASNBeforeRefresh(String type, String name,
+			String version) throws MalformedObjectNameException, IOException,
+			Exception {
+		assertTrue(String.format("Par Artifact with ASN %s does not exist",
+				name), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertParArtifactStateBeforeRefresh(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format(
+				"Par Artifact %s:%s:%s is not in state After Refresh %s", type,
+				name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertParArtifactASNAfterRefresh(String type, String name,
+			String version) throws MalformedObjectNameException, IOException,
+			Exception {
+		assertTrue(String.format("Par Artifact with ASN %s does not exist",
+				name), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertParArtifactStateAfterRefresh(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format(
+				"Par Artifact %s:%s:%s is not in state After Refresh %s", type,
+				name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	@AfterClass
+	public static void tearDown() throws Exception {
+		Object[] params = {};
+		String[] signature = {};
+		getMBeanServerConnection().invoke(
+				getObjectName("par", "appA_Updated", "2.0.0"), "uninstall",
+				params, signature);
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ParArtifactRenderTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ParArtifactRenderTests.java
new file mode 100644
index 0000000..3cd95a8
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ParArtifactRenderTests.java
@@ -0,0 +1,371 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.server.svt.adminconsole;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class ParArtifactRenderTests extends AbstractWebTests {
+
+	private static HtmlPage adminPage = null;
+	private static WebClient webClient = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+
+	@BeforeClass
+	public static void testContextSetup() throws IOException {
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/appA.par"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/appA.par");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+	}
+
+	@Test
+	public void parArtifactRenderInAdminConsole() throws Exception {
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement parElement = adminPage.getElementById("par");
+		assertNotNull("Par Artifacts are not Listed out Properly", parElement);
+		if (parElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = parElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement parHtmlElement = iterator.next();
+				if (parHtmlElement.getTagName().equals("img")) {
+					parHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					assertParArtifactRender("par", "appA", "1.0.0");
+					assertParArtifactAttributes("ACTIVE", "scoped-atomic");
+					assertParArtifactDependents();
+					break;
+				}
+			}
+		}
+	}
+
+	private void assertParArtifactRender(String type, String name,
+			String version) throws Exception {
+		if (adminPage.getElementById("parparappA1.0.0") != null) {
+			assertNotNull(String.format(
+					"Par Artifact %s:%s:%s does not exist", type, name,
+					version), adminPage.getElementById("parparappA1.0.0"));
+			assertTrue(String.format("Par Artifact %s does not render properly",
+					name), adminPage.getElementById("parparappA1.0.0")
+					.getTextContent().contains("appA"));
+			assertTrue(String.format("Par Artifact %s does not render properly",
+                name), adminPage.getElementById("parparappA1.0.0")
+                .getTextContent().contains("1.0.0"));
+		}
+	}
+
+	private void assertParArtifactAttributes(String state, String scopedatomic)
+			throws IOException {
+		if (adminPage.getElementById("parparappA1.0.0") != null) {
+			assertNotNull(
+					String
+							.format(
+									"User installed Par artifact is not listed out in admin console",
+									"appA 1.0.0"), adminPage
+							.getElementById("parparappA1.0.0"));
+			if (adminPage.getElementById("parparappA1.0.0") != null) {
+				HtmlElement parChildElement = adminPage
+						.getElementById("parparappA1.0.0");
+				Iterator<HtmlElement> subIterator = parChildElement
+						.getFirstChild().getAllHtmlChildElements().iterator();
+				while (subIterator.hasNext()) {
+					HtmlElement parChildHtmlElement = subIterator.next();
+					if (parChildHtmlElement.getTagName().equals("img")) {
+						parChildHtmlElement.click();
+						webClient
+								.waitForBackgroundJavaScriptStartingBefore(500);
+						assertTrue(String.format(
+								"Par Artifact %s state %s is not render",
+								"appA 1.0.0", state), adminPage.getElementById(
+								"parparappA1.0.0parappA1.0.0ACTIVE")
+								.getTextContent().contains(state));
+						assertTrue(
+								String
+										.format(
+												"Par Artifact %s scope %s is not render",
+												"appA 1.0.0", scopedatomic),
+								adminPage
+										.getElementById(
+												"parparappA1.0.0parappA1.0.0scoped-atomic")
+										.getTextContent()
+										.contains(scopedatomic));
+
+						assertTrue(
+								String
+										.format(
+												"Par Artifact %s is not showing up the User installed status",
+												"appA 1.0.0"),
+								adminPage
+										.getElementById(
+												"parparappA1.0.0parappA1.0.0user.installed")
+										.getTextContent().contains(
+												"user.installed"));
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	private void assertParArtifactDependents() throws IOException {
+		if (adminPage.getElementById("parparappA1.0.0") != null) {
+			if (adminPage
+					.getElementById("parparappA1.0.0configurationfoo0.0.0") != null) {
+				HtmlElement parChildChildElement = adminPage
+						.getElementById("parparappA1.0.0configurationfoo0.0.0");
+				Iterator<HtmlElement> subIterator = parChildChildElement
+						.getFirstChild().getAllHtmlChildElements().iterator();
+				while (subIterator.hasNext()) {
+					HtmlElement parChildChildHtmlElement = subIterator.next();
+					if (parChildChildHtmlElement.getTagName().equals("img")) {
+						parChildChildHtmlElement.click();
+						webClient
+								.waitForBackgroundJavaScriptStartingBefore(500);
+						assertTrue(String.format(
+								"Dependent par Artifact %s does not exist",
+								"foo 0.0.0"), adminPage.getElementById(
+								"parparappA1.0.0configurationfoo0.0.0")
+								.getTextContent().contains("foo"));
+	                      assertTrue(String.format(
+                              "Dependent par Artifact %s does not exist",
+                              "foo 0.0.0"), adminPage.getElementById(
+                              "parparappA1.0.0configurationfoo0.0.0")
+                              .getTextContent().contains("0.0.0"));
+
+						assertTrue(
+								String
+										.format(
+												"Dependent Par Artifact %s state %s is not render",
+												"foo 0.0.0", "ACTIVE"),
+								adminPage
+										.getElementById(
+												"parparappA1.0.0configurationfoo0.0.0configurationfoo0.0.0ACTIVE")
+										.getTextContent().contains("ACTIVE"));
+						break;
+					}
+				}
+			}
+
+			if (adminPage
+					.getElementById("parparappA1.0.0bundleappA-1-bundleA1.0.0") != null) {
+				HtmlElement parChildChildElement = adminPage
+						.getElementById("parparappA1.0.0bundleappA-1-bundleA1.0.0");
+				Iterator<HtmlElement> subIterator = parChildChildElement
+						.getFirstChild().getAllHtmlChildElements().iterator();
+				while (subIterator.hasNext()) {
+					HtmlElement parChildChildHtmlElement = subIterator.next();
+					if (parChildChildHtmlElement.getTagName().equals("img")) {
+						parChildChildHtmlElement.click();
+						webClient
+								.waitForBackgroundJavaScriptStartingBefore(500);
+						assertTrue(
+								String
+										.format(
+												"Dependent par Artifact %s does not exist",
+												"appA-1-bundleA 1.0.0"),
+								adminPage
+										.getElementById(
+												"parparappA1.0.0bundleappA-1-bundleA1.0.0")
+										.getTextContent().contains(
+												"appA-1-bundleA"));
+						assertTrue(
+                            String
+                                    .format(
+                                            "Dependent par Artifact %s does not exist",
+                                            "appA-1-bundleA 1.0.0"),
+                            adminPage
+                                    .getElementById(
+                                            "parparappA1.0.0bundleappA-1-bundleA1.0.0")
+                                    .getTextContent().contains(
+                                            "1.0.0"));
+						assertTrue(
+								String
+										.format(
+												"Dependent Par Artifact %s state %s does not exist",
+												"appA-1-bundleA 1.0.0",
+												"ACTIVE"),
+								adminPage
+										.getElementById(
+												"parparappA1.0.0bundleappA-1-bundleA1.0.0bundleappA-1-bundleA1.0.0ACTIVE")
+										.getTextContent().contains("ACTIVE"));
+						break;
+					}
+				}
+			}
+
+			if (adminPage
+					.getElementById("parparappA1.0.0bundleappA-1-bundleB1.0.0") != null) {
+				HtmlElement parChildChildElement = adminPage
+						.getElementById("parparappA1.0.0bundleappA-1-bundleB1.0.0");
+				Iterator<HtmlElement> subIterator = parChildChildElement
+						.getFirstChild().getAllHtmlChildElements().iterator();
+				while (subIterator.hasNext()) {
+					HtmlElement parChildChildHtmlElement = subIterator.next();
+					if (parChildChildHtmlElement.getTagName().equals("img")) {
+						parChildChildHtmlElement.click();
+						webClient
+								.waitForBackgroundJavaScriptStartingBefore(500);
+						assertTrue(
+								String
+										.format(
+												"Dependent par Artifact %s does not render",
+												"appA-1-bundleB 1.0.0"),
+								adminPage
+										.getElementById(
+												"parparappA1.0.0bundleappA-1-bundleB1.0.0")
+										.getTextContent().contains(
+												"appA-1-bundleB"));
+                        assertTrue(
+                            String
+                                    .format(
+                                            "Dependent par Artifact %s does not render",
+                                            "appA-1-bundleB 1.0.0"),
+                            adminPage
+                                    .getElementById(
+                                            "parparappA1.0.0bundleappA-1-bundleB1.0.0")
+                                    .getTextContent().contains(
+                                            "1.0.0"));
+						assertTrue(
+								String
+										.format(
+												"Dependent Par Artifact %s state %s does not render",
+												"appA-1-bundleB 1.0.0",
+												"ACTIVE"),
+								adminPage
+										.getElementById(
+												"parparappA1.0.0bundleappA-1-bundleB1.0.0bundleappA-1-bundleB1.0.0ACTIVE")
+										.getTextContent().contains("ACTIVE"));
+
+						assertTrue(
+								String
+										.format(
+												"Dependent Par Artifact %s type %s does not render",
+												"appA-1-bundleB 1.0.0",
+												"Web Bundle"),
+								adminPage
+										.getElementById(
+												"parparappA1.0.0bundleappA-1-bundleB1.0.0bundleappA-1-bundleB1.0.0artifact-type: Web Bundle")
+										.getTextContent()
+										.contains("Web Bundle"));
+
+						assertTrue(
+								String
+										.format(
+												"Dependent Par Artifact %s context path %s is not render",
+												"appA-1-bundleB 1.0.0",
+												"/bundleBContext"),
+								adminPage
+										.getElementById(
+												"parparappA1.0.0bundleappA-1-bundleB1.0.0bundleappA-1-bundleB1.0.0org.eclipse.virgo.web.contextPath: /bundleBContext")
+										.getTextContent().contains(
+												"/bundleBContext"));
+						break;
+					}
+				}
+			}
+
+			if (adminPage
+					.getElementById("parparappA1.0.0bundleappA-1-synthetic.context1.0.0") != null) {
+				HtmlElement parChildChildElement = adminPage
+						.getElementById("parparappA1.0.0bundleappA-1-synthetic.context1.0.0");
+				Iterator<HtmlElement> subIterator = parChildChildElement
+						.getFirstChild().getAllHtmlChildElements().iterator();
+				while (subIterator.hasNext()) {
+					HtmlElement parChildChildHtmlElement = subIterator.next();
+					if (parChildChildHtmlElement.getTagName().equals("img")) {
+						parChildChildHtmlElement.click();
+						webClient
+								.waitForBackgroundJavaScriptStartingBefore(500);
+						assertTrue(
+								String
+										.format(
+												"Dependent par Artifact %s does not render",
+												"appA-1-synthetic.context 1.0.0"),
+								adminPage
+										.getElementById(
+												"parparappA1.0.0bundleappA-1-synthetic.context1.0.0")
+										.getTextContent()
+										.contains(
+												"appA-1-synthetic.context"));
+                        assertTrue(
+                            String
+                                    .format(
+                                            "Dependent par Artifact %s does not render",
+                                            "appA-1-synthetic.context 1.0.0"),
+                            adminPage
+                                    .getElementById(
+                                            "parparappA1.0.0bundleappA-1-synthetic.context1.0.0")
+                                    .getTextContent()
+                                    .contains(
+                                            "1.0.0"));
+						assertTrue(
+								String
+										.format(
+												"Dependent Par Artifact %s state %s does not render",
+												"appA-1-synthetic.context 1.0.0",
+												"ACTIVE"),
+								adminPage
+										.getElementById(
+												"parparappA1.0.0bundleappA-1-synthetic.context1.0.0bundleappA-1-synthetic.context1.0.0ACTIVE")
+										.getTextContent().contains("ACTIVE"));
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	@AfterClass
+	public static void tearDown() throws Exception {
+		Object[] params = {};
+		String[] signature = {};
+		getMBeanServerConnection().invoke(
+				getObjectName("par", "appA", "1.0.0"), "uninstall", params,
+				signature);
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ParArtifactStartAndStopTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ParArtifactStartAndStopTests.java
new file mode 100644
index 0000000..a74e20f
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ParArtifactStartAndStopTests.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.server.svt.adminconsole;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class ParArtifactStartAndStopTests extends AbstractWebTests {
+	private static HtmlPage adminPage = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+	private static WebClient webClient = null;
+
+	@BeforeClass
+	public static void testContextSetup() throws IOException {
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/appA.par"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/appA.par");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+	}
+
+	@Test
+	public void parArtifactStop() throws MalformedObjectNameException,
+			Exception {
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("par");
+		assertNotNull("Par Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					HtmlElement parNode = adminPage.getElementById("parparappA1.0.0");
+					if (parNode != null) {
+						clickPar(parNode);
+						assertNotNull(
+								"Stop button is not listed out in admin console",
+								adminPage.getElementById("dijit_form_Button_1"));
+						adminPage.getElementById("dijit_form_Button_1").click();
+						waitForArtifactState("par","appA","1.0.0","RESOLVED",HALF_SECOND, TWO_MINUTES);
+						assertParArtifactState("par", "appA", "1.0.0",
+								"RESOLVED");
+						assertParArtifactDependentsState("bundle", "bundleA",
+								"1.0.0", "RESOLVED");
+						assertParArtifactDependentsState("bundle", "bundleB",
+								"1.0.0", "RESOLVED");
+						assertParArtifactDependentsState("configuration", "foo",
+								"0.0.0", "RESOLVED");
+						assertParArtifactDependentsState("bundle",
+								"appA-synthetic.context", "1.0.0", "RESOLVED");
+					}
+
+					break;
+				}
+			}
+		}
+	}
+	
+	private void clickPar(HtmlElement parNode) throws IOException {
+		// 1st child -> 3rd child -> 2nd child -> click
+		getHtmlChildElement(getHtmlChildElement(getHtmlChildElement(parNode, 0), 2), 1).click();
+	}
+
+	@Test
+	public void parArtifactStart() throws MalformedObjectNameException,
+			IOException, Exception {
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("par");
+		assertNotNull("Par Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					HtmlElement parNode = adminPage.getElementById("parparappA1.0.0");
+					if (parNode != null) {
+						clickPar(parNode);
+						assertNotNull(
+								"Start button is not listed out in admin console",
+								adminPage.getElementById("dijit_form_Button_0"));
+						adminPage.getElementById("dijit_form_Button_0").click();
+						waitForArtifactState("par","appA","1.0.0","ACTIVE",HALF_SECOND, TWO_MINUTES);
+						assertParArtifactState("par", "appA", "1.0.0", "ACTIVE");
+						assertParArtifactDependentsState("bundle", "bundleA",
+								"1.0.0", "ACTIVE");
+						assertParArtifactDependentsState("bundle", "bundleB",
+								"1.0.0", "ACTIVE");
+						assertParArtifactDependentsState("configuration", "foo",
+								"0.0.0", "ACTIVE");
+						assertParArtifactDependentsState("bundle",
+								"appA-synthetic.context", "1.0.0", "ACTIVE");
+					}
+
+					break;
+				}
+			}
+		}
+	}
+
+	private void assertParArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format("Par Artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertParArtifactDependentsState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		ObjectName[] objectNameList = (ObjectName[]) getMBeanServerConnection()
+				.getAttribute(getObjectName("par", "appA", "1.0.0"),
+						"Dependents");
+		for (ObjectName objectName : objectNameList) {
+			assertEquals(String.format(
+					"Par Dependent Artifact %s:%s:%s is not in state %s", type,
+					name, version, state), state, getMBeanServerConnection()
+					.getAttribute(objectName, "State"));
+		}
+	}
+	
+	@AfterClass
+	public static void tearDown() throws Exception {
+		Object[] params = {};
+		String[] signature = {};
+		getMBeanServerConnection().invoke(
+				getObjectName("par", "appA", "1.0.0"), "uninstall", params,
+				signature);
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ParArtifactUninstallTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ParArtifactUninstallTests.java
new file mode 100644
index 0000000..95f2431
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/ParArtifactUninstallTests.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.server.svt.adminconsole;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+
+import javax.management.MalformedObjectNameException;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class ParArtifactUninstallTests extends AbstractWebTests {
+	private static HtmlPage adminPage = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+	private static WebClient webClient = null;
+
+	@BeforeClass
+	public static void testContextSetup() throws IOException {
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/appA.par"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/appA.par");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+	}
+
+	@Test
+	public void parArtifactUninstall() throws MalformedObjectNameException,
+			IOException, Exception {
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("par");
+		assertNotNull("Par Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					HtmlElement parNode = adminPage.getElementById("parparappA1.0.0");
+					if (parNode != null) {
+						clickPar(parNode);
+						assertNotNull(
+								"Uninstall button is not listed out in admin console",
+								adminPage.getElementById("dijit_form_Button_3"));
+						adminPage.getElementById("dijit_form_Button_3").click();
+						waitForMBeanDeRegister("par","appA","1.0.0",HALF_SECOND, TWO_MINUTES);
+						assertParArtifactNotExists("par", "appA", "1.0.0");
+						assertParArtifactDependentsNotExists("bundle",
+								"bundleA", "1.0.0");
+						assertParArtifactDependentsNotExists("bundle",
+								"bundleB", "1.0.0");
+						assertParArtifactDependentsNotExists("configuration",
+								"foo", "0.0.0");
+						assertParArtifactDependentsNotExists("bundle",
+								"appA-synthetic.context", "1.0.0");
+					}
+
+					break;
+				}
+			}
+		}
+	}
+
+	private void assertParArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format("Par Artifact %s:%s:%s is still exists",
+				type, name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertParArtifactDependentsNotExists(String type, String name,
+			String version) throws MalformedObjectNameException, IOException,
+			Exception {
+		assertFalse(String.format(
+				"Par Dependent  Artifact %s:%s:%s is still exists", type, name,
+				version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+	
+	private void clickPar(HtmlElement parNode) throws IOException {
+		// 1st child -> 3rd child -> 2nd child -> click
+		getHtmlChildElement(getHtmlChildElement(getHtmlChildElement(parNode, 0), 2), 1).click();
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/PlanArtifactDeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/PlanArtifactDeployTests.java
new file mode 100644
index 0000000..c7a3796
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/PlanArtifactDeployTests.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.server.svt.adminconsole;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class PlanArtifactDeployTests extends AbstractWebTests {
+
+	private static HtmlPage adminPage = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+	private static WebClient webClient = null;
+	private static final String ARTIFACTSDIR = "./../test-apps";
+	private static String[] artifactNames = new String[] { "bundleA.jar",
+			"bundleB.war", "foo.properties" };
+
+	@BeforeClass
+	public static void testContextSetup() throws Exception {
+		copyPlanReferencedArtifactsToRepository(getRepositoryUsrDir(),
+				ARTIFACTSDIR, artifactNames);
+		Thread.sleep(10000);
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+	}
+
+	@Test
+	public void planArtifactDeploy() throws Exception {
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/scopedplan.plan"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/scopedplan.plan");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+		waitForArtifactState("plan","scoped.plan","1.0.0","ACTIVE",HALF_SECOND, TWO_MINUTES);
+		assertPlanArtifactState("plan", "scoped.plan", "1.0.0", "ACTIVE");
+		assertPlanReferencedArtifacts("bundle", "bundleA", "1.0.0");
+		assertPlanReferencedArtifacts("bundle", "bundleB", "1.0.0");
+		assertPlanReferencedArtifacts("configuration", "foo", "0.0.0");
+		assertPlanReferencedArtifacts("bundle",
+				"scoped.plan-synthetic.context", "1.0.0");
+	}
+
+	private static void copyPlanReferencedArtifactsToRepository(String usrDir,
+			String artifactsDir, String[] artifactsNames) throws IOException,
+			InterruptedException {
+		for (String artifactName : artifactsNames) {
+			FileCopyUtils.copy(new File(artifactsDir, artifactName), new File(
+					usrDir, artifactName));
+		}
+	}
+
+	private void assertPlanArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertPlanArtifactExists(type, name, version);
+		assertEquals(String.format("Plan Artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertPlanArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format("Plan Artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertPlanReferencedArtifacts(String type, String name,
+			String version) throws MalformedObjectNameException, IOException,
+			Exception {
+		ObjectName[] objectNameList = (ObjectName[]) getMBeanServerConnection()
+				.getAttribute(getObjectName("plan", "scoped.plan", "1.0.0"),
+						"Dependents");
+		for (ObjectName objectName : objectNameList) {
+			assertTrue(String.format(
+					"Plan Referenced Artifact %s:%s:%s does not exist", type,
+					name, version), getMBeanServerConnection().isRegistered(
+					objectName));
+		}
+	}
+
+	@AfterClass
+	public static void tearDown() throws Exception {
+		Object[] params = {};
+		String[] signature = {};
+		getMBeanServerConnection().invoke(
+				getObjectName("plan", "scoped.plan", "1.0.0"), "uninstall",
+				params, signature);
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/PlanArtifactRefreshTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/PlanArtifactRefreshTests.java
new file mode 100644
index 0000000..00399a4
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/PlanArtifactRefreshTests.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.server.svt.adminconsole;
+
+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.Iterator;
+
+import javax.management.MalformedObjectNameException;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class PlanArtifactRefreshTests extends AbstractWebTests {
+
+	private static HtmlPage adminPage = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+	private static WebClient webClient = null;
+	private static final String ARTIFACTSDIR = "./../test-apps";
+	private static String[] artifactNames = new String[] { "bundleA.jar",
+			"bundleB.war", "foo.properties" };
+
+	@BeforeClass
+	public static void testContextSetup() throws Exception {
+		copyPlanReferencedArtifactsToRepository(getRepositoryUsrDir(),
+				ARTIFACTSDIR, artifactNames);
+		Thread.sleep(10000);
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/scopedplan.plan"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/scopedplan.plan");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+	}
+
+
+	@Test
+	public void planArtifactRefreshForAtomicity() throws Exception {
+		assertPlanArtifactAtomicityBeforeRefresh("plan", "scoped.plan",
+				"1.0.0", true);
+		assertPlanArtifactStateBeforeRefresh("plan", "scoped.plan", "1.0.0",
+				"ACTIVE");
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"src/test/resources/scopedplan.plan"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField
+				.setValueAttribute("src/test/resources/scopedplan.plan");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("plan");
+		assertNotNull("Plan Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					if (adminPage.getElementById("planplanscoped.plan1.0.0") != null) {
+						adminPage.getElementById("planplanscoped.plan1.0.0")
+								.click();
+						assertNotNull(
+								"Refresh button is not listed out in admin console",
+								adminPage.getElementById("dijit_form_Button_2"));
+						adminPage.getElementById("dijit_form_Button_2").click();
+						waitForArtifactState("plan","scoped.plan","1.0.0","ACTIVE",HALF_SECOND, TWO_MINUTES);
+						assertPlanArtifactAtomicityAfterRefresh("plan",
+								"scoped.plan", "1.0.0", false);
+						assertPlanArtifactStateAfterRefresh("plan",
+								"scoped.plan", "1.0.0", "ACTIVE");
+					}
+
+					break;
+				}
+			}
+		}
+	}
+
+	private static void copyPlanReferencedArtifactsToRepository(String usrDir,
+			String artifactsDir, String[] artifactsNames) throws IOException,
+			InterruptedException {
+		for (String artifactName : artifactsNames) {
+			FileCopyUtils.copy(new File(artifactsDir, artifactName), new File(
+					usrDir, artifactName));
+		}
+	}
+
+	private void assertPlanArtifactAtomicityBeforeRefresh(String type,
+			String name, String version, Boolean atomic) throws IOException,
+			Exception, MalformedObjectNameException {
+		assertEquals(
+				String
+						.format(
+								"Plan Artifact %s:%s:%s is not having Atomicity %s before Refresh ",
+								type, name, version, atomic), atomic,
+				getMBeanServerConnection().getAttribute(
+						getObjectName(type, name, version), "Atomic"));
+	}
+
+	private void assertPlanArtifactStateBeforeRefresh(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertPlanArtifactExists(type, name, version);
+		assertEquals(String.format(
+				"Plan Artifact %s:%s:%s is not in state %s before refresh",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertPlanArtifactStateAfterRefresh(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertPlanArtifactExists(type, name, version);
+		assertEquals(String.format(
+				"Plan Artifact %s:%s:%s is not in state %s after Refresh ",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertPlanArtifactAtomicityAfterRefresh(String type,
+			String name, String version, Boolean atomic) throws IOException,
+			Exception, MalformedObjectNameException {
+		assertEquals(
+				String
+						.format(
+								"Plan Artifact %s:%s:%s is not having Atomicity %s after Refresh ",
+								type, name, version, atomic), atomic,
+				getMBeanServerConnection().getAttribute(
+						getObjectName(type, name, version), "Atomic"));
+	}
+
+	private void assertPlanArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format("Plan Artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	@AfterClass
+	public static void tearDown() throws Exception {
+		Object[] params = {};
+		String[] signature = {};
+		getMBeanServerConnection().invoke(
+				getObjectName("plan", "scoped.plan", "1.0.0"), "uninstall",
+				params, signature);
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/PlanArtifactRenderTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/PlanArtifactRenderTests.java
new file mode 100644
index 0000000..96b6d7c
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/PlanArtifactRenderTests.java
@@ -0,0 +1,364 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.server.svt.adminconsole;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+
+public class PlanArtifactRenderTests extends AbstractWebTests {
+
+	private static HtmlPage adminPage = null;
+	private static WebClient webClient = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+	private static final String ARTIFACTSDIR = "./../test-apps";
+	private static String[] artifactNames = new String[] { "bundleA.jar",
+			"bundleB.war", "foo.properties" };
+
+	@BeforeClass
+	public static void testContextSetup() throws IOException,
+			InterruptedException {
+		copyPlanReferencedArtifactsToRepository(getRepositoryUsrDir(),
+				ARTIFACTSDIR, artifactNames);
+		Thread.sleep(10000);
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/scopedplan.plan"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/scopedplan.plan");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+	}
+
+	@Test
+	public void planArtifactRenderInAdminConsole() throws Exception {
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement parElement = adminPage.getElementById("plan");
+		assertNotNull("Plan Artifacts are not Listed out Properly", parElement);
+		if (parElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = parElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement parHtmlElement = iterator.next();
+				if (parHtmlElement.getTagName().equals("img")) {
+					parHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					assertPlanArtifactRender("plan", "scoped.plan", "1.0.0");
+					assertPlanArtifactAttributesRender("ACTIVE", "scoped-atomic");
+					assertPlanReferencedArtifactsRender();
+					break;
+				}
+			}
+		}
+	}
+
+	private static void copyPlanReferencedArtifactsToRepository(String usrDir,
+			String artifactsDir, String[] artifactsNames) throws IOException,
+			InterruptedException {
+		for (String artifactName : artifactsNames) {
+			FileCopyUtils.copy(new File(artifactsDir, artifactName), new File(
+					usrDir, artifactName));
+		}
+	}
+
+	private void assertPlanArtifactRender(String type, String name,
+			String version) throws Exception {
+		if (adminPage.getElementById("planplanscoped.plan1.0.0") != null) {
+			assertNotNull(String.format(
+					"Plan Artifact %s:%s:%s does not exist", type, name,
+					version), adminPage
+					.getElementById("planplanscoped.plan1.0.0"));
+			assertTrue(String.format("Plan Artifact %s does not render properly",
+					name), adminPage.getElementById("planplanscoped.plan1.0.0")
+					.getTextContent().contains("scoped.plan"));
+			assertTrue(String.format("Plan Artifact %s does not render properly",
+                name), adminPage.getElementById("planplanscoped.plan1.0.0")
+                .getTextContent().contains("1.0.0"));
+		}
+	}
+
+	private void assertPlanArtifactAttributesRender(String state, String scopedatomic) throws IOException {
+		if (adminPage.getElementById("planplanscoped.plan1.0.0") != null) {
+			assertNotNull(
+					"User installed Plan artifact is not listed out in admin console",
+					adminPage.getElementById("planplanscoped.plan1.0.0"));
+			if (adminPage.getElementById("planplanscoped.plan1.0.0") != null) {
+				HtmlElement parChildElement = adminPage
+						.getElementById("planplanscoped.plan1.0.0");
+				Iterator<HtmlElement> subIterator = parChildElement
+						.getFirstChild().getAllHtmlChildElements().iterator();
+				while (subIterator.hasNext()) {
+					HtmlElement parChildHtmlElement = subIterator.next();
+					if (parChildHtmlElement.getTagName().equals("img")) {
+						parChildHtmlElement.click();
+						webClient
+								.waitForBackgroundJavaScriptStartingBefore(500);
+						assertTrue(
+								String
+										.format(
+												"Plan Artifact %s state %s is not exists",
+												"scoped.plan 1.0.0", state),
+								adminPage
+										.getElementById(
+												"planplanscoped.plan1.0.0planscoped.plan1.0.0ACTIVE")
+										.getTextContent().contains(state));
+						assertTrue(
+								String
+										.format(
+												"Par Artifact %s scope %s is not exists",
+												"scoped.plan 1.0.0", scopedatomic),
+								adminPage
+										.getElementById(
+												"planplanscoped.plan1.0.0planscoped.plan1.0.0scoped-atomic")
+										.getTextContent().contains(scopedatomic));
+						
+						assertTrue(
+								String
+										.format(
+												"Par Artifact %s is not showing up the User installed status",
+												"scoped.plan 1.0.0"),
+								adminPage
+										.getElementById(
+												"planplanscoped.plan1.0.0planscoped.plan1.0.0user.installed")
+										.getTextContent().contains(
+												"user.installed"));
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	private void assertPlanReferencedArtifactsRender() throws IOException {
+		if (adminPage.getElementById("planplanscoped.plan1.0.0") != null) {
+			if (adminPage
+					.getElementById("planplanscoped.plan1.0.0configurationfoo0.0.0") != null) {
+				HtmlElement parChildChildElement = adminPage
+						.getElementById("planplanscoped.plan1.0.0configurationfoo0.0.0");
+				Iterator<HtmlElement> subIterator = parChildChildElement
+						.getFirstChild().getAllHtmlChildElements().iterator();
+				while (subIterator.hasNext()) {
+					HtmlElement parChildChildHtmlElement = subIterator.next();
+					if (parChildChildHtmlElement.getTagName().equals("img")) {
+						parChildChildHtmlElement.click();
+						webClient
+								.waitForBackgroundJavaScriptStartingBefore(500);
+						assertTrue(String.format(
+								"Plan Referenced Artifact %s does not render correctly",
+								"foo 0.0.0"), adminPage.getElementById(
+								"planplanscoped.plan1.0.0configurationfoo0.0.0")
+								.getTextContent().contains("foo"));
+						assertTrue(String.format(
+                            "Plan Referenced Artifact %s does not render correctly",
+                            "foo 0.0.0"), adminPage.getElementById(
+                            "planplanscoped.plan1.0.0configurationfoo0.0.0")
+                            .getTextContent().contains("0.0.0"));
+						assertTrue(
+								String
+										.format(
+												"Plan Referenced Artifact  %s state %s is not render",
+												"foo 0.0.0", "ACTIVE"),
+								adminPage
+										.getElementById(
+												"planplanscoped.plan1.0.0configurationfoo0.0.0configurationfoo0.0.0ACTIVE")
+										.getTextContent().contains("ACTIVE"));
+						break;
+					}
+				}
+			}
+
+			if (adminPage
+					.getElementById("planplanscoped.plan1.0.0bundlescoped.plan-1-bundleA1.0.0") != null) {
+				HtmlElement parChildChildElement = adminPage
+						.getElementById("planplanscoped.plan1.0.0bundlescoped.plan-1-bundleA1.0.0");
+				Iterator<HtmlElement> subIterator = parChildChildElement
+						.getFirstChild().getAllHtmlChildElements().iterator();
+				while (subIterator.hasNext()) {
+					HtmlElement parChildChildHtmlElement = subIterator.next();
+					if (parChildChildHtmlElement.getTagName().equals("img")) {
+						parChildChildHtmlElement.click();
+						webClient
+								.waitForBackgroundJavaScriptStartingBefore(500);
+						assertTrue(String.format(
+								"Plan Referenced Artifact %s does not render correctly",
+								"scoped.plan-1-bundleA 1.0.0"), adminPage.getElementById(
+								"planplanscoped.plan1.0.0bundlescoped.plan-1-bundleA1.0.0")
+								.getTextContent().contains("scoped.plan-1-bundleA"));
+						assertTrue(String.format(
+                            "Plan Referenced Artifact %s does not render correctly",
+                            "scoped.plan-1-bundleA 1.0.0"), adminPage.getElementById(
+                            "planplanscoped.plan1.0.0bundlescoped.plan-1-bundleA1.0.0")
+                            .getTextContent().contains("1.0.0"));
+						assertTrue(
+								String
+										.format(
+												"Plan Referenced Artifact %s  state %s is not render",
+												"scoped.plan-1-bundleA 1.0.0", "ACTIVE"),
+								adminPage
+										.getElementById(
+												"planplanscoped.plan1.0.0bundlescoped.plan-1-bundleA1.0.0bundlescoped.plan-1-bundleA1.0.0ACTIVE")
+										.getTextContent().contains("ACTIVE"));
+						break;
+					}
+				}
+			}
+
+			if (adminPage.getElementById("planplanscoped.plan1.0.0bundlescoped.plan-1-bundleB1.0.0") != null) {
+				HtmlElement parChildChildElement = adminPage
+						.getElementById("planplanscoped.plan1.0.0bundlescoped.plan-1-bundleB1.0.0");
+				Iterator<HtmlElement> subIterator = parChildChildElement
+						.getFirstChild().getAllHtmlChildElements().iterator();
+				while (subIterator.hasNext()) {
+					HtmlElement parChildChildHtmlElement = subIterator.next();
+					if (parChildChildHtmlElement.getTagName().equals("img")) {
+						parChildChildHtmlElement.click();
+						webClient
+								.waitForBackgroundJavaScriptStartingBefore(500);
+						assertTrue(String.format(
+								"Plan Referenced Artifact %s does not render correctly",
+								"scoped.plan-1-bundleB 1.0.0"), adminPage.getElementById(
+								"planplanscoped.plan1.0.0bundlescoped.plan-1-bundleB1.0.0")
+								.getTextContent().contains("scoped.plan-1-bundleB"));
+						assertTrue(String.format(
+                            "Plan Referenced Artifact %s does not render correctly",
+                            "scoped.plan-1-bundleB 1.0.0"), adminPage.getElementById(
+                            "planplanscoped.plan1.0.0bundlescoped.plan-1-bundleB1.0.0")
+                            .getTextContent().contains("1.0.0"));
+						assertTrue(
+								String
+										.format(
+												"Plan Referenced Artifact %s state  %s is not render",
+												"scoped.plan-1-bundleB 1.0.0", "ACTIVE"),
+								adminPage
+										.getElementById(
+												"planplanscoped.plan1.0.0bundlescoped.plan-1-bundleB1.0.0bundlescoped.plan-1-bundleB1.0.0ACTIVE")
+										.getTextContent().contains("ACTIVE"));
+
+						assertTrue(
+								String
+										.format(
+												"Plan Referenced Artifact %s type %s is not render",
+												"scoped.plan-1-bundleB 1.0.0", "Web Bundle"),
+								adminPage
+										.getElementById(
+												"planplanscoped.plan1.0.0bundlescoped.plan-1-bundleB1.0.0bundlescoped.plan-1-bundleB1.0.0artifact-type: Web Bundle")
+										.getTextContent()
+										.contains("Web Bundle"));
+
+						assertTrue(
+								String
+										.format(
+												"Plan Referenced Artifact %s contextpath %s is not render",
+												"scoped.plan-1-bundleB 1.0.0",
+												"/bundleBContext"),
+								adminPage
+										.getElementById(
+												"planplanscoped.plan1.0.0bundlescoped.plan-1-bundleB1.0.0bundlescoped.plan-1-bundleB1.0.0org.eclipse.virgo.web.contextPath: /bundleBContext")
+										.getTextContent().contains(
+												"/bundleBContext"));
+						break;
+					}
+				}
+			}
+
+			if (adminPage
+					.getElementById("planplanscoped.plan1.0.0bundlescoped.plan-1-synthetic.context1.0.0") != null) {
+				HtmlElement parChildChildElement = adminPage
+						.getElementById("planplanscoped.plan1.0.0bundlescoped.plan-1-synthetic.context1.0.0");
+				Iterator<HtmlElement> subIterator = parChildChildElement
+						.getFirstChild().getAllHtmlChildElements().iterator();
+				while (subIterator.hasNext()) {
+					HtmlElement parChildChildHtmlElement = subIterator.next();
+					if (parChildChildHtmlElement.getTagName().equals("img")) {
+						parChildChildHtmlElement.click();
+						webClient
+								.waitForBackgroundJavaScriptStartingBefore(500);
+						assertTrue(
+								String
+										.format(
+												"Plan Referenced Artifact %s does not render",
+												"scoped.plan-1-synthetic.context 1.0.0"),
+								adminPage
+										.getElementById(
+												"planplanscoped.plan1.0.0bundlescoped.plan-1-synthetic.context1.0.0")
+										.getTextContent()
+										.contains(
+												"scoped.plan-1-synthetic.context"));
+						assertTrue(
+                            String
+                                    .format(
+                                            "Plan Referenced Artifact %s does not render",
+                                            "scoped.plan-1-synthetic.context 1.0.0"),
+                            adminPage
+                                    .getElementById(
+                                            "planplanscoped.plan1.0.0bundlescoped.plan-1-synthetic.context1.0.0")
+                                    .getTextContent()
+                                    .contains(
+                                            "1.0.0"));
+						assertTrue(
+								String
+										.format(
+												"Plan Referenced Artifact %s state  %s is not render",
+												"scoped.plan-1-synthetic.context 1.0.0",
+												"ACTIVE"),
+								adminPage
+										.getElementById(
+												"planplanscoped.plan1.0.0bundlescoped.plan-1-synthetic.context1.0.0bundlescoped.plan-1-synthetic.context1.0.0ACTIVE")
+										.getTextContent().contains("ACTIVE"));
+						break;
+					}
+				}
+			}
+		}
+	}
+
+
+	@AfterClass
+	public static void tearDown() throws Exception {
+		Object[] params = {};
+		String[] signature = {};
+		getMBeanServerConnection().invoke(
+				getObjectName("plan", "scoped.plan", "1.0.0"), "uninstall",
+				params, signature);
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/PlanArtifactStartAndStopTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/PlanArtifactStartAndStopTests.java
new file mode 100644
index 0000000..f2ae665
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/PlanArtifactStartAndStopTests.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.server.svt.adminconsole;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class PlanArtifactStartAndStopTests extends AbstractWebTests {
+
+	private static HtmlPage adminPage = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+	private static WebClient webClient = null;
+	private static final String ARTIFACTSDIR = "./../test-apps";
+	private static String[] artifactNames = new String[] { "bundleA.jar",
+			"bundleB.war", "foo.properties" };
+
+	@BeforeClass
+	public static void testContextSetup() throws Exception {
+		copyPlanReferencedArtifactsToRepository(getRepositoryUsrDir(),
+				ARTIFACTSDIR, artifactNames);
+		Thread.sleep(10000);
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/scopedplan.plan"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/scopedplan.plan");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+	}
+
+	@Test
+	public void planArtifactStop() throws MalformedObjectNameException,
+			Exception {
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("plan");
+		assertNotNull("Plan Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					HtmlElement planNode = adminPage.getElementById("planplanscoped.plan1.0.0");
+					if (planNode != null) {
+						clickPlan(planNode);
+						assertNotNull(
+								"Stop button is not listed out in admin console",
+								adminPage.getElementById("dijit_form_Button_1"));
+						adminPage.getElementById("dijit_form_Button_1").click();
+						waitForArtifactState("plan","scoped.plan","1.0.0","RESOLVED",HALF_SECOND, TWO_MINUTES);
+						assertPlanArtifactState("plan", "scoped.plan", "1.0.0",
+								"RESOLVED");
+						assertPlanReferencedArtifactState("bundle", "bundleA",
+								"1.0.0", "RESOLVED");
+						assertPlanReferencedArtifactState("bundle", "bundleB",
+								"1.0.0", "RESOLVED");
+						assertPlanReferencedArtifactState("configuration", "foo",
+								"0.0.0", "RESOLVED");
+						assertPlanReferencedArtifactState("bundle",
+								"scoped.plan-synthetic.context", "1.0.0",
+								"RESOLVED");
+					}
+
+					break;
+				}
+			}
+		}
+	}
+	
+	private void clickPlan(HtmlElement planNode) throws IOException {
+		// 1st child -> 3rd child -> 2nd child -> click
+		getHtmlChildElement(getHtmlChildElement(getHtmlChildElement(planNode, 0), 2), 1).click();
+	}
+
+	@Test
+	public void planArtifactStart() throws MalformedObjectNameException,
+			IOException, Exception {
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("plan");
+		assertNotNull("Plan Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					HtmlElement planNode = adminPage.getElementById("planplanscoped.plan1.0.0");
+					if (planNode != null) {
+						clickPlan(planNode);
+
+						assertNotNull(
+								"Start button is not listed out in admin console",
+								adminPage.getElementById("dijit_form_Button_0"));
+						adminPage.getElementById("dijit_form_Button_0").click();
+						waitForArtifactState("plan","scoped.plan","1.0.0","ACTIVE",HALF_SECOND, TWO_MINUTES);
+						assertPlanArtifactState("plan", "scoped.plan", "1.0.0",
+								"ACTIVE");
+						assertPlanReferencedArtifactState("bundle", "bundleA",
+								"1.0.0", "ACTIVE");
+						assertPlanReferencedArtifactState("bundle", "bundleB",
+								"1.0.0", "ACTIVE");
+						assertPlanReferencedArtifactState("configuration", "foo",
+								"0.0.0", "ACTIVE");
+						assertPlanReferencedArtifactState("bundle",
+								"scoped.plan-synthetic.context", "1.0.0",
+								"ACTIVE");
+					}
+
+					break;
+				}
+			}
+		}
+	}
+
+	private static void copyPlanReferencedArtifactsToRepository(String usrDir,
+			String artifactsDir, String[] artifactsNames) throws IOException,
+			InterruptedException {
+		for (String artifactName : artifactsNames) {
+			FileCopyUtils.copy(new File(artifactsDir, artifactName), new File(
+					usrDir, artifactName));
+		}
+	}
+
+	private void assertPlanArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format("Plan Artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertPlanReferencedArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		ObjectName[] objectNameList = (ObjectName[]) getMBeanServerConnection()
+				.getAttribute(getObjectName("plan", "scoped.plan", "1.0.0"),
+						"Dependents");
+		for (ObjectName objectName : objectNameList) {
+			assertEquals(String.format(
+					"Plan Referenced Artifact %s:%s:%s is not in state %s",
+					type, name, version, state), state,
+					getMBeanServerConnection()
+							.getAttribute(objectName, "State"));
+		}
+	}
+
+	@AfterClass
+	public static void tearDown() throws Exception {
+		Object[] params = {};
+		String[] signature = {};
+		getMBeanServerConnection().invoke(
+				getObjectName("plan", "scoped.plan", "1.0.0"), "uninstall",
+				params, signature);
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/PlanArtifactUninstallTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/PlanArtifactUninstallTests.java
new file mode 100644
index 0000000..9d81a22
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminconsole/PlanArtifactUninstallTests.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.server.svt.adminconsole;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+import javax.management.MalformedObjectNameException;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlFileInput;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class PlanArtifactUninstallTests extends AbstractWebTests {
+
+	private static HtmlPage adminPage = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+	private static WebClient webClient = null;
+	private static final String ARTIFACTSDIR = "./../test-apps";
+	private static String[] artifactNames = new String[] { "bundleA.jar",
+			"bundleB.war", "foo.properties" };
+
+	@BeforeClass
+	public static void testContextSetup() throws IOException,
+			InterruptedException {
+		copyPlanReferencedArtifactsToRepository(getRepositoryUsrDir(),
+				ARTIFACTSDIR, artifactNames);
+		Thread.sleep(10000);
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+
+		byte[] byteArray = FileCopyUtils.copyToByteArray(new File(
+				"./../test-apps/scopedplan.plan"));
+		final HtmlForm uploadform = adminPage.getFormByName("uploadForm");
+		final HtmlFileInput applicationField = uploadform
+				.getInputByName("application");
+		applicationField.setData(byteArray);
+		applicationField.setValueAttribute("./../test-apps/scopedplan.plan");
+		final HtmlSubmitInput uploadButton = uploadform
+				.getElementById("deploy_application_submit_button");
+		uploadform.submit(uploadButton);
+	}
+
+	@Test
+	public void planArtifactUninstall() throws MalformedObjectNameException,
+			IOException, Exception {
+		adminPage = webClient.getPage(AbstractWebTests.URL);
+		webClient.waitForBackgroundJavaScriptStartingBefore(500);
+		HtmlElement bundleElement = adminPage.getElementById("plan");
+		assertNotNull("Plan Artifacts are not Listed out Properly",
+				bundleElement);
+		if (bundleElement.getFirstChild() != null) {
+			Iterator<HtmlElement> iterator = bundleElement.getFirstChild()
+					.getAllHtmlChildElements().iterator();
+			while (iterator.hasNext()) {
+				HtmlElement bundleHtmlElement = iterator.next();
+				if (bundleHtmlElement.getTagName().equals("img")) {
+					bundleHtmlElement.click();
+					webClient.waitForBackgroundJavaScriptStartingBefore(500);
+					HtmlElement planNode = adminPage.getElementById("planplanscoped.plan1.0.0");
+					if (planNode != null) {
+						clickPlan(planNode);
+						assertNotNull(
+								"Uninstall button is not listed out in admin console",
+								adminPage.getElementById("dijit_form_Button_3"));
+						adminPage.getElementById("dijit_form_Button_3").click();
+						waitForMBeanDeRegister("plan","scoped.plan","1.0.0",HALF_SECOND, TWO_MINUTES);
+						assertPlanArtifactNotExists("plan", "scoped.plan",
+								"1.0.0");
+						assertPlanReferencedArtifactsNotExists("bundle",
+								"bundleA", "1.0.0");
+						assertPlanReferencedArtifactsNotExists("bundle",
+								"bundleB", "1.0.0");
+						assertPlanReferencedArtifactsNotExists("configuration",
+								"foo", "0.0.0");
+						assertPlanReferencedArtifactsNotExists("bundle",
+								"scoped.plan-synthetic.context", "1.0.0");
+					}
+
+					break;
+				}
+			}
+		}
+	}
+
+	private static void copyPlanReferencedArtifactsToRepository(String usrDir,
+			String artifactsDir, String[] artifactsNames) throws IOException,
+			InterruptedException {
+		for (String artifactName : artifactsNames) {
+			FileCopyUtils.copy(new File(artifactsDir, artifactName), new File(
+					usrDir, artifactName));
+		}
+	}
+
+	private void assertPlanArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format("Plan Artifact %s:%s:%s is still exists",
+				type, name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertPlanReferencedArtifactsNotExists(String type,
+			String name, String version) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertFalse(String.format(
+				"Plan Referenced Artifact %s:%s:%s is still exists", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+	
+	private void clickPlan(HtmlElement planNode) throws IOException {
+		// 1st child -> 3rd child -> 2nd child -> click
+		getHtmlChildElement(getHtmlChildElement(getHtmlChildElement(planNode, 0), 2), 1).click();
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminmetadata/ServerAdminMetadataTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminmetadata/ServerAdminMetadataTests.java
new file mode 100644
index 0000000..f59e968
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/adminmetadata/ServerAdminMetadataTests.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.server.svt.adminmetadata;
+
+import net.sourceforge.jwebunit.html.Table;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.DefaultCredentialsProvider;
+import com.gargoylesoftware.htmlunit.WebClient;
+
+public class ServerAdminMetadataTests extends AbstractWebTests {
+
+	private static WebClient webClient = null;
+	private static DefaultCredentialsProvider credentialsProvider = null;
+
+	@Before
+	public void testContextSetup() throws Exception {
+		getTestContext().setBaseUrl(AbstractWebTests.URL);
+		getTestContext().setAuthorization(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+		webClient = new WebClient();
+		webClient.setThrowExceptionOnScriptError(false);
+		webClient.setThrowExceptionOnFailingStatusCode(false);
+		credentialsProvider = (DefaultCredentialsProvider) webClient
+				.getCredentialsProvider();
+		credentialsProvider.addCredentials(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+	}
+
+	@Test
+	public void testServerProperties() throws Exception {
+		Table propTable;
+		webClient.setThrowExceptionOnScriptError(false);
+		webClient.setThrowExceptionOnFailingStatusCode(false);
+		getTester()
+				.beginAt("http://localhost:8080/admin/web/info/overview.htm");
+		getTester().assertTextPresent("Server Properties");
+		getTester().assertTablePresent("properties");
+
+		propTable = new Table(new Object[][] { { "Name", "Value" },
+				{ "Java VM Description", getJavaVMDescription() },
+				{ "Java Version", getJavaVersion() },
+				{ "Operating System", getOperatingSystem() },
+				{ "Server Time Zone", System.getProperty("user.timezone") },
+				{ "Virgo Server Version", getServerVersion() } });
+		getTester().assertTableRowCountEquals("properties", 6);
+		getTester().assertTableEquals("properties", propTable);
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/configadmin/AddPropertyFilesForConfigAdminTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/configadmin/AddPropertyFilesForConfigAdminTests.java
new file mode 100644
index 0000000..872527e
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/configadmin/AddPropertyFilesForConfigAdminTests.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.server.svt.configadmin;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class AddPropertyFilesForConfigAdminTests extends AbstractWebTests {
+
+	private static final String APPS_DIR = "src/test/resources";
+	private static final String propertyFileName = "com.springsource.test.properties";
+
+	@Test
+	public void copyApplicationsToPickup() throws IOException,
+			InterruptedException {
+		FileCopyUtils.copy(new File(APPS_DIR, propertyFileName), new File(
+				getConfigDir(), propertyFileName));
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/dumpinspector/DumpInspectorTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/dumpinspector/DumpInspectorTests.java
new file mode 100644
index 0000000..90b4397
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/dumpinspector/DumpInspectorTests.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.server.svt.dumpinspector;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.File;
+
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.eclipse.virgo.util.io.FileSystemUtils;
+
+public class DumpInspectorTests extends AbstractWebTests {
+	private static final String APPS_DIR = "./src/test/resources";
+
+	private static final String[] APPLICATION_NAMES_USES_VOILATION = new String[] {
+			"eclipselink1.jar", "eclipselink2.jar", "spring.jar", "app1.jar" };
+
+	private static final String[] APPLICATION_NAMES_CLASSNOTFOUND = new String[] { "formtags-par-1.4.0.RELEASE_FAILURE.par" };
+	private static final String EXCLUDE_PATTERN = ".DS_Store";
+
+	@Before
+	public void testContextSetup() throws Exception {
+		getTestContext().setBaseUrl(
+				"http://localhost:8080/admin/web/dump/inspector.htm");
+		getTestContext().setAuthorization(AbstractWebTests.USER,
+				AbstractWebTests.PASSWORD);
+	}
+
+	@Test
+	public void testDumpContentInAdminScreenUponDumpGenerationOfUsesVoilation()
+			throws Exception {
+		if (getDumpDir() != null) {
+			FileSystemUtils.deleteRecursively(getDumpDir());
+		}
+		copyApplicationsToPickup(getPickupDir(), APPS_DIR,
+				APPLICATION_NAMES_USES_VOILATION);
+		Thread.sleep(2000);
+		UrlWaitLatch.waitFor(
+				"http://localhost:8080/admin/web/dump/inspector.htm", USER,
+				PASSWORD);
+		getTester().beginAt(
+				"http://localhost:8080/admin/web/dump/inspector.htm");
+
+		File[] dumpIds = getDumpIds();
+		if (dumpIds != null) {
+			for (int i = 0; i < dumpIds.length; i++) {
+				if (!dumpIds[i].getName().equals(EXCLUDE_PATTERN)) {
+					getTester().clickButton("dump_selector_submit");
+					File[] dumpEntries = getDumpEntries(dumpIds[i]);
+					for (int j = 0; j < dumpEntries.length; j++) {
+						if (dumpEntries[j].getName().startsWith("summary")
+								&& dumpEntries[j].getName().endsWith(".txt")) {
+							getTester().selectOptionByValue("dumpEntryName",
+									dumpEntries[j].getName());
+							getTester().clickButton("dump_selector_submit");
+							getTester().assertTextPresent(
+									"Cause: resolutionFailure");
+						}
+					}
+				}
+			}
+		}
+		FileSystemUtils.deleteRecursively(getDumpDir());
+		deleteApplicationsFromPickup(getPickupDir(),
+				APPLICATION_NAMES_USES_VOILATION);
+	}
+
+	@Ignore("Since dump is not generating on ClassNotFoundException as of 2.0.0.M5")
+	@Test
+	public void testDumpContentInAdminScreenUponDumpGenerationOfClassNotFounException()
+			throws Exception {
+
+		if (getDumpDir() != null) {
+			FileSystemUtils.deleteRecursively(getDumpDir());
+		}
+
+		copyApplicationsToPickup(getPickupDir(), APPS_DIR,
+				APPLICATION_NAMES_CLASSNOTFOUND);
+		Thread.sleep(2000);
+
+		getTester().beginAt("http://localhost:8080/admin/web/dump/dump.htm");
+
+		File[] dumpIds = getDumpIds();
+		if (dumpIds != null) {
+
+			for (int i = 0; i < dumpIds.length; i++) {
+
+				if (!dumpIds[i].getName().equals(EXCLUDE_PATTERN)) {
+					getTester().selectOptionByValue("dumpID",
+							applyNameFormatting(dumpIds[i]));
+					getTester().clickButtonWithText("Select Dump");
+					File[] dumpEntries = getDumpEntries(dumpIds[i]);
+					assertEquals(5, dumpEntries.length);
+					for (int j = 0; j < dumpEntries.length; j++) {
+
+						getTester().selectOptionByValue("dumpEntryName",
+								dumpEntries[j].getName());
+						if (j == 0) {
+							assertEquals(true, dumpEntries[0].getName()
+									.startsWith("osgi")
+									&& dumpEntries[0].getName()
+											.endsWith(".zip"));
+						}
+						if (j == 1) {
+							assertEquals(true, dumpEntries[1].getName()
+									.startsWith("summary")
+									&& dumpEntries[1].getName()
+											.endsWith(".txt"));
+						}
+						if (j == 2) {
+							assertEquals(true, dumpEntries[2].getName()
+									.startsWith("system")
+									&& dumpEntries[2].getName().endsWith(
+											".json"));
+						}
+						if (j == 3) {
+							assertEquals(true, dumpEntries[3].getName()
+									.startsWith("thread")
+									&& dumpEntries[3].getName()
+											.endsWith(".txt"));
+						}
+						if (j == 4) {
+							assertEquals(true, dumpEntries[4].getName()
+									.startsWith("trickle")
+									&& dumpEntries[4].getName()
+											.endsWith(".log"));
+						}
+						getTester().assertTextPresent("Dump Entry Viewer");
+						if (dumpEntries[j].getName().startsWith("summary")
+								&& dumpEntries[j].getName().endsWith(".txt")) {
+
+							getTester().clickButtonWithText("Select Entry");
+							getTester().assertTextPresent("Cause: ERROR");
+						}
+
+					}
+				}
+			}
+		}
+
+		deleteApplicationsFromPickup(getPickupDir(),
+				APPLICATION_NAMES_CLASSNOTFOUND);
+		Thread.sleep(1000);
+		FileSystemUtils.deleteRecursively(getDumpDir());
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/par/repository/PlanDeployReferencesParArtifactFromRepository.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/par/repository/PlanDeployReferencesParArtifactFromRepository.java
new file mode 100644
index 0000000..04c3139
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/par/repository/PlanDeployReferencesParArtifactFromRepository.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.server.svt.par.repository;
+
+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 javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.junit.Test;
+
+public class PlanDeployReferencesParArtifactFromRepository extends
+		AbstractWebTests {
+
+	private static final String APP_URI = "./../test-apps/parreferencedplan.plan";
+	private static String type = null;
+	private static String name = null;
+	private static String version = null;
+	private static String[] signature = null;
+	private static Object[] params = null;
+
+	@Test
+	public void planDeployReferencesParArtifactFromRepository() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI).toURI().toString() };
+
+		CompositeData compositeData = deploy(signature, params);
+		name = compositeData.get("symbolicName").toString();
+		type = compositeData.get("type").toString();
+		version = compositeData.get("version").toString();
+
+		waitForMBeanRegister(type, name, version, HALF_SECOND, TWO_MINUTES);
+		assertPlanArtifactExists(type, name, version);
+		assertPlanArtifactState(type, name, version, "ACTIVE");
+	}
+	
+	@Test
+	public void planUnDeployReferencesParArtifactFromRepository() throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { name, version };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(type, name, version, HALF_SECOND, TWO_MINUTES);
+		assertPlanArtifactNotExists(type, name, version);
+	}
+
+	private static CompositeData deploy(String[] signature, Object[] params)
+			throws Exception {
+		CompositeData compsiteData = (CompositeData) getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		return compsiteData;
+	}
+
+	private void assertPlanArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format(
+				"Plan Artifact referencing par artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertPlanArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format(
+				"Plan Artifact referencing par artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertPlanArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format(
+				"Plan Artifact referencing par artifact %s:%s:%s is still exists", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/pickup/BundleArtifactPickupDeployAndUndeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/pickup/BundleArtifactPickupDeployAndUndeployTests.java
new file mode 100644
index 0000000..6f095e7
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/pickup/BundleArtifactPickupDeployAndUndeployTests.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.server.svt.pickup;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+import java.io.IOException;
+
+import javax.management.MalformedObjectNameException;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.junit.Test;
+
+public class BundleArtifactPickupDeployAndUndeployTests extends
+		AbstractWebTests {
+	private static final String APPS_DIR = "./../test-apps";
+	private static final String[] APPLICATION_NAMES = new String[] { "bundleA.jar" };
+
+	@Test
+	public void bundleArtifactDeploy() throws Exception {
+		copyApplicationsToPickup(getPickupDir(), APPS_DIR, APPLICATION_NAMES);
+		waitForMBeanRegister("bundle", "bundleA", "1.0.0", HALF_SECOND,
+				TWO_MINUTES);
+		assertBundleArtifactExists("bundle", "bundleA", "1.0.0");
+		waitForArtifactState("bundle","bundleA","1.0.0","ACTIVE",HALF_SECOND, TWO_MINUTES);
+		assertBundleArtifactState("bundle", "bundleA", "1.0.0", "ACTIVE");
+	}
+
+	@Test
+	public void bundleArtifactUndeploy() throws Exception {
+		deleteApplicationsFromPickup(getPickupDir(), APPLICATION_NAMES);
+		waitForMBeanDeRegister("bundle", "bundleA", "1.0.0", HALF_SECOND,
+				TWO_MINUTES);
+		assertBundleArtifactNotExists("bundle", "bundleA", "1.0.0");
+	}
+
+	private void assertBundleArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format("Bundle Artifact %s:%s:%s does not exist",
+				type, name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertBundleArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format(
+				"Bundle Artifact %s:%s:%s is not in state %s", type, name,
+				version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertBundleArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format("Bundle Artifact %s:%s:%s is still exists",
+				type, name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/pickup/ConfigurationArtifactPickupDeployAndUndeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/pickup/ConfigurationArtifactPickupDeployAndUndeployTests.java
new file mode 100644
index 0000000..e5d339a
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/pickup/ConfigurationArtifactPickupDeployAndUndeployTests.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.server.svt.pickup;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import javax.management.MalformedObjectNameException;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.junit.Test;
+
+public class ConfigurationArtifactPickupDeployAndUndeployTests extends
+		AbstractWebTests {
+
+	private static final String APPS_DIR = "./../test-apps";
+	private static final String[] APPLICATION_NAMES = new String[] { "foo.properties" };
+
+	@Test
+	public void configurationArtifactDeploy() throws Exception {
+		copyApplicationsToPickup(getPickupDir(), APPS_DIR, APPLICATION_NAMES);
+		waitForMBeanRegister("configuration", "foo", "0.0.0", HALF_SECOND,
+				TWO_MINUTES);
+		assertConfigurationArtifactExists("configuration", "foo", "0.0.0");
+		waitForArtifactState("configuration", "foo", "0.0.0", "ACTIVE",
+				HALF_SECOND, TWO_MINUTES);
+		assertConfigurationArtifactState("configuration", "foo", "0.0.0",
+				"ACTIVE");
+	}
+
+	@Test
+	public void configurationArtifactUndeploy() throws Exception {
+		deleteApplicationsFromPickup(getPickupDir(), APPLICATION_NAMES);
+		waitForMBeanDeRegister("configuration", "foo", "0.0.0", HALF_SECOND,
+				TWO_MINUTES);
+		assertConfigurationArtifactNotExists("configuration", "foo", "0.0.0");
+	}
+
+	private void assertConfigurationArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format(
+				"Configuration Artifact %s:%s:%s does not exist", type, name,
+				version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertConfigurationArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format(
+				"Configuration Artifact %s:%s:%s is not in state %s", type,
+				name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertConfigurationArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format(
+				"Configuration Artifact %s:%s:%s is still exists", type, name,
+				version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/pickup/ParArtifactPickupDeployAndUndeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/pickup/ParArtifactPickupDeployAndUndeployTests.java
new file mode 100644
index 0000000..4bac290
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/pickup/ParArtifactPickupDeployAndUndeployTests.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.server.svt.pickup;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.junit.Test;
+
+public class ParArtifactPickupDeployAndUndeployTests extends AbstractWebTests {
+
+	private static final String APPS_DIR = "./../test-apps";
+	private static final String[] APPLICATION_NAMES = new String[] { "appA.par" };
+
+	@Test
+	public void parArtifactDeploy() throws Exception {
+		copyApplicationsToPickup(getPickupDir(), APPS_DIR, APPLICATION_NAMES);
+		waitForMBeanRegister("par", "appA", "1.0.0", HALF_SECOND, TWO_MINUTES);
+		assertParArtifactExists("par", "appA", "1.0.0");
+		waitForArtifactState("par","appA","1.0.0","ACTIVE",HALF_SECOND, TWO_MINUTES);
+		assertParArtifactState("par", "appA", "1.0.0", "ACTIVE");
+		assertParArtifactDependents("bundle", "bundleA", "1.0.0");
+		assertParArtifactDependents("bundle", "bundleB", "1.0.0");
+		assertParArtifactDependents("configuration", "foo", "0.0.0");
+		assertParArtifactDependents("bundle", "appA-synthetic.context", "1.0.0");
+	}
+
+	@Test
+	public void parArtifactUndeploy() throws Exception {
+		deleteApplicationsFromPickup(getPickupDir(), APPLICATION_NAMES);
+		Thread.sleep(5000);
+		waitForMBeanDeRegister("par", "appA", "1.0.0", HALF_SECOND, TWO_MINUTES);
+		assertParArtifactNotExists("par", "appA", "1.0.0");
+	}
+
+	private void assertParArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format("Par Artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertParArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format("Par Artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertParArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format("Par Artifact %s:%s:%s is still exists",
+				type, name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertParArtifactDependents(String type, String name,
+			String version) throws MalformedObjectNameException, IOException,
+			Exception {
+		ObjectName[] objectNameList = (ObjectName[]) getMBeanServerConnection()
+				.getAttribute(getObjectName("par", "appA", "1.0.0"),
+						"Dependents");
+		for (ObjectName objectName : objectNameList) {
+			assertTrue(String.format(
+					"Par Dependent Artifact %s:%s:%s does not exist", type,
+					name, version), getMBeanServerConnection().isRegistered(
+					objectName));
+		}
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/pickup/PlanArtifactPickupDeployAndUndeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/pickup/PlanArtifactPickupDeployAndUndeployTests.java
new file mode 100644
index 0000000..8a816af
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/pickup/PlanArtifactPickupDeployAndUndeployTests.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.server.svt.pickup;
+
+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 javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class PlanArtifactPickupDeployAndUndeployTests extends AbstractWebTests {
+	private static final String APPS_DIR = "./../test-apps";
+	private static final String[] APPLICATION_NAMES = new String[] { "scopedplan.plan" };
+	private static final String ARTIFACTSDIR = "./../test-apps";
+	private static String[] artifactNames = new String[] { "bundleA.jar",
+			"bundleB.war", "foo.properties" };
+
+	@BeforeClass
+	public static void testContextSetup() throws Exception {
+		copyPlanReferencedArtifactsToRepository(getRepositoryUsrDir(),
+				ARTIFACTSDIR, artifactNames);
+	}
+
+	private static void copyPlanReferencedArtifactsToRepository(String usrDir,
+			String artifactsDir, String[] artifactsNames) throws IOException,
+			InterruptedException {
+		for (String artifactName : artifactsNames) {
+			FileCopyUtils.copy(new File(artifactsDir, artifactName), new File(
+					usrDir, artifactName));
+		}
+	}
+
+	@Test
+	public void planArtifactDeploy() throws Exception {
+		copyApplicationsToPickup(getPickupDir(), APPS_DIR, APPLICATION_NAMES);
+		waitForMBeanRegister("plan", "scoped.plan", "1.0.0", HALF_SECOND,
+				TWO_MINUTES);
+		assertPlanArtifactExists("plan", "scoped.plan", "1.0.0");
+		waitForArtifactState("plan","scoped.plan","1.0.0","ACTIVE",HALF_SECOND, TWO_MINUTES);
+		assertPlanArtifactState("plan", "scoped.plan", "1.0.0", "ACTIVE");
+		assertPlanReferencedArtifacts("bundle", "bundleA", "1.0.0");
+		assertPlanReferencedArtifacts("bundle", "bundleB", "1.0.0");
+		assertPlanReferencedArtifacts("configuration", "foo", "0.0.0");
+		assertPlanReferencedArtifacts("bundle",
+				"scoped.plan-synthetic.context", "1.0.0");
+	}
+
+	@Test
+	public void planArtifactUndeploy() throws Exception {
+		deleteApplicationsFromPickup(getPickupDir(), APPLICATION_NAMES);
+		Thread.sleep(5000);
+		waitForMBeanDeRegister("plan", "scoped.plan", "1.0.0", HALF_SECOND,
+				TWO_MINUTES);
+		assertPlanArtifactNotExists("plan", "scoped.plan", "1.0.0");
+	}
+
+	private void assertPlanArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format("Plan Artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertPlanArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format("Plan Artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertPlanArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format("Plan Artifact %s:%s:%s is still exists",
+				type, name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertPlanReferencedArtifacts(String type, String name,
+			String version) throws MalformedObjectNameException, IOException,
+			Exception {
+		ObjectName[] objectNameList = (ObjectName[]) getMBeanServerConnection()
+				.getAttribute(getObjectName("plan", "scoped.plan", "1.0.0"),
+						"Dependents");
+		for (ObjectName objectName : objectNameList) {
+			assertTrue(String.format(
+					"Plan Referenced Artifact %s:%s:%s does not exist", type,
+					name, version), getMBeanServerConnection().isRegistered(
+					objectName));
+		}
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/rfc66/Rfc66Servlet24WarDeployAndUndeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/rfc66/Rfc66Servlet24WarDeployAndUndeployTests.java
new file mode 100644
index 0000000..29b52a5
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/rfc66/Rfc66Servlet24WarDeployAndUndeployTests.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.server.svt.rfc66;
+
+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 javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.junit.Test;
+
+public class Rfc66Servlet24WarDeployAndUndeployTests extends AbstractWebTests {
+
+	private static final String APP_URI = "./apps/servlet2.4-war.war";
+	private static String type = null;
+	private static String name = null;
+	private static String version = null;
+	private static String[] signature = null;
+	private static Object[] params = null;
+
+	@Test
+	public void testServlet24WarDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI).toURI().toString() };
+
+		CompositeData compositeData = deploy(signature, params);
+		name = compositeData.get("symbolicName").toString();
+		type = compositeData.get("type").toString();
+		version = compositeData.get("version").toString();
+
+		waitForMBeanRegister(type, name, version, HALF_SECOND, TWO_MINUTES);
+		assertServlet24WarArtifactExists(type, name, version);
+		UrlWaitLatch.waitFor("http://localhost:8080/servlet2.4-war/test.htm");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/servlet2.4-war/requestForward.htm");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/servlet2.4-war/requestInclude.htm");
+		assertServlet24WarArtifactState(type, name, version, "ACTIVE");
+	}
+
+	@Test
+	public void testServlet24WarUnDeploy() throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { name, version };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(type, name, version, HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch.waitForNotExistence("http://localhost:8080/servlet2.4-war/");
+		assertServlet24WarArtifactNotExists(type, name, version);
+	}
+
+	private static CompositeData deploy(String[] signature, Object[] params)
+			throws Exception {
+		CompositeData compsiteData = (CompositeData) getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		return compsiteData;
+	}
+
+	private void assertServlet24WarArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format(
+				"Servlet24 war Bundle Artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertServlet24WarArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format(
+				"Servlet24 war Bundle Artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertServlet24WarArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format(
+				"Servlet24 war Bundle Artifact %s:%s:%s is still exists", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/rfc66/Rfc66Servlet25WarDeployAndUndeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/rfc66/Rfc66Servlet25WarDeployAndUndeployTests.java
new file mode 100644
index 0000000..3fbac24
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/rfc66/Rfc66Servlet25WarDeployAndUndeployTests.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.server.svt.rfc66;
+
+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 javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.junit.Test;
+
+public class Rfc66Servlet25WarDeployAndUndeployTests extends AbstractWebTests {
+
+	private static final String APP_URI = "./apps/servlet2.5-war.war";
+	private static String type = null;
+	private static String name = null;
+	private static String version = null;
+	private static String[] signature = null;
+	private static Object[] params = null;
+
+	@Test
+	public void testServlet25WarDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI).toURI().toString() };
+
+		CompositeData compositeData = deploy(signature, params);
+		name = compositeData.get("symbolicName").toString();
+		type = compositeData.get("type").toString();
+		version = compositeData.get("version").toString();
+
+		waitForMBeanRegister(type, name, version, HALF_SECOND, TWO_MINUTES);
+		assertServlet25WarArtifactExists(type, name, version);
+		UrlWaitLatch.waitFor("http://localhost:8080/servlet2.5-war/test.htm");
+		UrlWaitLatch.waitFor("http://localhost:8080/servlet2.5-war/first.htm");
+		UrlWaitLatch.waitFor("http://localhost:8080/servlet2.5-war/second.htm");
+		assertServlet25WarArtifactState(type, name, version, "ACTIVE");
+	}
+
+	@Test
+	public void testServlet25WarUnDeploy() throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { name, version };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(type, name, version, HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch.waitForNotExistence("http://localhost:8080/servlet2.5-war/test.htm");
+		assertServlet25WarArtifactNotExists(type, name, version);
+	}
+
+	private static CompositeData deploy(String[] signature, Object[] params)
+			throws Exception {
+		CompositeData compsiteData = (CompositeData) getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		return compsiteData;
+	}
+
+	private void assertServlet25WarArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format(
+				"Servlet25 war Bundle Artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertServlet25WarArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format(
+				"Servlet25 war Bundle Artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertServlet25WarArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format(
+				"Servlet25 war Bundle Artifact %s:%s:%s is still exists", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/FormTagsDeployAndUndeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/FormTagsDeployAndUndeployTests.java
new file mode 100644
index 0000000..a0ad656
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/FormTagsDeployAndUndeployTests.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.server.svt.samples;
+
+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 javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.junit.Test;
+
+
+public class FormTagsDeployAndUndeployTests extends AbstractWebTests {
+
+	private static final String APP_URI_PAR = "./apps/formtags-par-2.0.1.BUILD-20100413113234.par";
+	private static final String APP_URI_WAR = "./apps/formtags-war-2.0.1.BUILD-20100413113234.war";
+	private static final String APP_URI_BUNDLE = "./apps/formtags-shared-services-service-2.0.1.BUILD-20100413113234.jar";
+	private static final String APP_URI_SHARED_SERVICES_WAR = "./apps/formtags-shared-services-war-2.0.1.BUILD-20100413113234.war";
+	private static final String APP_URI_SHARED_LIBRARIES_WAR = "./apps/formtags-shared-libs-2.0.1.BUILD-20100413113234.war";
+
+	private static String artifactType1 = null;
+	private static String artifactName1 = null;
+	private static String artifactVersion1 = null;
+	
+	private static String artifactType2 = null;
+	private static String artifactName2 = null;
+	private static String artifactVersion2 = null;
+	
+	private static String artifactType3 = null;
+	private static String artifactName3 = null;
+	private static String artifactVersion3 = null;
+	
+	private static String artifactType4 = null;
+	private static String artifactName4 = null;
+	private static String artifactVersion4 = null;
+	
+	private static String artifactType5 = null;
+	private static String artifactName5 = null;
+	private static String artifactVersion5 = null;
+	
+	private static String[] signature = null;
+	private static Object[] params = null;
+
+	@Test
+	public void testFormTagsParDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_PAR).toURI().toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName1 = compositeData.get("symbolicName").toString();
+		artifactType1 = compositeData.get("type").toString();
+		artifactVersion1 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType1, artifactName1, artifactVersion1,
+				HALF_SECOND, TWO_MINUTES);
+		assertArtifactExists(artifactType1, artifactName1, artifactVersion1);
+
+		ObjectName[] objectNameList = (ObjectName[]) getMBeanServerConnection()
+				.getAttribute(
+						getObjectName(artifactType1, artifactName1,
+								artifactVersion1), "Dependents");
+		for (ObjectName objectName : objectNameList) {
+			assertParArtifactDependents(objectName);
+		}
+		UrlWaitLatch.waitFor("http://localhost:8080/formtags-par");
+		UrlWaitLatch.waitFor("http://localhost:8080/formtags-par/list.htm");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-par/form.htm?id=1");
+		assertArtifactState(artifactType1, artifactName1, artifactVersion1,
+				"ACTIVE");
+	}
+	
+	@Test
+	public void testFormTagsParUndeploy() throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName1, artifactVersion1 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType1, artifactName1, artifactVersion1,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch.waitForNotExistence("http://localhost:8080/formtags-par");
+		assertArtifactNotExists(artifactType1, artifactName1, artifactVersion1);
+	}
+
+	@Test
+	public void testFormTagsWarDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_WAR).toURI().toString() };
+
+		CompositeData compositeData = deploy(signature, params);
+		artifactName2 = compositeData.get("symbolicName").toString();
+		artifactType2 = compositeData.get("type").toString();
+		artifactVersion2 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType2, artifactName2, artifactVersion2,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-war-2.0.1.BUILD-20100413113234");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-war-2.0.1.BUILD-20100413113234/list.htm");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-war-2.0.1.BUILD-20100413113234/form.htm?id=1");
+		assertArtifactExists(artifactType2, artifactName2, artifactVersion2);
+		assertArtifactState(artifactType2, artifactName2, artifactVersion2,
+				"ACTIVE");
+	}
+	
+	@Test
+	public void testFormTagsWarUndeploy() throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName2, artifactVersion2 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType2, artifactName2, artifactVersion2,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitForNotExistence("http://localhost:8080/formtags-war-2.0.1.BUILD-20100413113234");
+		assertArtifactNotExists(artifactType2, artifactName2, artifactVersion2);
+	}
+
+	@Test
+	public void testFormTagsBundleDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_BUNDLE).toURI().toString() };
+
+		CompositeData compositeData = deploy(signature, params);
+		artifactName3 = compositeData.get("symbolicName").toString();
+		artifactType3 = compositeData.get("type").toString();
+		artifactVersion3 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType3, artifactName3, artifactVersion3,
+				HALF_SECOND, TWO_MINUTES);
+		assertArtifactExists(artifactType3, artifactName3, artifactVersion3);
+		assertArtifactState(artifactType3, artifactName3, artifactVersion3,
+				"ACTIVE");
+	}
+
+
+	@Test
+	public void testFormTagsSharedServicesWarDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_SHARED_SERVICES_WAR).toURI()
+				.toString() };
+
+		CompositeData compositeData = deploy(signature, params);
+		artifactName4 = compositeData.get("symbolicName").toString();
+		artifactType4 = compositeData.get("type").toString();
+		artifactVersion4 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType4, artifactName4, artifactVersion4,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-shared-services-war-2.0.1.BUILD-20100413113234");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-shared-services-war-2.0.1.BUILD-20100413113234/list.htm");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-shared-services-war-2.0.1.BUILD-20100413113234/form.htm?id=1");
+		assertArtifactExists(artifactType4, artifactName4, artifactVersion4);
+		assertArtifactState(artifactType4, artifactName4, artifactVersion4,
+				"ACTIVE");
+	}
+
+	@Test
+	public void testFormTagsSharedServicesWarUndeploy() throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName4, artifactVersion4 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType4, artifactName4, artifactVersion4,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitForNotExistence("http://localhost:8080/formtags-shared-services-war-2.0.1.BUILD-20100413113234");
+		assertArtifactNotExists(artifactType4, artifactName4, artifactVersion4);
+	}
+	
+	@Test
+	public void testFormTagsSharedLibrariesWarDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_SHARED_LIBRARIES_WAR).toURI()
+				.toString() };
+
+		CompositeData compositeData = deploy(signature, params);
+		artifactName5 = compositeData.get("symbolicName").toString();
+		artifactType5 = compositeData.get("type").toString();
+		artifactVersion5 = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType5, artifactName5, artifactVersion5,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-shared-libs-2.0.1.BUILD-20100413113234");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-shared-libs-2.0.1.BUILD-20100413113234/list.htm");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-shared-libs-2.0.1.BUILD-20100413113234/form.htm?id=1");
+		assertArtifactExists(artifactType5, artifactName5, artifactVersion5);
+		assertArtifactState(artifactType5, artifactName5, artifactVersion5,
+				"ACTIVE");
+	}
+	
+	@Test
+	public void testFormTagsSharedLibrariesWarUndeploy() throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName5, artifactVersion5 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType5, artifactName5, artifactVersion5,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitForNotExistence("http://localhost:8080/formtags-shared-libs-2.0.1.BUILD-20100413113234");
+		assertArtifactNotExists(artifactType5, artifactName5, artifactVersion5);
+	}
+
+	private static CompositeData deploy(String[] signature, Object[] params)
+			throws Exception {
+		CompositeData compsiteData = (CompositeData) getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		return compsiteData;
+	}
+
+	private void assertArtifactExists(String type, String name, String version)
+			throws IOException, Exception, MalformedObjectNameException {
+		assertTrue(String.format("Artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+	
+	private void assertArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format("Artifact %s:%s:%s is still exists", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertArtifactState(String type, String name, String version,
+			String state) throws MalformedObjectNameException, IOException,
+			Exception {
+		assertEquals(String.format("Artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertParArtifactDependents(ObjectName objectName)
+			throws MalformedObjectNameException, IOException, Exception {
+
+		assertTrue("par dependent artifact does not exist",
+				getMBeanServerConnection().isRegistered(objectName));
+		assertEquals(String.format("par dependent artifact is not in state %s",
+				"ACTIVE"), "ACTIVE", getMBeanServerConnection().getAttribute(
+				objectName, "State"));
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/FormTagsEmailParDeployAndUndeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/FormTagsEmailParDeployAndUndeployTests.java
new file mode 100644
index 0000000..178b05c
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/FormTagsEmailParDeployAndUndeployTests.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.server.svt.samples;
+
+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 javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.junit.Test;
+
+public class FormTagsEmailParDeployAndUndeployTests extends AbstractWebTests {
+	private static final String APP_URI = "./apps/formtags-email-par.par";
+
+	private static String artifactType = null;
+	private static String artifactName = null;
+	private static String artifactVersion = null;
+	private static String[] signature = null;
+	private static Object[] params = null;
+
+	@Test
+	public void testFormTagsEmailParDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI).toURI().toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName = compositeData.get("symbolicName").toString();
+		artifactType = compositeData.get("type").toString();
+		artifactVersion = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType, artifactName, artifactVersion,
+				HALF_SECOND, TWO_MINUTES);
+		assertFormtagsEmailParArtifactExists(artifactType, artifactName,
+				artifactVersion);
+
+		ObjectName[] objectNameList = (ObjectName[]) getMBeanServerConnection()
+				.getAttribute(
+						getObjectName(artifactType, artifactName,
+								artifactVersion), "Dependents");
+		for (ObjectName objectName : objectNameList) {
+			assertFormtagsEmailParArtifactDependents(objectName);
+		}
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formTagsParWithWebModule/list.htm");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formTagsParWithWebModule/bundleContext.htm");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formTagsParWithWebModule/servletContext.htm");
+		assertFormtagsEmailParArtifactState(artifactType, artifactName,
+				artifactVersion, "ACTIVE");
+	}
+
+	@Test
+	public void testFormtagsEmailParUndeploy() throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName, artifactVersion };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType, artifactName, artifactVersion,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitForNotExistence("http://localhost:8080/formTagsParWithWebModule");
+		assertFormtagsEmailParArtifactNotExists(artifactType, artifactName,
+				artifactVersion);
+	}
+
+	private static CompositeData deploy(String[] signature, Object[] params)
+			throws Exception {
+		CompositeData compsiteData = (CompositeData) getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		return compsiteData;
+	}
+
+	private void assertFormtagsEmailParArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format(
+				"Formtags Email Par Artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertFormtagsEmailParArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format(
+				"Formtags Email Par Artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertFormtagsEmailParArtifactNotExists(String type,
+			String name, String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format(
+				"Formtags Email Par Artifact %s:%s:%s is still exists", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertFormtagsEmailParArtifactDependents(ObjectName objectName)
+			throws MalformedObjectNameException, IOException, Exception {
+		assertTrue("Formtags email par dependent artifact does not exist",
+				getMBeanServerConnection().isRegistered(objectName));
+		assertEquals(String.format(
+				"Formtags email par dependent artifact is not in state %s",
+				"ACTIVE"), "ACTIVE", getMBeanServerConnection().getAttribute(
+				objectName, "State"));
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/GreenPagesParDeployAndUndeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/GreenPagesParDeployAndUndeployTests.java
new file mode 100644
index 0000000..c84c16c
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/GreenPagesParDeployAndUndeployTests.java
@@ -0,0 +1,126 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.server.svt.samples;
+
+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 javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.junit.Test;
+
+public class GreenPagesParDeployAndUndeployTests extends AbstractWebTests {
+	private static final String APP_URI = "./apps/greenpages-solution-2.0.1.SNAPSHOT.par";
+	private static String artifactType = null;
+	private static String artifactName = null;
+	private static String artifactVersion = null;
+	private static String[] signature = null;
+	private static Object[] params = null;
+
+	@Test
+	public void testGreenPagesParDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI).toURI().toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName = compositeData.get("symbolicName").toString();
+		artifactType = compositeData.get("type").toString();
+		artifactVersion = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType, artifactName, artifactVersion,
+				HALF_SECOND, TWO_MINUTES);
+		assertGreenpagesParArtifactExists(artifactType, artifactName,
+				artifactVersion);
+
+		ObjectName[] objectNameList = (ObjectName[]) getMBeanServerConnection()
+				.getAttribute(
+						getObjectName(artifactType, artifactName,
+								artifactVersion), "Dependents");
+		for (ObjectName objectName : objectNameList) {
+			assertGreenpagesParArtifactDependents(objectName);
+		}
+		UrlWaitLatch.waitFor("http://localhost:8080/greenpages/app/home.htm");
+		assertGreenpagesParArtifactState(artifactType, artifactName,
+				artifactVersion, "ACTIVE");
+	}
+
+	@Test
+	public void testGreenPagesParUndeploy() throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { artifactName, artifactVersion };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(artifactType, artifactName, artifactVersion,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch.waitForNotExistence("http://localhost:8080/greenpages/");
+		assertGreenpagesParArtifactNotExists(artifactType, artifactName,
+				artifactVersion);
+	}
+
+	private static CompositeData deploy(String[] signature, Object[] params)
+			throws Exception {
+		CompositeData compsiteData = (CompositeData) getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		return compsiteData;
+	}
+
+	private void assertGreenpagesParArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format(
+				"Greenapges par artifact %s:%s:%s does not exist", type, name,
+				version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertGreenpagesParArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format(
+				"Greenpages par artifact %s:%s:%s is not in state %s", type,
+				name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertGreenpagesParArtifactDependents(ObjectName objectName)
+			throws MalformedObjectNameException, IOException, Exception {
+		assertTrue("Greenpgaes par dependent artifact does not exist",
+				getMBeanServerConnection().isRegistered(objectName));
+		assertEquals(String.format(
+				"Greenpgaes par dependent artifact is not in state %s",
+				"ACTIVE"), "ACTIVE", getMBeanServerConnection().getAttribute(
+				objectName, "State"));
+	}
+
+	private void assertGreenpagesParArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format(
+				"Greenpages par Artifact %s:%s:%s is still exists", type, name,
+				version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/HelloWorldSharedServicesWarDeployAndUndeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/HelloWorldSharedServicesWarDeployAndUndeployTests.java
new file mode 100644
index 0000000..63e7ba6
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/HelloWorldSharedServicesWarDeployAndUndeployTests.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.server.svt.samples;
+
+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 javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.junit.Test;
+
+
+public class HelloWorldSharedServicesWarDeployAndUndeployTests extends
+		AbstractWebTests {
+	private static final String APP_URI_BUNDLE1 = "./apps/hello.domain.jar";
+	private static final String APP_URI_BUNDLE2 = "./apps/hello.service.api.jar";
+	private static final String APP_URI_BUNDLE3 = "./apps/hello.service.impl-en.jar";
+	private static final String APP_URI_SHARED_SERVICES_WAR = "./apps/hello_war_shared_services.war";
+
+	private static String type = null;
+	private static String name = null;
+	private static String version = null;
+	private static String[] signature = null;
+	private static Object[] params = null;
+	private static CompositeData compositeData=null;
+
+	@Test
+	public void testSharedServicesWarDeployWithDependencies() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_BUNDLE1).toURI().toString() };
+		compositeData = deploy(signature, params);
+		name = compositeData.get("symbolicName").toString();
+		type = compositeData.get("type").toString();
+		version = compositeData.get("version").toString();
+
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		waitForMBeanRegister(type, name, version, HALF_SECOND, TWO_MINUTES);
+		assertArtifactExists(type, name, version);
+		assertArtifactState(type, name, version, "ACTIVE");
+
+		params = new Object[] { new File(APP_URI_BUNDLE2).toURI().toString() };
+		compositeData = deploy(signature, params);
+		name = compositeData.get("symbolicName").toString();
+		type = compositeData.get("type").toString();
+		version = compositeData.get("version").toString();
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		waitForMBeanRegister(type, name, version, HALF_SECOND, TWO_MINUTES);
+		assertArtifactExists(type, name, version);
+		assertArtifactState(type, name, version, "ACTIVE");
+
+		params = new Object[] { new File(APP_URI_BUNDLE3).toURI().toString() };
+		compositeData = deploy(signature, params);
+		name = compositeData.get("symbolicName").toString();
+		type = compositeData.get("type").toString();
+		version = compositeData.get("version").toString();
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		waitForMBeanRegister(type, name, version, HALF_SECOND, TWO_MINUTES);
+		assertArtifactExists(type, name, version);
+		assertArtifactState(type, name, version, "ACTIVE");
+
+		params = new Object[] { new File(APP_URI_SHARED_SERVICES_WAR).toURI()
+				.toString() };
+		compositeData = deploy(signature, params);
+		name = compositeData.get("symbolicName").toString();
+		type = compositeData.get("type").toString();
+		version = compositeData.get("version").toString();
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		waitForMBeanRegister(type, name, version, HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/hello_war_shared_services/");
+		assertArtifactExists(type, name, version);
+		assertArtifactState(type, name, version, "ACTIVE");
+	}
+
+	@Test
+	public void testSharedServicesWarUndeployWithDependencies()
+			throws Exception, InterruptedException {
+		String[] signature = { String.class.getName(), String.class.getName() };
+		Object[] params1 = { "hello_war_shared_services", "1.0.0" };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params1, signature);
+		waitForMBeanDeRegister("bundle", "hello_war_shared_services", "1.0.0",
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitForNotExistence("http://localhost:8080/hello_war_shared_services/");
+		assertArtifactNotExists("bundle", "hello_war_shared_services", "1.0.0");
+
+		Object[] params2 = { "hello.service.impl_en", "1.0.0" };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params2, signature);
+		waitForMBeanDeRegister("bundle", "hello.service.impl_en", "1.0.0",
+				HALF_SECOND, TWO_MINUTES);
+		assertArtifactNotExists("bundle", "hello.service.impl_en", "1.0.0");
+
+		Object[] params3 = { "hello.service.api", "1.0.0" };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params3, signature);
+		waitForMBeanDeRegister("bundle", "hello.service.api", "1.0.0",
+				HALF_SECOND, TWO_MINUTES);
+		assertArtifactNotExists("bundle", "hello.service.api", "1.0.0");
+
+		Object[] params4 = { "hello.domain", "1.0.0" };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params4, signature);
+		waitForMBeanDeRegister("bundle", "hello.domain", "1.0.0", HALF_SECOND,
+				TWO_MINUTES);
+		assertArtifactNotExists("bundle", "hello.domain", "1.0.0");
+	}
+
+	private static CompositeData deploy(String[] signature, Object[] params)
+			throws Exception {
+		CompositeData compsiteData = (CompositeData) getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		return compsiteData;
+	}
+
+	private void assertArtifactExists(String type, String name, String version)
+			throws IOException, Exception, MalformedObjectNameException {
+		assertTrue(String.format("Artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertArtifactState(String type, String name, String version,
+			String state) throws MalformedObjectNameException, IOException,
+			Exception {
+		assertEquals(String.format("Artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format("Artifact %s:%s:%s is still exists", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/StrutsFrameworkWarDeployAndUndeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/StrutsFrameworkWarDeployAndUndeployTests.java
new file mode 100644
index 0000000..daca94a
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/StrutsFrameworkWarDeployAndUndeployTests.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.server.svt.samples;
+
+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 javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.junit.Test;
+
+public class StrutsFrameworkWarDeployAndUndeployTests extends AbstractWebTests {
+	private static final String APP_URI = "./target/bundles/struts2-mailreader.war";
+	private static String type = null;
+	private static String name = null;
+	private static String version = null;
+	private static String[] signature = null;
+	private static Object[] params = null;
+
+	@Test
+	public void testStrutsWarDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI).toURI().toString() };
+
+		CompositeData compositeData = deploy(signature, params);
+		name = compositeData.get("symbolicName").toString();
+		type = compositeData.get("type").toString();
+		version = compositeData.get("version").toString();
+
+		waitForMBeanRegister(type, name, version, HALF_SECOND, TWO_MINUTES);
+		assertStrutsWarArtifactExists(type, name, version);
+		UrlWaitLatch.waitFor("http://localhost:8080/struts2-mailreader/");
+		assertStrutsWarArtifactState(type, name, version, "ACTIVE");
+	}
+
+	@Test
+	public void testStrutsWarUnDeploy() throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { name, version };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(type, name, version, HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch.waitForNotExistence("http://localhost:8080/struts2-mailreader/");
+		assertStrutsWarArtifactNotExists(type, name, version);
+	}
+
+	private static CompositeData deploy(String[] signature, Object[] params)
+			throws Exception {
+		CompositeData compsiteData = (CompositeData) getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		return compsiteData;
+	}
+
+	private void assertStrutsWarArtifactExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format(
+				"Struts war Bundle Artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertStrutsWarArtifactState(String type, String name,
+			String version, String state) throws MalformedObjectNameException,
+			IOException, Exception {
+		assertEquals(String.format(
+				"Struts war Bundle Artifact %s:%s:%s is not in state %s", type,
+				name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertStrutsWarArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format(
+				"Struts war Bundle Artifact %s:%s:%s is still exists", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/WarEmailDeployAndUndeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/WarEmailDeployAndUndeployTests.java
new file mode 100644
index 0000000..af117fa
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/WarEmailDeployAndUndeployTests.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.server.svt.samples;
+
+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 javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.junit.Test;
+import com.dumbster.smtp.SimpleSmtpServer;
+
+public class WarEmailDeployAndUndeployTests extends AbstractWebTests {
+
+	private static final String APP_EMAIL_SHARED_LIBS_URI = "./apps/email-shared-libs-war.war";
+	private static final String APP_EMAIL_STANDARD_WAR_URI = "./apps/email-standard-war.war";
+
+	protected static final int SMTP_PORT = 2525;
+	SimpleSmtpServer server = null;
+	private static String type1 = null;
+	private static String name1 = null;
+	private static String version1 = null;
+	
+	private static String type2 = null;
+	private static String name2 = null;
+	private static String version2 = null;
+	
+	private static String[] signature = null;
+	private static Object[] params = null;
+
+	@Test
+	public void testEmailSharedLibsWarDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_EMAIL_SHARED_LIBS_URI).toURI()
+				.toString() };
+		CompositeData compositeData = deploy(signature, params);
+		name1 = compositeData.get("symbolicName").toString();
+		type1 = compositeData.get("type").toString();
+		version1 = compositeData.get("version").toString();
+		waitForMBeanRegister(type1, name1, version1, HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/email-shared-libs-war/send?subject=Hola,%20Mundo");
+		server = SimpleSmtpServer.start(SMTP_PORT);
+
+		assertEquals("Verifying initial number of e-mails sent.", 0, server
+				.getReceivedEmailSize());
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/email-shared-libs-war/send?subject=Hola,%20Mundo");
+
+		assertEquals("Verifying final number of e-mails sent.", 1, server
+				.getReceivedEmailSize());
+		server.stop();
+		assertArtifactExists(type1, name1, version1);
+		assertArtifactState(type1, name1, version1, "ACTIVE");
+	}
+
+	@Test
+	public void testEmailSharedLibsWarUndeploy() throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { name1, version1 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(type1, name1, version1, HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitForNotExistence("http://localhost:8080/email-shared-libs-war");
+		assertArtifactNotExists(type1, name1, version1);
+	}
+
+	@Test
+	public void testEmailStandardWarDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_EMAIL_STANDARD_WAR_URI).toURI()
+				.toString() };
+		CompositeData compositeData = deploy(signature, params);
+		name2 = compositeData.get("symbolicName").toString();
+		type2 = compositeData.get("type").toString();
+		version2 = compositeData.get("version").toString();
+		waitForMBeanRegister(type2, name2, version2, HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/email-standard-war/send?subject=Hola,%20Mundo");
+		server = SimpleSmtpServer.start(SMTP_PORT);
+
+		assertEquals("Verifying initial number of e-mails sent.", 0, server
+				.getReceivedEmailSize());
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/email-standard-war/send?subject=Hola,%20Mundo");
+		assertEquals("Verifying final number of e-mails sent.", 1, server
+				.getReceivedEmailSize());
+		server.stop();
+		assertArtifactExists(type2, name2, version2);
+		assertArtifactState(type2, name2, version2, "ACTIVE");
+	}
+
+	@Test
+	public void testEmailStandardWarUndeploy() throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { name2, version2 };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(type2, name2, version2, HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitForNotExistence("http://localhost:8080/email-standard-war");
+		assertArtifactNotExists(type2, name2, version2);
+	}
+
+	private static CompositeData deploy(String[] signature, Object[] params)
+			throws Exception {
+		CompositeData compsiteData = (CompositeData) getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		return compsiteData;
+	}
+
+	private void assertArtifactExists(String type, String name, String version)
+			throws IOException, Exception, MalformedObjectNameException {
+		assertTrue(String.format("Artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertArtifactState(String type, String name, String version,
+			String state) throws MalformedObjectNameException, IOException,
+			Exception {
+		assertEquals(String.format("Artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertArtifactNotExists(String type, String name,
+			String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(String.format("Artifact %s:%s:%s is still exists", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/WicketFrameworkWarDeployAndUndeployTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/WicketFrameworkWarDeployAndUndeployTests.java
new file mode 100644
index 0000000..22b9ae9
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/samples/WicketFrameworkWarDeployAndUndeployTests.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.server.svt.samples;
+
+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 javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.junit.Ignore;
+import org.junit.Test;
+
+
+@Ignore
+public class WicketFrameworkWarDeployAndUndeployTests extends AbstractWebTests {
+
+	private static final String APP_URI = "./target/bundles/phonebook.war";
+	private static String type = null;
+	private static String name = null;
+	private static String version = null;
+	private static String[] signature = null;
+	private static Object[] params = null;
+
+	@Test
+	public void testWicketWarDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI).toURI().toString() };
+
+		CompositeData compositeData = deploy(signature, params);
+		name = compositeData.get("symbolicName").toString();
+		type = compositeData.get("type").toString();
+		version = compositeData.get("version").toString();
+
+		waitForMBeanRegister(type, name, version, HALF_SECOND, TWO_MINUTES);
+		assertWicketFrameworkWarArtifactExists(type, name, version);
+		UrlWaitLatch.waitFor("http://localhost:8080/wicket-phonebook/");
+		assertWicketFrameworkWarArtifactState(type, name, version, "ACTIVE");
+	}
+
+	@Test
+	public void testWicketWarUndeploy() throws Exception {
+		signature = new String[] { String.class.getName(),
+				String.class.getName() };
+		params = new Object[] { name, version };
+		getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"undeploy", params, signature);
+		waitForMBeanDeRegister(type, name, version, HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch.waitForNotExistence("http://localhost:8080/wicket-phonebook/");
+		assertWicketFrameworkWarArtifactNotExists(type, name, version);
+	}
+
+	private static CompositeData deploy(String[] signature, Object[] params)
+			throws Exception {
+		CompositeData compsiteData = (CompositeData) getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		return compsiteData;
+	}
+
+	private void assertWicketFrameworkWarArtifactExists(String type,
+			String name, String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertTrue(String.format(
+				"Wicket framework war Bundle Artifact %s:%s:%s does not exist",
+				type, name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertWicketFrameworkWarArtifactState(String type,
+			String name, String version, String state)
+			throws MalformedObjectNameException, IOException, Exception {
+		assertEquals(
+				String
+						.format(
+								"Wicket framework war Bundle Artifact %s:%s:%s is not in state %s",
+								type, name, version, state), state,
+				getMBeanServerConnection().getAttribute(
+						getObjectName(type, name, version), "State"));
+	}
+
+	private void assertWicketFrameworkWarArtifactNotExists(String type,
+			String name, String version) throws IOException, Exception,
+			MalformedObjectNameException {
+		assertFalse(
+				String
+						.format(
+								"Wicket framework war Bundle Artifact %s:%s:%s is still exists",
+								type, name, version),
+				getMBeanServerConnection().isRegistered(
+						getObjectName(type, name, version)));
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/startclean/AddAndRemoveBundlesToRepositoryTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/startclean/AddAndRemoveBundlesToRepositoryTests.java
new file mode 100644
index 0000000..3c648c3
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/startclean/AddAndRemoveBundlesToRepositoryTests.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.server.svt.startclean;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+public class AddAndRemoveBundlesToRepositoryTests extends AbstractWebTests {
+
+	private static String[] bundleNames = new String[] {
+			"com.springsource.freemarker-2.3.15.jar",
+			"com.springsource.javax.persistence-1.0.0.jar",
+			"com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar",
+			"com.springsource.org.apache.commons.pool-1.3.0.jar",
+			"com.springsource.org.eclipse.persistence-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.antlr-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.asm-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.jpa-1.0.0.jar",
+			"com.springsource.org.h2-1.0.71.jar", "hello.domain.jar",
+			"hello.service.api.jar", "hello.service.impl-en.jar","bundleA.jar","bundleB.war","foo.properties","appA.par" };
+	private static String[] bundleNames_watched = new String[] {
+			"com.springsource.freemarker-2.3.15.jar",
+			"com.springsource.javax.persistence-1.0.0.jar",
+			"com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar",
+			"com.springsource.org.apache.commons.pool-1.3.0.jar",
+			"com.springsource.org.eclipse.persistence-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.antlr-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.asm-1.0.0.jar",
+			"com.springsource.org.eclipse.persistence.jpa-1.0.0.jar",
+			"com.springsource.org.h2-1.0.71.jar" };
+	private static String[] bundle = new String[] { "org.springframework.dmServer.testtool.incoho.domain-1.0.0.RELEASE.jar" };
+	private static String[] library = new String[] { "org.springframework.spring-library-2.5.4.A.libd" };
+	private static final String bundlesDir = "src/test/resources/bundles";
+	private static final String librariesDir = "src/test/resources/libraries";
+	private static String repositoryPropertiesDir = "src/test/resources/org.eclipse.virgo.repository.properties";
+	private static String hostedRepositoryPropertiesDir = "src/test/resources/org.eclipse.virgo.apps.repository.properties";
+
+	public void addBundlesToRepository(String repoDir) throws Exception {
+		for (String bundleName : bundle) {
+			FileCopyUtils.copy(new File(bundlesDir, bundleName), new File(
+					repoDir, bundleName));
+		}
+	}
+
+	public void addLibrariesToRepository(String repoDir) throws Exception {
+		for (String libraryName : library) {
+			FileCopyUtils.copy(new File(librariesDir, libraryName), new File(
+					repoDir, libraryName));
+		}
+	}
+
+	public void addBundlesAndLibrariesToHostedRepository(String repoDir)
+			throws Exception {
+		for (String bundleName : bundleNames) {
+			FileCopyUtils.copy(new File(bundlesDir, bundleName), new File(
+					repoDir, bundleName));
+		}
+		for (String libraryName : library) {
+			FileCopyUtils.copy(new File(librariesDir, libraryName), new File(
+					repoDir, libraryName));
+		}
+	}
+
+	public void addBundlesAndLibrariesToWatchedRepository(String repoDir)
+			throws Exception {
+		for (String bundleName : bundleNames_watched) {
+			FileCopyUtils.copy(new File(bundlesDir, bundleName), new File(
+					repoDir, bundleName));
+		}
+		for (String libraryName : library) {
+			FileCopyUtils.copy(new File(librariesDir, libraryName), new File(
+					repoDir, libraryName));
+		}
+	}
+
+	public void updateHostedRepoProperties(String hostedRepoPropertiesDir)
+			throws IOException {
+		FileCopyUtils.copy(new File(hostedRepositoryPropertiesDir), new File(
+				hostedRepoPropertiesDir));
+	}
+
+	public void updateRepositoryProperties(String repoPropertiesDir)
+			throws IOException {
+		FileCopyUtils.copy(new File(repositoryPropertiesDir), new File(
+				repoPropertiesDir));
+	}
+
+	@Test
+	public void testAddedBundlesToRepository() throws Exception {
+		addBundlesToRepository(getRepositoryUsrDir());
+		addBundlesToRepository(getRepositoryExtDir());
+		addLibrariesToRepository(getRepositoryUsrDir());
+		addLibrariesToRepository(getRepositoryExtDir());
+		updateHostedRepoProperties(getHostedRepositoryPropertiesDir());
+		addBundlesAndLibrariesToHostedRepository(getHostedRepoDir());
+		updateRepositoryProperties(getRepositoryPropertiesDir());
+		addBundlesAndLibrariesToWatchedRepository(getWatchedRepoDir());
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/startclean/CopyTempFilesToWorkAndServiceabilityDirectoriesForCleanStartTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/startclean/CopyTempFilesToWorkAndServiceabilityDirectoriesForCleanStartTests.java
new file mode 100644
index 0000000..8852863
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/startclean/CopyTempFilesToWorkAndServiceabilityDirectoriesForCleanStartTests.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.server.svt.startclean;
+
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+
+import org.junit.Test;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.util.io.FileCopyUtils;
+
+
+public class CopyTempFilesToWorkAndServiceabilityDirectoriesForCleanStartTests extends AbstractWebTests{
+
+	private static final String APPS_DIR = "./src/test/resources";
+	private static final String fileName = "temp.txt";
+
+	protected static void copyTempFileToWorkAndServiceability(String tempDir,
+			String fileName, String checkDir) throws IOException {
+		FileCopyUtils.copy(new File(tempDir, fileName), new File(checkDir,
+				fileName));
+	}
+
+	@Test
+	public void testCopyTempFileToWorkAndServiceabilityDir() throws Exception {
+		copyTempFileToWorkAndServiceability(APPS_DIR, fileName, getWorkDir());
+		copyTempFileToWorkAndServiceability(APPS_DIR, fileName,
+				getServiceabilityDir());
+
+		File file = new File(getWorkDir(), "temp.txt");
+		assertTrue("temp file copied to work dir", file.exists());
+		file = new File(getServiceabilityDir(), "temp.txt");
+		assertTrue("temp file copied to serviceability dir", file.exists());
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/startclean/FormTagsDeploymentForCleanStartVerificationTests.java b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/startclean/FormTagsDeploymentForCleanStartVerificationTests.java
new file mode 100644
index 0000000..8e5f669
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/java/org/eclipse/virgo/server/svt/startclean/FormTagsDeploymentForCleanStartVerificationTests.java
@@ -0,0 +1,153 @@
+/*******************************************************************************
+ * Copyright (c) 2008, 2010 VMware Inc.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   VMware Inc. - initial contribution
+ *******************************************************************************/
+
+package org.eclipse.virgo.server.svt.startclean;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+
+import javax.management.MalformedObjectNameException;
+import javax.management.ObjectName;
+import javax.management.openmbean.CompositeData;
+
+import org.eclipse.virgo.server.svt.AbstractWebTests;
+import org.eclipse.virgo.server.svt.UrlWaitLatch;
+import org.junit.Test;
+
+
+
+public class FormTagsDeploymentForCleanStartVerificationTests extends
+		AbstractWebTests {
+
+	private static final String APP_URI_PAR = "./apps/formtags-par-2.0.1.BUILD-20100413113234.par";
+	private static final String APP_URI_WAR = "./apps/formtags-war-2.0.1.BUILD-20100413113234.war";
+	private static final String APP_URI_SHARED_LIBRARIES_WAR = "./apps/formtags-shared-libs-2.0.1.BUILD-20100413113234.war";
+
+	private static String[] signature = null;
+	private static Object[] params = null;
+	
+	String artifactType = null;
+	String artifactName = null;
+	String artifactVersion = null;
+
+	@Test
+	public void testFormTagsParDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_PAR).toURI().toString() };
+		CompositeData compositeData = deploy(signature, params);
+		artifactName = compositeData.get("symbolicName").toString();
+		artifactType = compositeData.get("type").toString();
+		artifactVersion = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType, artifactName, artifactVersion,
+				HALF_SECOND, TWO_MINUTES);
+		assertArtifactExists(artifactType, artifactName, artifactVersion);
+
+		ObjectName[] objectNameList = (ObjectName[]) getMBeanServerConnection()
+				.getAttribute(
+						getObjectName(artifactType, artifactName,
+								artifactVersion), "Dependents");
+		for (ObjectName objectName : objectNameList) {
+			assertParArtifactDependents(objectName);
+		}
+		UrlWaitLatch.waitFor("http://localhost:8080/formtags-par");
+		UrlWaitLatch.waitFor("http://localhost:8080/formtags-par/list.htm");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-par/form.htm?id=1");
+		assertArtifactState(artifactType, artifactName, artifactVersion,
+				"ACTIVE");
+	}
+
+	@Test
+	public void testFormTagsWarDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_WAR).toURI().toString() };
+
+		CompositeData compositeData = deploy(signature, params);
+		artifactName = compositeData.get("symbolicName").toString();
+		artifactType = compositeData.get("type").toString();
+		artifactVersion = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType, artifactName, artifactVersion,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-war-2.0.1.BUILD-20100413113234");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-war-2.0.1.BUILD-20100413113234/list.htm");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-war-2.0.1.BUILD-20100413113234/form.htm?id=1");
+		assertArtifactExists(artifactType, artifactName, artifactVersion);
+		assertArtifactState(artifactType, artifactName, artifactVersion,
+				"ACTIVE");
+	}
+
+	@Test
+	public void testFormTagsSharedLibrariesWarDeploy() throws Exception {
+		signature = new String[] { String.class.getName() };
+		params = new Object[] { new File(APP_URI_SHARED_LIBRARIES_WAR).toURI()
+				.toString() };
+
+		CompositeData compositeData = deploy(signature, params);
+		artifactName = compositeData.get("symbolicName").toString();
+		artifactType = compositeData.get("type").toString();
+		artifactVersion = compositeData.get("version").toString();
+
+		waitForMBeanRegister(artifactType, artifactName, artifactVersion,
+				HALF_SECOND, TWO_MINUTES);
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-shared-libs-2.0.1.BUILD-20100413113234");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-shared-libs-2.0.1.BUILD-20100413113234/list.htm");
+		UrlWaitLatch
+				.waitFor("http://localhost:8080/formtags-shared-libs-2.0.1.BUILD-20100413113234/form.htm?id=1");
+		assertArtifactExists(artifactType, artifactName, artifactVersion);
+		assertArtifactState(artifactType, artifactName, artifactVersion,
+				"ACTIVE");
+	}
+
+	private static CompositeData deploy(String[] signature, Object[] params)
+			throws Exception {
+		CompositeData compsiteData = (CompositeData) getMBeanServerConnection()
+				.invoke(
+						new ObjectName(
+								"org.eclipse.virgo.kernel:category=Control,type=Deployer"),
+						"deploy", params, signature);
+		return compsiteData;
+	}
+
+	private void assertArtifactExists(String type, String name, String version)
+			throws IOException, Exception, MalformedObjectNameException {
+		assertTrue(String.format("Artifact %s:%s:%s does not exist", type,
+				name, version), getMBeanServerConnection().isRegistered(
+				getObjectName(type, name, version)));
+	}
+
+	private void assertArtifactState(String type, String name, String version,
+			String state) throws MalformedObjectNameException, IOException,
+			Exception {
+		assertEquals(String.format("Artifact %s:%s:%s is not in state %s",
+				type, name, version, state), state, getMBeanServerConnection()
+				.getAttribute(getObjectName(type, name, version), "State"));
+	}
+
+	private void assertParArtifactDependents(ObjectName objectName)
+			throws MalformedObjectNameException, IOException, Exception {
+
+		assertTrue("par dependent artifact does not exist",
+				getMBeanServerConnection().isRegistered(objectName));
+		assertEquals(String.format("par dependent artifact is not in state %s",
+				"ACTIVE"), "ACTIVE", getMBeanServerConnection().getAttribute(
+				objectName, "State"));
+	}
+}
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/app1.jar b/org.eclipse.virgo.server.svt/src/test/resources/app1.jar
new file mode 100644
index 0000000..6165601
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/app1.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/appA.par b/org.eclipse.virgo.server.svt/src/test/resources/appA.par
new file mode 100644
index 0000000..de37ef2
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/appA.par
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundleA.jar b/org.eclipse.virgo.server.svt/src/test/resources/bundleA.jar
new file mode 100644
index 0000000..352088a
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundleA.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/appA.par b/org.eclipse.virgo.server.svt/src/test/resources/bundles/appA.par
new file mode 100644
index 0000000..4e68e97
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/appA.par
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/bundleA.jar b/org.eclipse.virgo.server.svt/src/test/resources/bundles/bundleA.jar
new file mode 100644
index 0000000..7fed148
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/bundleA.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/bundleB.war b/org.eclipse.virgo.server.svt/src/test/resources/bundles/bundleB.war
new file mode 100644
index 0000000..63d495e
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/bundleB.war
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.freemarker-2.3.15.jar b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.freemarker-2.3.15.jar
new file mode 100644
index 0000000..9bf1020
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.freemarker-2.3.15.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.javax.persistence-1.0.0.jar b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.javax.persistence-1.0.0.jar
new file mode 100644
index 0000000..9fcc5ae
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.javax.persistence-1.0.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
new file mode 100644
index 0000000..a8ef066
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.apache.commons.dbcp-1.2.2.osgi.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.apache.commons.pool-1.3.0.jar b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.apache.commons.pool-1.3.0.jar
new file mode 100644
index 0000000..7e45c21
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.apache.commons.pool-1.3.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.eclipse.persistence-1.0.0.jar b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.eclipse.persistence-1.0.0.jar
new file mode 100644
index 0000000..8a27959
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.eclipse.persistence-1.0.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.eclipse.persistence.antlr-1.0.0.jar b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.eclipse.persistence.antlr-1.0.0.jar
new file mode 100644
index 0000000..31d1164
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.eclipse.persistence.antlr-1.0.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.eclipse.persistence.asm-1.0.0.jar b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.eclipse.persistence.asm-1.0.0.jar
new file mode 100644
index 0000000..3b9a810
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.eclipse.persistence.asm-1.0.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.eclipse.persistence.jpa-1.0.0.jar b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.eclipse.persistence.jpa-1.0.0.jar
new file mode 100644
index 0000000..1508f97
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.eclipse.persistence.jpa-1.0.0.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.h2-1.0.71.jar b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.h2-1.0.71.jar
new file mode 100644
index 0000000..41dc982
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/com.springsource.org.h2-1.0.71.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/foo.properties b/org.eclipse.virgo.server.svt/src/test/resources/bundles/foo.properties
new file mode 100644
index 0000000..74d0a43
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/foo.properties
@@ -0,0 +1 @@
+foo=bar
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/formtags-shared-services-service-2.0.1.BUILD-20100413113234.jar b/org.eclipse.virgo.server.svt/src/test/resources/bundles/formtags-shared-services-service-2.0.1.BUILD-20100413113234.jar
new file mode 100644
index 0000000..5ed2f3b
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/formtags-shared-services-service-2.0.1.BUILD-20100413113234.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/hello.domain.jar b/org.eclipse.virgo.server.svt/src/test/resources/bundles/hello.domain.jar
new file mode 100644
index 0000000..097a95c
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/hello.domain.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/hello.service.api.jar b/org.eclipse.virgo.server.svt/src/test/resources/bundles/hello.service.api.jar
new file mode 100644
index 0000000..55d136d
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/hello.service.api.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/hello.service.impl-en.jar b/org.eclipse.virgo.server.svt/src/test/resources/bundles/hello.service.impl-en.jar
new file mode 100644
index 0000000..6bbfdeb
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/hello.service.impl-en.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/bundles/org.springframework.dmServer.testtool.incoho.domain-1.0.0.RELEASE.jar b/org.eclipse.virgo.server.svt/src/test/resources/bundles/org.springframework.dmServer.testtool.incoho.domain-1.0.0.RELEASE.jar
new file mode 100644
index 0000000..617191f
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/bundles/org.springframework.dmServer.testtool.incoho.domain-1.0.0.RELEASE.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/com.springsource.test.properties b/org.eclipse.virgo.server.svt/src/test/resources/com.springsource.test.properties
new file mode 100644
index 0000000..62bc34b
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/com.springsource.test.properties
@@ -0,0 +1,2 @@
+foo=spring
+bar=source
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/configadminsample.jar b/org.eclipse.virgo.server.svt/src/test/resources/configadminsample.jar
new file mode 100644
index 0000000..b753e80
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/configadminsample.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/configservice.war b/org.eclipse.virgo.server.svt/src/test/resources/configservice.war
new file mode 100644
index 0000000..c20a449
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/configservice.war
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/eclipselink1.jar b/org.eclipse.virgo.server.svt/src/test/resources/eclipselink1.jar
new file mode 100644
index 0000000..042a020
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/eclipselink1.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/eclipselink2.jar b/org.eclipse.virgo.server.svt/src/test/resources/eclipselink2.jar
new file mode 100644
index 0000000..0e43bdc
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/eclipselink2.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/foo.properties b/org.eclipse.virgo.server.svt/src/test/resources/foo.properties
new file mode 100644
index 0000000..b2d4542
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/foo.properties
@@ -0,0 +1 @@
+foo=boo
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/formtags-par-1.4.0.RELEASE_FAILURE.par b/org.eclipse.virgo.server.svt/src/test/resources/formtags-par-1.4.0.RELEASE_FAILURE.par
new file mode 100644
index 0000000..aa938b0
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/formtags-par-1.4.0.RELEASE_FAILURE.par
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/libraries/org.springframework.spring-library-2.5.4.A.libd b/org.eclipse.virgo.server.svt/src/test/resources/libraries/org.springframework.spring-library-2.5.4.A.libd
new file mode 100644
index 0000000..b2fc534
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/libraries/org.springframework.spring-library-2.5.4.A.libd
@@ -0,0 +1,17 @@
+Library-SymbolicName: org.springframework.spring
+Library-Version: 2.5.4.A
+Library-Name: Spring Framework
+Import-Bundle: 
+ org.springframework.aop;version="[2.5.4.A, 2.5.4.A]",
+ org.springframework.aspects;version="[2.5.4.A, 2.5.4.A]";import-scope:=application,
+ org.springframework.beans;version="[2.5.4.A, 2.5.4.A]",
+ org.springframework.context;version="[2.5.4.A, 2.5.4.A]",
+ org.springframework.context.support;version="[2.5.4.A, 2.5.4.A]",
+ org.springframework.core;version="[2.5.4.A, 2.5.4.A]",
+ org.springframework.jdbc;version="[2.5.4.A, 2.5.4.A]",
+ org.springframework.jms;version="[2.5.4.A, 2.5.4.A]",
+ org.springframework.orm;version="[2.5.4.A, 2.5.4.A]",
+ org.springframework.transaction;version="[2.5.4.A, 2.5.4.A]",
+ org.springframework.web;version="[2.5.4.A, 2.5.4.A]",
+ org.springframework.web.servlet;version="[2.5.4.A, 2.5.4.A]",
+ com.springsource.org.aopalliance;version="[1.0.0, 1.0.0]"
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/org.eclipse.virgo.apps.repository.properties b/org.eclipse.virgo.server.svt/src/test/resources/org.eclipse.virgo.apps.repository.properties
new file mode 100644
index 0000000..410e42e
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/org.eclipse.virgo.apps.repository.properties
@@ -0,0 +1,4 @@
+hosted-repository.type=external
+hosted-repository.searchPattern=${user.home}/hosted/*
+
+
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/org.eclipse.virgo.repository.properties b/org.eclipse.virgo.server.svt/src/test/resources/org.eclipse.virgo.repository.properties
new file mode 100644
index 0000000..80edbdd
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/org.eclipse.virgo.repository.properties
@@ -0,0 +1,14 @@
+ext.type=external
+ext.searchPattern=repository/ext/{artifact}
+
+usr.type=watched
+usr.watchDirectory=repository/usr
+
+watched-repo.type=watched
+watched-repo.watchDirectory=watched-repo
+
+remote-repo.type=remote
+remote-repo.uri=http://localhost:8080/org.eclipse.virgo.apps.repository/hosted-repository
+remote-repo.indexRefreshInterval=1
+
+chain=ext,usr,watched-repo,remote-repo
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/scopedplan.plan b/org.eclipse.virgo.server.svt/src/test/resources/scopedplan.plan
new file mode 100644
index 0000000..33ba84e
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/scopedplan.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="scoped.plan" version="1.0.0" scoped="true" 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="bundleA" version="[1.0.0,2.0)"/>
+    <artifact type="bundle" name="bundleB" version="[1.0.0,2.0)"/>
+    <artifact type="configuration" name="foo" version="0"/>
+</plan>
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/spring.jar b/org.eclipse.virgo.server.svt/src/test/resources/spring.jar
new file mode 100644
index 0000000..4e0491f
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/spring.jar
Binary files differ
diff --git a/org.eclipse.virgo.server.svt/src/test/resources/temp.txt b/org.eclipse.virgo.server.svt/src/test/resources/temp.txt
new file mode 100644
index 0000000..13e6578
--- /dev/null
+++ b/org.eclipse.virgo.server.svt/src/test/resources/temp.txt
@@ -0,0 +1 @@
+TempFile used for verifying the removal of directories Work and Serviceability
\ No newline at end of file
diff --git a/test-apps/appA.par b/test-apps/appA.par
new file mode 100644
index 0000000..6042240
--- /dev/null
+++ b/test-apps/appA.par
Binary files differ
diff --git a/test-apps/bundleA.jar b/test-apps/bundleA.jar
new file mode 100644
index 0000000..f482de9
--- /dev/null
+++ b/test-apps/bundleA.jar
Binary files differ
diff --git a/test-apps/bundleB.war b/test-apps/bundleB.war
new file mode 100644
index 0000000..63d495e
--- /dev/null
+++ b/test-apps/bundleB.war
Binary files differ
diff --git a/test-apps/foo.properties b/test-apps/foo.properties
new file mode 100644
index 0000000..74d0a43
--- /dev/null
+++ b/test-apps/foo.properties
@@ -0,0 +1 @@
+foo=bar
diff --git a/test-apps/parreferencedplan.plan b/test-apps/parreferencedplan.plan
new file mode 100644
index 0000000..7a6c1e8
--- /dev/null
+++ b/test-apps/parreferencedplan.plan
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="parreferenced.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="appA" version="[1.0.0,2.0)"/>
+ 
+</plan>
diff --git a/test-apps/scopedplan.plan b/test-apps/scopedplan.plan
new file mode 100644
index 0000000..60fbb30
--- /dev/null
+++ b/test-apps/scopedplan.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="scoped.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="bundleA" version="[1.0.0,2.0)"/>
+    <artifact type="bundle" name="bundleB" version="[1.0.0,2.0)"/>
+    <artifact type="configuration" name="foo" version="0"/>
+</plan>
diff --git a/test-apps/unscopedplan.plan b/test-apps/unscopedplan.plan
new file mode 100644
index 0000000..97ffa08
--- /dev/null
+++ b/test-apps/unscopedplan.plan
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<plan name="unscoped.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="bundleA" version="[1.0.0,2.0)"/>
+    <artifact type="bundle" name="bundleB" version="[1.0.0,2.0)"/>
+    <artifact type="configuration" name="foo" version="0"/>
+</plan>
