diff --git a/org.apache.easyant/.classpath b/org.apache.easyant/.classpath
new file mode 100644
index 0000000..60e8dce
--- /dev/null
+++ b/org.apache.easyant/.classpath
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry exported="true" kind="lib" path="lib/ant-launcher.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/ivy.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/ant.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/easyant-core.jar" sourcepath="/home/jerome/tools/easyant/easyant.git/src/main/java"/>
+	<classpathentry exported="true" kind="lib" path="lib/jdtCompilerAdapter.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.apache.easyant/.project b/org.apache.easyant/.project
new file mode 100644
index 0000000..7f0d6aa
--- /dev/null
+++ b/org.apache.easyant/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.apache.easyant</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.apache.easyant/META-INF/MANIFEST.MF b/org.apache.easyant/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..fc2146a
--- /dev/null
+++ b/org.apache.easyant/META-INF/MANIFEST.MF
@@ -0,0 +1,24 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Easyant Core
+Bundle-SymbolicName: org.apache.easyant
+Bundle-Version: 0.6.0.qualifier
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Bundle-ClassPath: lib/ant.jar,
+ lib/ant-launcher.jar,
+ lib/easyant-core.jar,
+ lib/jdtCompilerAdapter.jar,
+ lib/ivy.jar,
+ .
+Export-Package: org.apache.easyant.core,
+ org.apache.easyant.core.ant,
+ org.apache.easyant.core.descriptor,
+ org.apache.easyant.core.factory,
+ org.apache.easyant.core.parser,
+ org.apache.easyant.core.report,
+ org.apache.easyant.core.services,
+ org.apache.easyant.core.services.impl,
+ org.apache.easyant.tasks
+Require-Bundle: org.eclipse.osgi,
+ org.eclipse.jdt.launching,
+ org.eclipse.jdt.core
diff --git a/org.apache.easyant/build.properties b/org.apache.easyant/build.properties
new file mode 100644
index 0000000..775e87c
--- /dev/null
+++ b/org.apache.easyant/build.properties
@@ -0,0 +1,8 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               lib/ant.jar,\
+               lib/easyant-core.jar,\
+               lib/jdtCompilerAdapter.jar,\
+               lib/ivy.jar,\
+               lib/ant-launcher.jar
diff --git a/org.apache.easyant/lib/ant-launcher.jar b/org.apache.easyant/lib/ant-launcher.jar
new file mode 100644
index 0000000..06548a3
--- /dev/null
+++ b/org.apache.easyant/lib/ant-launcher.jar
Binary files differ
diff --git a/org.apache.easyant/lib/ant.jar b/org.apache.easyant/lib/ant.jar
new file mode 100644
index 0000000..aaa605c
--- /dev/null
+++ b/org.apache.easyant/lib/ant.jar
Binary files differ
diff --git a/org.apache.easyant/lib/easyant-core.jar b/org.apache.easyant/lib/easyant-core.jar
new file mode 100644
index 0000000..4b7ab19
--- /dev/null
+++ b/org.apache.easyant/lib/easyant-core.jar
Binary files differ
diff --git a/org.apache.easyant/lib/ivy.jar b/org.apache.easyant/lib/ivy.jar
new file mode 100644
index 0000000..9723963
--- /dev/null
+++ b/org.apache.easyant/lib/ivy.jar
Binary files differ
diff --git a/org.apache.easyant/lib/jdtCompilerAdapter.jar b/org.apache.easyant/lib/jdtCompilerAdapter.jar
new file mode 100644
index 0000000..17c7152
--- /dev/null
+++ b/org.apache.easyant/lib/jdtCompilerAdapter.jar
Binary files differ
diff --git a/org.apache.easyant/lib/readme.txt b/org.apache.easyant/lib/readme.txt
new file mode 100644
index 0000000..9775771
--- /dev/null
+++ b/org.apache.easyant/lib/readme.txt
@@ -0,0 +1,2 @@
+all jars is used to bootstrap easyant-core and resolved internal plugins dependencies.
+The ivy.jar is the dedicated version for easyant-core
\ No newline at end of file
diff --git a/org.apache.easyant4e.feature/.project b/org.apache.easyant4e.feature/.project
new file mode 100644
index 0000000..476e2a8
--- /dev/null
+++ b/org.apache.easyant4e.feature/.project
@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.apache.easyant4e.feature</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.pde.FeatureBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.FeatureNature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.apache.easyant4e.feature/build.properties b/org.apache.easyant4e.feature/build.properties
new file mode 100644
index 0000000..64f93a9
--- /dev/null
+++ b/org.apache.easyant4e.feature/build.properties
@@ -0,0 +1 @@
+bin.includes = feature.xml
diff --git a/org.apache.easyant4e.feature/feature.xml b/org.apache.easyant4e.feature/feature.xml
new file mode 100644
index 0000000..95aee7e
--- /dev/null
+++ b/org.apache.easyant4e.feature/feature.xml
@@ -0,0 +1,38 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<feature
+      id="org.apache.easyant4e.feature"
+      label="EasyAnt for Eclipse"
+      version="1.0.0.qualifier"
+      provider-name="EasyAnt.Org">
+
+   <description url="http://www.example.com/description">
+      [Enter Feature Description here.]
+   </description>
+
+   <copyright url="http://www.example.com/copyright">
+      [Enter Copyright Description here.]
+   </copyright>
+
+   <license url="http://www.example.com/license">
+      [Enter License Description here.]
+   </license>
+
+   <includes
+         id="org.apache.ivyde.feature"
+         version="0.0.0"/>
+
+   <plugin
+         id="org.apache.easyant4e"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+   <plugin
+         id="org.apache.easyant"
+         download-size="0"
+         install-size="0"
+         version="0.0.0"
+         unpack="false"/>
+
+</feature>
diff --git a/org.apache.easyant4e.releng/.project b/org.apache.easyant4e.releng/.project
new file mode 100644
index 0000000..e0f44de
--- /dev/null
+++ b/org.apache.easyant4e.releng/.project
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.apache.easyant4e.releng</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+		<nature>org.pluginbuilder.core.pluginBuilderNature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.apache.easyant4e.releng/build-files/allElements.xml b/org.apache.easyant4e.releng/build-files/allElements.xml
new file mode 100644
index 0000000..245038f
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/allElements.xml
@@ -0,0 +1,87 @@
+<project name="allElements delegation and assemble customTargets.xml">
+<!-- FILE WILL BE OVERWRITTEN WHEN GENERATED -->
+  	<target name="allElementsExceptSvnFetch" unless="is.svn.fetch">
+  		<antcall target="norcpbuild"/>
+  		<antcall target="rcpbuild"/>
+    </target>
+	
+	<target name="norcpbuild" unless="build.container.feature">
+		<ant antfile="${genericTargets}" target="${target}">
+			<property name="type" value="feature" />
+			<property name="id" value="org.apache.easyant4e.feature" />
+		</ant>
+		
+	</target>
+
+	<target name="rcpbuild" if="build.container.feature">
+		<ant antfile="${genericTargets}" target="${target}">
+			<property name="type" value="feature" />
+			<property name="id" value="org.eclipse.pde.build.container.feature" />
+		</ant>
+	</target>
+	
+	<!-- generated assemble targets -->	     
+	<target name="assemble.org.apache.easyant4e.feature">
+		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">
+			<property name="zipargs" value="" />
+		</ant>
+	</target>
+
+	
+	<!-- assmble targets for RCP build -->	
+	<target name="assemble.org.eclipse.pde.build.container.feature.win32.win32.x86">
+ 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
+ 			<property name="archiveName" value="${archiveNamePrefix}-win32.win32.x86.zip"/>
+		</ant>
+	</target>
+	<target name="assemble.org.eclipse.pde.build.container.feature.linux.gtk.x86">
+ 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
+ 			<property name="archiveName" value="${archiveNamePrefix}-linux.gtk.x86.zip"/>
+		</ant>
+	</target>
+	<target name="assemble.org.eclipse.pde.build.container.feature.linux.gtk.ppc">
+ 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
+ 			<property name="archiveName" value="${archiveNamePrefix}-linux.gtk.ppc.zip"/>
+		</ant>
+	</target>
+	<target name="assemble.org.eclipse.pde.build.container.feature.linux.gtk.x86_64">
+ 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
+ 			<property name="archiveName" value="${archiveNamePrefix}-linux.gtk.x86_64.zip"/>
+		</ant>
+	</target>
+	<target name="assemble.org.eclipse.pde.build.container.feature.linux.motif.x86">
+ 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
+ 			<property name="archiveName" value="${archiveNamePrefix}-linux.motif.x86.zip"/>
+		</ant>
+	</target>
+	<target name="assemble.org.eclipse.pde.build.container.feature.solaris.motif.sparc">
+ 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
+ 			<property name="archiveName" value="${archiveNamePrefix}-solaris.motif.sparc.zip"/>
+		</ant>
+	</target>
+	<target name="assemble.org.eclipse.pde.build.container.feature.solaris.gtk.sparc">
+ 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
+ 			<property name="archiveName" value="${archiveNamePrefix}-solaris.gtk.sparc.zip"/>
+		</ant>
+	</target>
+	<target name="assemble.org.eclipse.pde.build.container.feature.aix.motif.ppc">
+ 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
+ 			<property name="archiveName" value="${archiveNamePrefix}-aix.motif.ppc.zip"/>
+		</ant>
+	</target>
+	<target name="assemble.org.eclipse.pde.build.container.feature.hpux.motif.PA_RISC">
+ 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
+ 			<property name="archiveName" value="${archiveNamePrefix}-hpux.motif.PA_RISC.zip"/>
+		</ant>
+	</target>
+	<target name="assemble.org.eclipse.pde.build.container.feature.macosx.carbon.ppc">
+ 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
+ 			<property name="archiveName" value="${archiveNamePrefix}-macosx.carbon.ppc.zip"/>
+		</ant>
+	</target>
+	<target name="assemble.org.eclipse.pde.build.container.feature.macosx.carbon.x86">
+ 		<ant antfile="${assembleScriptName}" dir="${buildDirectory}">			
+ 			<property name="archiveName" value="${archiveNamePrefix}-macosx.carbon.x86.zip"/>
+		</ant>
+	</target>	
+</project>
\ No newline at end of file
diff --git a/org.apache.easyant4e.releng/build-files/ant-contrib-LICENSE.txt b/org.apache.easyant4e.releng/build-files/ant-contrib-LICENSE.txt
new file mode 100644
index 0000000..4d8c2fb
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/ant-contrib-LICENSE.txt
@@ -0,0 +1,47 @@
+/*
+ * The Apache Software License, Version 1.1
+ *
+ * Copyright (c) 2001-2003 Ant-Contrib project.  All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer. 
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in
+ *    the documentation and/or other materials provided with the
+ *    distribution.
+ *
+ * 3. The end-user documentation included with the redistribution, if
+ *    any, must include the following acknowlegement:  
+ *       "This product includes software developed by the 
+ *        Ant-Contrib project (http://sourceforge.net/projects/ant-contrib)."
+ *    Alternately, this acknowlegement may appear in the software itself,
+ *    if and wherever such third-party acknowlegements normally appear.
+ *
+ * 4. The name Ant-Contrib must not be used to endorse or promote products 
+ *    derived from this software without prior written permission. For
+ *    written permission, please contact
+ *    ant-contrib-developers@lists.sourceforge.net.
+ *
+ * 5. Products derived from this software may not be called "Ant-Contrib"
+ *    nor may "Ant-Contrib" appear in their names without prior written
+ *    permission of the Ant-Contrib project.
+ *
+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED.  IN NO EVENT SHALL THE ANT-CONTRIB PROJECT OR ITS
+ * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ * ====================================================================
+ */
diff --git a/org.apache.easyant4e.releng/build-files/ant-contrib.jar b/org.apache.easyant4e.releng/build-files/ant-contrib.jar
new file mode 100644
index 0000000..ea817cd
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/ant-contrib.jar
Binary files differ
diff --git a/org.apache.easyant4e.releng/build-files/automatedTests/eclipse-test-framework-3.4.1.zip b/org.apache.easyant4e.releng/build-files/automatedTests/eclipse-test-framework-3.4.1.zip
new file mode 100644
index 0000000..a6434a0
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/automatedTests/eclipse-test-framework-3.4.1.zip
Binary files differ
diff --git a/org.apache.easyant4e.releng/build-files/automatedTests/emma.jar b/org.apache.easyant4e.releng/build-files/automatedTests/emma.jar
new file mode 100644
index 0000000..b07cfd2
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/automatedTests/emma.jar
Binary files differ
diff --git a/org.apache.easyant4e.releng/build-files/automatedTests/emma.jar.version b/org.apache.easyant4e.releng/build-files/automatedTests/emma.jar.version
new file mode 100644
index 0000000..a239f01
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/automatedTests/emma.jar.version
@@ -0,0 +1,2 @@
+emma.jar is a patched 2.0.5312 which fixes an AIOB exception on 64 bit linux
+http://lukas.zapletalovi.com/blog:emma_code_coverage_tool_fixed_version
\ No newline at end of file
diff --git a/org.apache.easyant4e.releng/build-files/automatedTests/emma_ant.jar b/org.apache.easyant4e.releng/build-files/automatedTests/emma_ant.jar
new file mode 100644
index 0000000..3f28c2c
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/automatedTests/emma_ant.jar
Binary files differ
diff --git a/org.apache.easyant4e.releng/build-files/automatedTests/org.pluginbuilder.autotestsuite.feature-0.5.0.20090721PRD.zip b/org.apache.easyant4e.releng/build-files/automatedTests/org.pluginbuilder.autotestsuite.feature-0.5.0.20090721PRD.zip
new file mode 100644
index 0000000..968ecac
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/automatedTests/org.pluginbuilder.autotestsuite.feature-0.5.0.20090721PRD.zip
Binary files differ
diff --git a/org.apache.easyant4e.releng/build-files/automatedTests/run-tests.properties b/org.apache.easyant4e.releng/build-files/automatedTests/run-tests.properties
new file mode 100644
index 0000000..0749cac
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/automatedTests/run-tests.properties
@@ -0,0 +1,91 @@
+# test.eclipse.host denotes the Eclipse installation which is the host for the test run.
+# The directory given here is expected to have an eclipse subdirectory.
+# The default is to use the same host as the build host but in general this should be changed to
+# a separate installation. You can also set this directory to a non existing location and provide
+# a zip file (see next property) which will then be extracted. 
+# The test host does not have to be a full Java/PDE SDK, the Eclipse platform is fully sufficient. Please ALWAYS USE FORWARD SLASHES.
+# @category testGeneral
+# @type Directory
+test.eclipse.host=${eclipseDir}/..
+
+# If you specify a non existing test.eclipse.host, you can provide a zipped Eclipse installation here,
+# e.g. eclipse-platform-3.3.2-win32.zip. You can set the test.eclipse.host to a subdirectory of the 
+# buildDirectory if you want to have a fresh installation for every test run, e.g. test.eclipse.host=${buildDirectory}/testhost 
+# @category testGeneral
+# @type File
+test.eclipse.zip=
+
+# The location of the Eclipse extension site. It consists of the built features, 
+# the Eclipse test framework and the autotestsuite. The extension site will be 
+# added with the standalone update manager to ${test.eclipse.host}.
+# @category testGeneral
+# @type Directory 
+test.eclipseExtensionDirectory=${buildDirectory}/eclipseextension/eclipse
+
+# Enable the autotestsuite trace in order to see which plugins and classes the autotestsuite searches for tests.
+# Useful for debugging the filter expressions below. 
+# @category testGeneral 
+# @type Boolean 
+autotestsuite.trace=true
+
+# Decides if the autotestsuite should run headless or not. Running headless means that the workbench does
+# not get started and the tests are executed directly instead. Cannot be used for UI tests, therefore.
+# @category testGeneral 
+# @type Boolean 
+autotestsuite.headless=false
+
+# Set the test application which the autoTestApplication runs with the test harness in place. This is useful to 
+# test the UI of an RCP application. This property is ignored if the headless mode is turned on.
+# @category testGeneral
+#autotest.testapplication=org.eclipse.ide.ui.workbench
+
+# Directory where the reports are collected
+# @category testHidden
+test.result.dir=${buildDirectory}/test-reports
+
+# Specifies the overall report in ${test.result.dir}/xml
+# @category testHidden
+test.aggregated.report=testReport_${buildLabel}.xml
+
+# Workspace for the tests. Particularly useful is ${test.workspace}/.metadata/.log
+# @category testHidden 
+test.workspace=${buildDirectory}/test-workspace
+
+# Defaults for autotestsuite
+# @category testHidden 
+autotestsuite.plugin.inclusions=
+
+# Defaults for autotestsuite
+# @category testHidden 
+autotestsuite.plugin.exclusions=
+
+# Defaults for autotestsuite
+# @category testHidden 
+autotestsuite.class.inclusions=
+
+# Defaults for autotestsuite
+# @category testHidden 
+autotestsuite.class.exclusions=
+
+# Denotes the ant script where the target ui-test is defined. Note that this property is
+# only necessary if you want to use the Eclipse test framework to run your test. If you
+# run the tests with the autotestsuite (i.e. you use the include/exclude filters below)
+# this property is not being used.
+# @category testHidden	
+test.library.xml=${test.eclipseExtensionDirectory}/plugins/org.eclipse.test_3.1.0/library.xml
+
+# Enablement for code coverage.
+# @category testCoverage
+# @type Boolean 
+pluginbuilder.is.runcoverage=false
+
+# Take a look at http://emma.sourceforge.net/reference/ch02s06s02.html#filtersyntax.ANT for the filter syntax.
+# @category testCoverage
+pluginbuilder.coverage.exclusionfilter=
+
+# @category testCoverage 
+pluginbuilder.coverage.inclusionfilter=
+
+# Place for runtime data.
+# @category coverageHidden
+emma.coverage.output=${buildDirectory}/coverage.ec
\ No newline at end of file
diff --git a/org.apache.easyant4e.releng/build-files/automatedTests/run-tests.xml b/org.apache.easyant4e.releng/build-files/automatedTests/run-tests.xml
new file mode 100644
index 0000000..d54ecfa
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/automatedTests/run-tests.xml
@@ -0,0 +1,255 @@
+<project name="Run automated Tests" default="run" basedir=".">
+	<taskdef resource="org/pluginbuilder/anttasks/pluginbuildertasks.properties" classpath="../pluginbuilder-anttasks.jar" />
+	<typedef resource="org/pluginbuilder/anttasks/pluginbuildertypes.properties" classpath="../pluginbuilder-anttasks.jar" />
+
+	<GetHostName />
+	<property file="../../build_${hostname}.properties" />
+	<property file="../../build_local.properties" />
+	<property file="run-tests.properties" />
+	<property name="test.eclipse.host.eclipse" value="${test.eclipse.host}/eclipse" />
+
+	<import file="../build_shared.xml" />
+	
+	<condition property="is.emma">
+		<equals arg1="${pluginbuilder.is.runcoverage}" arg2="true"/>
+	</condition>
+	
+	<target name="-init" depends="-emmaInit">
+		<antcall target="-unpackEclipse"/>
+		<antcall target="-installEclipseExtensionLocation"/>
+		<antcall target="umAddSite" />
+		<!-- Useful for debugging 
+		<antcall target="umListFeaturesSite" />
+		-->
+	</target>
+
+	<target name="-installEclipseExtensionLocation">
+		<echo message="Installing plug-ins for testing into eclipse extension location" />
+		<mkdir dir="${test.eclipseExtensionDirectory}"/>
+		<condition property="buildResultZipDest" value="${test.eclipseExtensionDirectory}/.." else="${test.eclipseExtensionDirectory}">
+			<equals arg1="${archivePrefix}" arg2="eclipse" />
+		</condition>
+		<unzip dest="${buildResultZipDest}">
+			<fileset dir="${buildDirectory}" includes="${buildType}-**/*.zip" excludes="**/${archiveNamePrefix}-*"/>
+		</unzip>
+		<antcall target="-emmaInstrument"/>
+		<unzip dest="${test.eclipseExtensionDirectory}/..">
+			<fileset dir="." includes="eclipse-test-framework*.zip" />
+		</unzip>
+		<unzip dest="${test.eclipseExtensionDirectory}">
+			<fileset dir="." includes="org.pluginbuilder.autotestsuite*.zip" />
+		</unzip>
+		<echo file="${test.eclipseExtensionDirectory}/.eclipseextension">id=org.eclipse.platform
+name=Eclipse Platform
+version=3.1.0</echo>
+	</target>
+
+	<target name="-unpackEclipse" unless="isEclipseInstallationAvailable">
+	 	<antcall target="unpack.eclipse">
+			<param name="eclipse.installation.dir" value="${test.eclipse.host.eclipse}"/>
+			<param name="eclipse.local.tar.non.server" value="${test.eclipse.zip}"/>
+		</antcall>
+	</target>
+
+	<!-- Example target which demonstrates how to run a test suite with the Eclipse test fwk.
+		Note that it is not needed if you use the autotestsuite
+
+	<target name="-runTestSuite" description="Should be called from allTests.xml only">
+		<ant target="core-test" antfile="${test.library.xml}" dir="${test.eclipse.host.eclipse}">
+			--><!-- inject additional properties for Eclipse startup with data-dir property --><!--
+			<property name="data-dir" value="${test.workspace} -clean -dev ${basedir}/emma.jar" />
+    		<property name="plugin-name" value="org.rssowl.core.tests" />
+    		<property name="classname" value="org.rssowl.core.tests.AllTests" />
+			<property name="eclipse-home" value="${test.eclipse.host.eclipse}" />
+			<property name="extraVMargs" value="-Demma.coverage.out.file=${emma.coverage.output}" />
+		</ant>
+	</target>
+	
+	<target name="run" depends="-init,-runTestSuite,-emmaReport" description="Run manually defined tests and create a report.">
+		<antcall target="umRemoveSite" />
+		<delete dir="${test.result.dir}" />
+		<mkdir dir="${test.result.dir}/xml" />
+		--><!-- collect creates an aggregated report file in ${test.eclipse.host} --><!--
+		<ant target="collect" antfile="${test.library.xml}" dir="${test.eclipse.host.eclipse}">
+			<property name="includes" value="*.xml" />
+			<property name="output-file" value="${test.aggregated.report}" />
+		</ant>
+		<copy file="${test.eclipse.host.eclipse}/${test.aggregated.report}" todir="${test.result.dir}/xml" />
+		
+		<BundleFileLocator eclipseInstallationRoot="${test.eclipseExtensionDirectory}" bundleId="org.pluginbuilder.autotestsuite.application" filePath="JUNIT.XSL" property="junit.xsl.file" />
+		<style style="${junit.xsl.file}" basedir="${test.result.dir}/xml" destdir="${test.result.dir}/html" />
+
+		<antcall target="-checkTestResultFileForErrors"/>
+	</target>
+	-->
+	
+	<target name="run" depends="-init,-runAutoTests,-emmaReport" description="Run all tests using the autotestsuite and create xml and html reports.">
+		<antcall target="umRemoveSite" />
+		<junitreport todir="${test.result.dir}/xml" tofile="${test.aggregated.report}">
+			<fileset dir="${test.result.dir}/xml">
+				<include name="*.xml" />
+			</fileset>
+		</junitreport>
+
+		<BundleFileLocator eclipseInstallationRoot="${test.eclipseExtensionDirectory}" bundleId="org.pluginbuilder.autotestsuite.application" filePath="JUNIT.XSL" property="junit.xsl.file" />
+
+		<style style="${junit.xsl.file}" basedir="${test.result.dir}/xml" includes="${test.aggregated.report}" destdir="${test.result.dir}/html" />
+	</target>
+	
+	<target name="-markErrorOrFailure" if="isErrorOrFailure">
+		<!-- Write Message to stderr and continue the build. Do not let the build fail so that 
+		     other tasks which come afterwards can be completed. E.g. packaging might take place
+		     after test execution -->
+		<echo level="error" message="TESTS FAILED"/>
+	</target>
+	
+	<target name="-checkTestResultFileForErrors" unless="isErrorOrFailure" description="Check test result file for errors. Not needed for autotestsuite where the return status is used to signal a failed build.">	
+		<echo message="Checke auf Fehler: ${test.aggregated.report}"/>
+
+        <condition property="isErrorOrFailure">
+                <hasErrorOrFailure reportFile="${test.result.dir}/xml/${test.aggregated.report}" />
+        </condition>
+
+        <antcall target="-markErrorOrFailure" />        
+	</target>
+
+	<target name="-runAutoTests">
+		<mkdir dir="${test.result.dir}/xml"/>
+		<BundleFileLocator eclipseInstallationRoot="${test.eclipse.host.eclipse}" bundleId="org.eclipse.equinox.launcher" property="equinoxjar" />
+		<condition property="optJvmArg" else="-DdummyVar=NotOnMac" value="-XstartOnFirstThread">
+			<os family="mac"/>
+		</condition>
+		<condition property="testApplication" else="" value="-testApplication ${autotest.testapplication}">
+			<isset property="autotest.testapplication"/>
+		</condition>
+		<java fork="true" dir="." logError="true" classname="org.eclipse.core.launcher.Main" resultproperty="autotestsuite.result"> 
+
+			<arg line="-application org.pluginbuilder.autotestsuite.application.autoTestApplication ${testApplication}" />
+			<arg line="-data ${test.workspace}" />
+			<arg line="-os ${os}" />
+			<arg line="-ws ${ws}" />
+			<arg line="-arch ${arch}" />
+			<arg line="-clean" />
+			<arg line="-consolelog" />
+			<arg line="-dev ${basedir}/emma.jar" />
+			
+			<jvmarg value="-Demma.coverage.out.file=${emma.coverage.output}"/>
+			<jvmarg value="${optJvmArg}"/>
+			<jvmarg value="-Xmx512m"/>
+			
+			<sysproperty key="autotestsuite.results.directory" value="${test.result.dir}/xml" />
+			<sysproperty key="autotest.debug" value="${autotestsuite.trace}" />
+			<sysproperty key="autotestsuite.headless" value="${autotestsuite.headless}" />
+			<sysproperty key="autotestsuite.plugin.inclusions" value="${autotestsuite.plugin.inclusions}" />
+			<sysproperty key="autotestsuite.plugin.exclusions" value="${autotestsuite.plugin.exclusions}|^org.eclipse.test$" />
+			<sysproperty key="autotestsuite.class.inclusions" value="${autotestsuite.class.inclusions}" />
+			<sysproperty key="autotestsuite.class.exclusions" value="${autotestsuite.class.exclusions}" />
+			
+			<classpath>
+				<pathelement location="${equinoxjar}" />
+			</classpath>
+		</java>
+		<condition property="isErrorOrFailure">
+			<not>
+				<equals arg1="${autotestsuite.result}" arg2="0"/>
+			</not>
+		</condition>
+	
+		<antcall target="-markErrorOrFailure"/>
+	</target>
+
+	<target name="umAddSite">
+		<echo message="Adding Extension Site to ${test.eclipse.host}. Might fail if extension already exists."/>
+		<!-- the addSite calls fails if the extension site already exists (for example because it was not removed properly
+		     from a previous build. Nonetheless the tests can proceed --> 
+		<antcall target="updateManager">	
+			<param name="updateManagerCommand" value="addSite"/>
+			<param name="updateManagerCommandParam" value="-from"/>
+			<param name="updateManagerCommandSiteUrl" value="${test.eclipseExtensionDirectory}"/>
+			<param name="updateManagerCommandFailOnError" value="false"/>
+		</antcall>
+	</target>
+	
+	<target name="umRemoveSite">
+		<!--  This command might fail if the Extension Site has never been added or was properly removed before. -->
+		<echo message="Removing Extension Site from ${test.eclipse.host}."/>
+		
+		<antcall target="updateManager">	
+			<param name="updateManagerCommand" value="removeSite"/>
+			<param name="updateManagerCommandParam" value="-to"/>
+			<param name="updateManagerCommandSiteUrl" value="${test.eclipseExtensionDirectory}"/>
+			<param name="updateManagerCommandFailOnError" value="false"/>
+		</antcall>
+	</target>
+	
+	<target name="umListFeaturesSite">
+		<antcall target="updateManager">	
+			<param name="updateManagerCommand" value="listFeatures"/>
+			<param name="updateManagerCommandParam" value="-from"/>
+			<param name="updateManagerCommandSiteUrl" value="${test.eclipseExtensionDirectory}"/>
+			<param name="updateManagerCommandFailOnError" value="false"/>
+		</antcall>
+
+	</target>
+	
+	<target name="updateManager">
+		<BundleFileLocator eclipseInstallationRoot="${test.eclipse.host.eclipse}" bundleId="org.eclipse.equinox.launcher" property="equinoxjar" />	
+		<java classname="org.eclipse.equinox.launcher.Main" fork="true" failonerror="${updateManagerCommandFailOnError}">
+			<arg value="-ws" />
+			<arg value="${ws}" />
+			<arg value="-os" />
+			<arg value="${os}" />			
+			<arg value="-application" />
+			<arg value="org.eclipse.update.core.standaloneUpdate" />
+			<arg value="-command" />
+			<arg value="${updateManagerCommand}" />
+			<arg value="${updateManagerCommandParam}" />
+			<arg value="${updateManagerCommandSiteUrl}" />
+
+			<classpath>
+				<pathelement location="${equinoxjar}" />
+			</classpath>
+			
+		</java>
+	</target>
+	
+	
+	
+	<target name="-emmaInit" if="is.emma">
+		<path id='emma.lib' >
+			<fileset dir='.' includes='*.jar' />
+		</path>
+		<taskdef resource='emma_ant.properties' classpathref='emma.lib' />
+	</target>
+	
+	<target name="-emmaReport" if="is.emma">		
+		<mkdir dir="${test.result.dir}/coverage" />
+		<emma enabled="${pluginbuilder.is.runcoverage}">
+			<report encoding="UTF-8">
+				<fileset dir="${buildDirectory}" includes="*.emma"/>
+				<fileset file="${emma.coverage.output}"/>
+			    <html outfile="${test.result.dir}/coverage/coverage.html" />
+
+				<sourcepath>
+					<dirset dir="${buildDirectory}/plugins">
+					</dirset>
+				</sourcepath>
+				
+			</report>
+		</emma>
+	</target>
+
+	<target name="-emmaInstrument" if="is.emma">
+		<!-- <emma enabled="${pluginbuilder.is.runcoverage}"> -->
+		<emma>
+			<instr verbosity="info" metadatafile="${buildDirectory}/metadata.emma" mode="overwrite">
+				<instrpath>
+					<fileset dir="${test.eclipseExtensionDirectory}" includes="**/*.jar" excludes="**/emma*.jar"/>
+					<dirset dir="${test.eclipseExtensionDirectory}/plugins" includes="*" />
+				</instrpath>
+				<!-- http://emma.sourceforge.net/reference/ch02s06s02.html#filtersyntax.ANT -->
+		        <filter includes="${pluginbuilder.coverage.inclusionfilter}" excludes="${pluginbuilder.coverage.exclusionfilter}" />
+			</instr>
+		</emma>	
+	</target>
+</project>
diff --git a/org.apache.easyant4e.releng/build-files/build.properties b/org.apache.easyant4e.releng/build-files/build.properties
new file mode 100644
index 0000000..17d940c
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/build.properties
@@ -0,0 +1,210 @@
+# The prefix that will be used inside the generated archive. This should be set to eclipse
+# so that the archive can be directly unzipped into the dropins directory of the
+# Eclipse installation.
+# @category packaging
+archivePrefix=eclipse
+
+# The location under which all of the build output will be collected.
+# @category packaging
+collectingFolder=${archivePrefix}
+
+# Choose configurations if you want to build configuration specific plug-ins. However, if you
+# only want to create RCP distributables for different platforms do not change the default
+# *,*,*. If you select any other entry than *,*,* you also have to provide an assemble task in allElements.xml. 
+# @category compiling
+# @type list separator=&;values=*,*,*&win32,win32,x86&linux,gtk,ppc&linux,gtk,x86 & linux,gtk,x86_64 & linux,motif,x86 & solaris,motif,sparc & solaris,gtk,sparc & aix,motif,ppc & hpux,motif,PA_RISC & macosx,carbon,ppc & macosx,carbon,x86
+#configs=*,*,*
+
+
+# By default PDE creates one archive (result) per entry listed in the configs property.
+# Setting this value to true will cause PDE to only create one output containing all 
+# artifacts for all the platforms listed in the configs property.
+# @category packaging
+# @type Boolean
+#groupConfigurations=false
+
+#The format of the archive. By default a zip is created using antZip.
+#The list can only contain the configuration for which the desired format is different than zip.
+# E.g. win32,win32,x86 - antZip
+#archivesFormat=
+	
+# Set to true for Jnlp generation
+# @category jnlp
+# @type Boolean
+# generateJnlp=false
+
+# Codebase should be a URL that will be used as the root of all relative URLs in the output.
+# @category jnlp
+#jnlp.codebase=<codebase url>
+
+# @category jnlp
+#jnlp.j2se=<j2se version>
+
+# @category jnlp
+#jnlp.locale=<a locale>
+
+# Generate <offlineAllowed/> attribute in the generated features
+# @category jnlp
+# @type Boolean
+#jnlp.generateOfflineAllowed=
+
+# Set to ${configs} in order to filter the content of the generated jnlp files based on the configuration being built
+# @category jnlp
+# @type enum values=${configs} 
+# jnlp.configs=			
+
+# Check if you want to sign jars
+# @type Boolean
+# @category jarsigning
+#signJars=false
+
+# The Alias used for signing jars
+# @category jarsigning
+#sign.alias=
+
+# A path to the keystore used for signing jars
+# @category jarsigning
+#sign.keystore=
+
+# The password for the keystore
+# @category jarsigning
+#sign.storepass=
+
+#Arguments to send to the zip executable
+# @category packaging
+zipargs=
+
+#Arguments to send to the tar executable
+# @category packaging
+tarargs=
+
+# Control the creation of a file containing the version included in each configuration - on by default
+# @type Boolean 
+#generateVersionsLists=true
+
+# Indicates whether you want the set of plug-ins and features to be considered during the build to be limited to the ones reachable from the features / plugins being built
+# @type Boolean
+filteredDependencyCheck=false
+
+# Indicates whether the resolution should be done in development mode (i.e. ignore multiple bundles with singletons)
+# @type Boolean
+resolution.devMode=false
+
+#pluginPath is a list of locations in which to find plugins and features.  This list is separated by the platform file separator (; or :)
+#a location is one of:  
+#- the location of the jar or folder that is the plugin or feature : /path/to/foo.jar or /path/to/foo
+#- a directory that contains a /plugins or /features subdirectory
+#- the location of a feature.xml, or for 2.1 style plugins, the plugin.xml or fragment.xml
+#pluginPath=
+
+
+# The location of the Java jars to compile against.  Typically the rt.jar for your JDK/JRE
+# @category compiling
+# bootclasspath=${java.home}/lib/rt.jar
+
+# @category executionEnvironment
+#CDC-1.0/Foundation-1.0=
+# @category executionEnvironment
+#CDC-1.1/Foundation-1.1=
+# @category executionEnvironment
+#OSGi/Minimum-1.0=
+# @category executionEnvironment
+#OSGi/Minimum-1.1=
+# @category executionEnvironment
+#JRE-1.1=
+# @category executionEnvironment
+#J2SE-1.2=
+# @category executionEnvironment
+#J2SE-1.3=
+# @category executionEnvironment
+#J2SE-1.4=
+# @category executionEnvironment
+#J2SE-1.5=
+# @category executionEnvironment
+#JavaSE-1.6=
+# @category executionEnvironment
+#PersonalJava-1.1=
+# @category executionEnvironment
+#PersonalJava-1.2=
+# @category executionEnvironment
+#CDC-1.0/PersonalBasis-1.0=
+# @category executionEnvironment
+#CDC-1.0/PersonalJava-1.0=
+# @category executionEnvironment
+#CDC-1.1/PersonalBasis-1.1=
+# @category executionEnvironment
+#CDC-1.1/PersonalJava-1.1=
+
+# Specify the output format of the compiler log when eclipse jdt is used
+# @category compiling
+logExtension=.log
+
+# Whether or not to include debug info in the output jars
+# @category compiling
+# @type Boolean
+javacDebugInfo=false
+
+# Whether or not to fail the build if there are compiler errors
+# @category compiling
+# @type Boolean
+javacFailOnError=true
+
+# Enable or disable verbose mode of the compiler
+# @category compiling
+# @type Boolean
+javacVerbose=false
+
+# Extra arguments for the compiler. These are specific to the java compiler being used.
+# @category compiling
+#compilerArg=
+
+# Default value for the version of the source code. This value is used when compiling plug-ins that do not set the Bundle-RequiredExecutionEnvironment or set javacSource in build.properties
+# @type enum values=1.1,1.2,1.3,1.4,1.5,1.6
+# @category compiling
+#javacSource=1.3
+javacSource=1.5
+
+# Default value for the version of the byte code targeted. This value is used when compiling plug-ins that do not set the Bundle-RequiredExecutionEnvironment or set javacTarget in build.properties.
+# @type enum values=1.1,1.2,1.3,1.4,1.5,1.6
+# @category compiling
+#javacTarget=1.1
+javacTarget=1.5
+
+# Set the description for the update site. The update manager shows the description in the Updates dialog.
+# @category updateSite
+updateSiteDescription=Update site generated by pluginbuilder.
+
+# There will be one category for the generated update site. Here you can set the name.
+# It is more like an id with which features refer to their category and does not appear in the GUI.
+# @category updateSite
+updateSiteCategoryName=Builds
+
+# Here you can set the Label of the category which will be displayed in the Updates dialog.
+# @category updateSite
+updateSiteCategoryLabel=Nightly Builds
+
+# Create a provisioning (p2) repository. Since Eclipse 3.4 it is recommended that you create
+# a p2 repository for your features.
+# However, the installation of old-style (pre p2) update sites is still possible.
+# @type Boolean
+# @category p2
+generate.p2.metadata=true
+
+# @category hidden
+p2.metadata.repo=file:${buildDirectory}/repo
+
+# @category hidden
+p2.artifact.repo=file:${buildDirectory}/repo
+
+# The name of the metadata repository. The Update Manager will display this name.
+# @category p2
+p2.metadata.repo.name=EasyAnt For Eclipse Update Site
+
+# The name of the artifacts repository
+# @category p2
+p2.artifact.repo.name=EasyAnt For Eclipse Update Site
+
+# @category hidden
+p2.flavor=tooling
+# @category hidden
+p2.publish.artifacts=true
\ No newline at end of file
diff --git a/org.apache.easyant4e.releng/build-files/build_rcp.properties b/org.apache.easyant4e.releng/build-files/build_rcp.properties
new file mode 100644
index 0000000..bb40497
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/build_rcp.properties
@@ -0,0 +1,37 @@
+# The name of the Product Configuration file (.product). You can either put a product file in the root
+# folder of this pluginbuilder project and specify its name here. Or you can use an existing product file
+# from one of your plug-ins by specifying a path like ${buildDirectory}/plugins/<your-plugin>/<your-product>.product.
+# This field is mandatory. 
+# @category rcp
+product=
+
+# Select the platforms for which you want to create RCP deliverables.
+# @category rcp
+# @type list separator=&;values=win32,win32,x86&linux,gtk,ppc&linux,gtk,x86 & linux,gtk,x86_64 & linux,motif,x86 & solaris,motif,sparc & solaris,gtk,sparc & aix,motif,ppc & hpux,motif,PA_RISC & macosx,carbon,ppc & macosx,carbon,x86
+configs=win32,win32,x86
+
+# Prefix for the created archive file name. The archive name always contains the configuration. The prefix and configuration are divided by a minus character. If you want to include the version you can reference the property ${version.full}, a sample value for archiveNamePrefix is myRcpApp-${version.full}  
+# @category rcp
+archiveNamePrefix=
+
+# You need to set this to true in order to get archives for your configurations.
+# @category rcp
+# @type Boolean
+# runPackager=false
+runPackager=true
+
+# A Pluginbuilder property which prevents running the postBuild target. Since the RCP 
+# build is usually run after a regular build which includes the postBuild phase no.postBuild
+# should be activated for RCP builds
+# @category rcp_hidden
+# @type Boolean
+no.postBuild=true
+
+# Another Pluginbuilder property which should be activated for RCP builds
+# @category rcp_hidden
+# @type Boolean 
+build.container.feature=true
+
+# Set the root path in the platform specific packages
+# @category packaging
+# archivePrefix=
\ No newline at end of file
diff --git a/org.apache.easyant4e.releng/build-files/build_shared.xml b/org.apache.easyant4e.releng/build-files/build_shared.xml
new file mode 100644
index 0000000..8d17365
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/build_shared.xml
@@ -0,0 +1,116 @@
+<project name="Shared build targets">
+	<!-- the following properties must be set from the calling script 
+    <property name="eclipse.installation.dir" value="${buildDirectory}"/>
+    <property name="eclipse.local.tar.non.server" value="${test.eclipse.zip}"/>
+    eclipse.download.cache,pluginbuilder.eclipse.url
+    optional:
+    <property name="pluginbuilder.additional.feature.urls" value="featureurl1,featureurl2"/>
+    -->
+    
+	<taskdef resource="net/sf/antcontrib/antcontrib.properties" classpath="${buildHome}/build-files/ant-contrib.jar" />
+	
+	<target name="unpack.eclipse">
+		<condition property="unpack.eclipse">
+			<not>
+				<available type="dir" file="${eclipse.installation.dir}"/>
+			</not>
+		</condition>
+		<antcall target="-unpack.eclipse.ifnecessary"/>
+	</target>    
+    
+	<!-- call either with or feature.url or pluginbuilder.eclipse.url
+		 sets property archive.location to the archive path in download cache.
+	 -->
+	<target name="-set.archive.location" if="pluginbuilder.is.server">
+		<!-- set default, useful for server where pluginbuilder.eclipse.url.default can be specified in build_local.properties --> 
+		<property name="pluginbuilder.eclipse.url" value="${pluginbuilder.eclipse.url.default}"/>
+		<condition property="archive.url" value="${feature.url}" else="${pluginbuilder.eclipse.url}">
+				<isset property="feature.url"/>
+		</condition>
+		<mkdir dir="${eclipse.download.cache}"/>
+		<tempfile destdir="${eclipse.download.cache}" property="tmp.file" suffix=".txt" prefix="downloadurl"/>		
+		<echo file="${tmp.file}" message="${archive.url}"/>
+		<checksum file="${tmp.file}" property="pluginbuilder.eclipse.url.checksum"/>
+		<delete file="${tmp.file}"/>
+		<property name="archive.location" value="${eclipse.download.cache}/${pluginbuilder.eclipse.url.checksum}"/>
+		<!-- <echo message="${archive.location} is archive location for ${archive.url}"/> -->
+	</target>
+	
+	<target name="-set.eclipse.local.tar.server" if="pluginbuilder.is.server" depends="-set.archive.location">
+		<property name="eclipse.local.tar" value="${archive.location}"/>
+	</target>
+	
+	<target name="-set.eclipse.local.tar.non.server" unless="pluginbuilder.is.server">
+		<property name="eclipse.local.tar" value="${eclipse.local.tar.non.server}"/>
+	</target>
+	
+	<target name="-get.archive.ifnecessary" unless="eclipse.is.downloaded">
+		<condition property="archive.url" value="${feature.url}" else="${pluginbuilder.eclipse.url}">
+				<isset property="feature.url"/>
+		</condition>
+		<get src="${archive.url}" dest="${archive.location}" />		
+	</target>
+	
+	<target name="-get.archive" depends="-set.archive.location" if="pluginbuilder.is.server">
+		<condition property="eclipse.is.downloaded">
+			<available file="${archive.location}" property="${eclipse.is.downloaded}"/>
+		</condition>		
+		<antcall target="-get.archive.ifnecessary"/> 
+	</target>
+	
+	<target name="-get.features" if="pluginbuilder.is.server" >
+		<property name="pluginbuilder.feature.urls" value="${pluginbuilder.feature.urls.default}"/>
+		<foreach list="${pluginbuilder.feature.urls}" param="feature.url" delimiter="," target="-get.archive" inheritall="true"/>
+	</target>
+	
+	<target name="-unpack.features" if="pluginbuilder.is.server">
+		<property name="pluginbuilder.feature.urls" value="${pluginbuilder.feature.urls.default}"/>
+		<foreach list="${pluginbuilder.feature.urls}" param="feature.url" delimiter="," target="-unpack.feature" inheritall="true"/>
+	</target>
+	
+	<target name="-unpack.feature" depends="-set.archive.location">
+		<property name="tempunziplocation" value="${buildDirectory}/tmpunzip"/>
+		<delete dir="${tempunziplocation}" failonerror="false"/>
+		<mkdir dir="${tempunziplocation}"/>
+		<unzip src="${archive.location}" overwrite="true" dest="${tempunziplocation}"/>
+		<condition property="moveroot" value="${tempunziplocation}/eclipse" else="${tempunziplocation}">
+				<available file="${tempunziplocation}/eclipse" type="dir"/>
+		</condition>
+		<move todir="${eclipse.installation.dir}" includeemptydirs="true">
+			<fileset dir="${moveroot}" includes="**"/>
+		</move>
+	</target>
+			
+	<target name="-unpack.eclipse.ifnecessary" if="unpack.eclipse">
+		<antcall target="-get.archive"/>
+		<condition property="is.windows">
+		  <os family="windows"/>
+		</condition>
+		<antcall target="-unpack.eclipse.windows"/>
+		<antcall target="-unpack.eclipse.linux"/>
+		<antcall target="-get.features"/>
+		<antcall target="-unpack.features"/>
+	</target>
+	
+	<target name="-unpack.eclipse.windows" if="is.windows" depends="-set.eclipse.local.tar.server,-set.eclipse.local.tar.non.server">
+		<unzip src="${eclipse.local.tar}" overwrite="true" dest="${eclipse.installation.dir}/.."/>		
+	</target>
+	
+	<target name="-unpack.eclipse.linux" unless="is.windows" depends="-set.eclipse.local.tar.server,-set.eclipse.local.tar.non.server">
+		<untar src="${eclipse.local.tar}" overwrite="true" dest="${eclipse.installation.dir}/.." compression="gzip"/>		
+	</target>
+	
+	<target name="test">
+		<property name="buildDirectory" value="C:/Temp/tst"/>
+		<mkdir dir="${buildDirectory}"/>
+		<property name="eclipse.download.cache" value="C:/Temp/downloadcache"/>
+		<property name="pluginbuilder.is.server" value="true"/>
+		<property name="pluginbuilder.eclipse.url" value="http://mirror.yoxos-eclipse-distribution.de/eclipse.org/eclipse/downloads/drops/R-3.2.2-200702121330/eclipse-PDE-3.2.2.zip"/>
+		
+		<property name="eclipse.installation.dir" value="C:/Temp/eclipse_root/eclipse"/>
+		<delete dir="${eclipse.installation.dir}" failonerror="false"/>
+		<property name="pluginbuilder.feature.urls" value="http://self.pluginbuilder.org/0.2.0/org.pluginbuilder.feature-0.2.0.20070218PRD.zip,http://mirror.yoxos-eclipse-distribution.de/eclipse.org/eclipse/downloads/drops/R-3.2.2-200702121330/eclipse-examples-3.2.2.zip"/>
+		<antcall target="unpack.eclipse"/>
+	</target>
+	
+</project>
\ No newline at end of file
diff --git a/org.apache.easyant4e.releng/build-files/customTargets.xml b/org.apache.easyant4e.releng/build-files/customTargets.xml
new file mode 100644
index 0000000..1b8251c
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/customTargets.xml
@@ -0,0 +1,208 @@
+<project name="Build specific targets and properties" default="noDefault">
+	<condition property="isNightlyBuild">
+		<equals arg1="${buildType}" arg2="N" />
+	</condition>
+	<condition property="isNightlyOrIntegrationBuild">
+		<or>
+			<equals arg1="${buildType}" arg2="N" />
+			<equals arg1="${buildType}" arg2="I" />
+		</or>
+	</condition>
+	
+	<property file="${buildHome}/pluginbuilder.config" />
+	
+	<property file="${buildDirectory}/version.properties" />
+	<property name="buildLabel" value="${buildType}-${version.full}" />
+	<property name="buildId" value="${version.full}" />
+	
+	<condition property="isCVSOrCopy" value="true">
+		<or>
+			<equals arg1="${pluginbuilder.is.cvs}" arg2="true"/>
+			<equals arg1="${pluginbuilder.is.copy}" arg2="true"/>
+		</or>
+	</condition>
+	<condition property="isSVN" value="true">
+		<equals arg1="${pluginbuilder.is.svn}" arg2="true"/>
+	</condition>
+	<condition property="isRunTests" value="true">
+		<equals arg1="${pluginbuilder.is.runtests}" arg2="true"/>
+	</condition>
+	
+	
+	<target name="allElements">
+		<condition property="isFetch" value="true">
+			<equals arg1="${target}" arg2="fetchElement"/>
+		</condition>
+	    <condition property="is.svn.fetch" value="true">
+	 		<and>
+		  		<equals arg1="${target}" arg2="fetchElement"/>
+				<equals arg1="${pluginbuilder.is.svn}" arg2="true"/>
+			</and>
+	    </condition>
+	
+		<antcall target="allElementsExceptSvnFetch"/>
+		<antcall target="fetchSubversion"/>
+	</target>
+	
+	<import file="allElements.xml"/>
+	<import file="subversionSupport.xml"/>
+	
+	
+	<!-- ===================================================================== -->
+	<!-- Check out map files from correct repository -->
+	<!-- Replace values for cvsRoot, package and mapVersionTag as desired. -->
+	<!-- ===================================================================== -->
+	<target name="getMapFiles" if="isCVSOrCopy">
+		<echo message="Copying map files."/>
+		<copy todir="${buildDirectory}/maps">
+			<fileset dir="${buildHome}/maps" includes="*.map"></fileset>
+		</copy>
+	</target>
+	
+	<!-- ===================================================================== -->
+	<!-- Steps to do before setup -->
+	<!-- ===================================================================== -->
+	<target name="preSetup">	
+	</target>
+	<!-- ===================================================================== -->
+	<!-- Steps to do after setup but before starting the build proper -->
+	<!-- ===================================================================== -->
+	<target name="postSetup">
+	</target>
+	<!-- ===================================================================== -->
+	<!-- Steps to do before fetching the build elements -->
+	<!-- ===================================================================== -->
+	<target name="preFetch">
+	</target>
+	<!-- ===================================================================== -->
+	<!-- Steps to do after fetching the build elements -->
+	<!-- ===================================================================== -->
+	<target name="postFetch">
+		<condition property="is.fetch" value="true">
+			<available file="${buildDirectory}/plugins"/>
+		</condition>
+		<fail unless="is.fetch" message="There was no plug-in fetched. Was the configuration generated? Is the repository correct?"/>
+		<antcall target="replaceVersions"/>		
+	</target>
+	
+	<target name="replaceVersions">
+		<fail unless="version.full" message="Property version.full must be set" />
+		<fail unless="version.qualifier" message="Property version.qualifier must be set" />
+	
+		<echo message="Updating versions in feature and plugin manifests. Full version: ${version.full}, qualifier: ${version.qualifier}"/>
+		<replaceregexp
+            match="(&lt;feature[^&gt;]*version=)&quot;0.0.0&quot;"
+            replace="\1&quot;${version.full}&quot;"
+			byline="false"
+			flags="s">
+			  <fileset dir="${buildDirectory}/features" includes="**/feature.xml"/>
+		</replaceregexp>
+		<replaceregexp
+            match="(&lt;feature[^&gt;]*version=&quot;.*)qualifier&quot;"
+            replace="\1${version.qualifier}&quot;"
+			byline="false"
+			flags="s">
+			  <fileset dir="${buildDirectory}/features" includes="**/feature.xml"/>
+		</replaceregexp>
+		<!-- in a manual build started with export from the feature.xml, there is no
+			need to replace the versions in the plugin.xml files if they are set to 0.0.0,
+			but here it needs to be -->
+		<replace dir="${buildDirectory}/plugins">
+			<include name="**/plugin.xml"/>
+			<replacefilter token="0.0.0" value="${version.full}" />
+		</replace>
+		<replace dir="${buildDirectory}/plugins">
+			<include name="**/META-INF/MANIFEST.MF"/>
+			<replacefilter token="Bundle-Version: 0.0.0" value="Bundle-Version: ${version.full}" />
+			<replacefilter token="qualifier" value="${version.qualifier}" />
+		</replace>	
+	</target>	
+	<!-- ===================================================================== -->
+	<!-- Steps to do before generating the build scripts. -->
+	<!-- ===================================================================== -->
+	<target name="preGenerate">
+		<!-- fail unless="featureVersion" message="Property featureVersion must be set.
+		 Either directly or in case of a nightly build with nightlyBuildFeatureVersionPrefix." />
+		 -->
+	</target>
+	<!-- ===================================================================== -->
+	<!-- Steps to do after generating the build scripts. -->
+	<!-- ===================================================================== -->
+	<target name="postGenerate">
+	</target>
+	<!-- ===================================================================== -->
+	<!-- Steps to do before running the build.xmls for the elements being built. -->
+	<!-- ===================================================================== -->
+	<target name="preProcess">
+	</target>
+	<!-- ===================================================================== -->
+	<!-- Steps to do after running the build.xmls for the elements being built. -->
+	<!-- ===================================================================== -->
+	<target name="postProcess">
+	</target>
+	<!-- ===================================================================== -->
+	<!-- Steps to do before running assemble. -->
+	<!-- ===================================================================== -->
+	<target name="preAssemble">
+	</target>
+	<!-- ===================================================================== -->
+	<!-- Steps to do after  running assemble. -->
+	<!-- ===================================================================== -->
+	<target name="postAssemble">
+	</target>
+	<!-- ===================================================================== -->
+	<!-- Steps to do before/after packaging RCP. -->
+	<!-- ===================================================================== -->
+	<target name="prePackage">
+	</target>
+	
+	<target name="postPackage">
+		<!-- copy build results for rcp build -->
+		<copy todir="${buildResultsDirectory}" flatten="true">
+			<fileset dir="${buildDirectory}" includes="${buildType}-**/*.zip" />
+		</copy>
+	</target>
+
+	<!-- ===================================================================== -->
+	<!-- Steps to do after the build is done. -->
+	<!-- ===================================================================== -->
+	<property name="buildResultsDirectory" value="${buildDirectory}/results" />
+	<target name="postBuild" depends="-prepareBuildResultsDirectory" unless="no.postBuild">
+		<antcall target="runTests"/>
+		<copy todir="${buildResultsDirectory}" flatten="true">
+			<fileset dir="${buildDirectory}" includes="${buildType}-**/*.zip" />
+		</copy>
+		<condition property="is.External.Postbuild">
+			<available file="${buildHome}/build-files/postBuild.xml"/>
+		</condition>
+		<antcall target="callExternalPostBuild"/>
+	</target>
+	<!-- ===================================================================== -->
+	<!-- Run tests. -->
+	<!-- ===================================================================== -->
+	<target name="runTests" if="isRunTests">
+		<property name="automatedTestsHome" location="${buildHome}/build-files/automatedTests"/>
+
+		<ant antfile="${automatedTestsHome}/run-tests.xml" target="run" dir="${automatedTestsHome}">
+			<property name="test.result.dir" value="${buildResultsDirectory}/testresults"/>
+		</ant>
+	</target>	
+	<!--======================================================-->
+	<!-- Gather build results  -->
+	<!-- ==================================================== -->
+	<target name="-prepareBuildResultsDirectory">
+		<echo message="Creating ${buildResultsDirectory}" />
+		<mkdir dir="${buildResultsDirectory}" />	
+	</target>
+
+	<!--======================================================-->
+	<!-- Call External post build file if available -->
+	<!-- ==================================================== -->
+	<target name="callExternalPostBuild" if="is.External.Postbuild">
+		<ant antfile="${buildHome}/build-files/postBuild.xml"/>
+	</target>
+	
+	<target name="noDefault">
+		<echo message="You must specify a target when invoking this file" />
+	</target>
+</project>
diff --git a/org.apache.easyant4e.releng/build-files/fetchSvnAll.xml b/org.apache.easyant4e.releng/build-files/fetchSvnAll.xml
new file mode 100644
index 0000000..4437706
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/fetchSvnAll.xml
@@ -0,0 +1,5 @@
+<project name="Generated">
+  <target name="fetch.svn.all">
+    <!-- use pluginbuilder editor to change content -->
+  </target>
+</project>
\ No newline at end of file
diff --git a/org.apache.easyant4e.releng/build-files/pluginbuilder-anttasks.jar b/org.apache.easyant4e.releng/build-files/pluginbuilder-anttasks.jar
new file mode 100644
index 0000000..98d2c3e
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/pluginbuilder-anttasks.jar
Binary files differ
diff --git a/org.apache.easyant4e.releng/build-files/postBuild.xml b/org.apache.easyant4e.releng/build-files/postBuild.xml
new file mode 100644
index 0000000..983a954
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/postBuild.xml
@@ -0,0 +1,109 @@
+<project name="Run as part of postBuild" default="main">
+	<taskdef resource="net/sf/antcontrib/antcontrib.properties" classpath="${buildHome}/build-files/ant-contrib.jar" />
+	<taskdef resource="org/pluginbuilder/anttasks/pluginbuildertasks.properties" classpath="${buildHome}/build-files/pluginbuilder-anttasks.jar" />
+	
+	
+    <target name="main">
+    	<property name="UpdateSiteStagingLocation" value="${buildDirectory}/tmpUpdateSite/updateSite"/>
+    	<property name="UpdateSiteFinalLocation" value="${buildResultsDirectory}/../updateSite"/>
+    	<property name="siteXmlFile" value="${UpdateSiteStagingLocation}/site.xml"/>
+    	
+        <antcall target="-generateUpdateSite"/>
+    	<antcall target="-createNightlyBuildSiteXml"/>
+    	<zip destfile="${buildResultsDirectory}/updateSite-${version.full}.zip" basedir="${UpdateSiteStagingLocation}"/>
+    	<antcall target="deleteSiteXml"/>
+    	<copy todir="${UpdateSiteFinalLocation}">
+    		<fileset dir="${UpdateSiteStagingLocation}" includes="**"/>
+    	</copy>
+    	<delete dir="${UpdateSiteStagingLocation}/../.." includes="tmpUpdateSite/**" includeemptydirs="true"/>
+    	<antcall target="-p2"/>
+    </target>
+	
+	<target name="deleteSiteXml" unless="isNightlyBuild">
+		<!-- in release builds the site.xml should not be overwritten, so older version can survive -->
+		<delete file="${siteXmlFile}"/>
+	</target>
+    
+    <!--======================================================-->
+    <!-- UpdateSite Export target, to be called from allElements  -->
+    <!-- ==================================================== -->
+    <target name="updateSiteExport">
+        <ant antfile="build.xml" dir="${buildDirectory}/features/${id}/" target="build.update.jar">
+            <property name="feature.destination" value="${UpdateSiteStagingLocation}/features"/>
+            <property name="plugin.destination" value="${UpdateSiteStagingLocation}/plugins"/>
+        </ant>
+    </target>
+    
+    <target name="-generateUpdateSite">
+        <!-- Create the directory structure -->
+        <mkdir dir="${UpdateSiteStagingLocation}"/>
+        <mkdir dir="${UpdateSiteStagingLocation}/features"/>
+        <mkdir dir="${UpdateSiteStagingLocation}/plugins"/>
+    	<condition property="jarProcessor.sign" value="true">
+    		<istrue value="${signJars}"/>
+    	</condition>
+        <!-- Build the jar files -->
+        <ant antfile="${builder}/customTargets.xml" target="allElements">
+            <property name="genericTargets" value="${builder}/postBuild.xml"/>
+            <property name="target" value="updateSiteExport"/>
+        </ant>
+        <!-- site.xml files for integration and release builds are handled elsewhere -->
+        <antcall target="-createNightlyBuildSiteXml"/>
+        <delete dir="${buildDirectory}/temp.updatesite"/>
+    </target>
+	
+    <target name="-createNightlyBuildSiteXml">
+    	<echo>${siteXmlFile}</echo>
+        <echo file="${siteXmlFile}">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
+&lt;site&gt;
+		&lt;description&gt;${updateSiteDescription}&lt;/description&gt;
+</echo>
+    	<foreach list="${pluginbuilder.features}" delimiter="," target="-appendFeatureElement" param="featureId" inheritall="true"/> 
+        <echo file="${siteXmlFile}" append="true">		&lt;category-def name=&quot;${updateSiteCategoryName}&quot;
+            label=&quot;${updateSiteCategoryLabel}&quot;&gt;
+		&lt;/category-def&gt;
+&lt;/site&gt;</echo>
+    </target>
+
+	<target name="-appendFeatureElement">
+		<!-- we can not rely on ${version.full} at this point since people could use
+			a fix feature id like 0.5.0.qualifier. ${version.full} would only work if
+			the feature were set to 0.0.0 --> 
+		<loadfile property="featurexml" srcfile="${buildDirectory}/features/${featureId}/feature.xml"/>
+		<SetRegex input="${featurexml}" match="^.*&lt;feature.+?version=&quot;(.+?)&quot;.*$" property="realFeatureVersion" value="\1" />
+    	<echo file="${siteXmlFile}" append="true">		&lt;feature 
+		url=&quot;features/${featureId}_${realFeatureVersion}.jar&quot; 
+		id=&quot;${featureId}&quot; 
+		version=&quot;${realFeatureVersion}&quot;&gt; 
+    	&lt;category name=&quot;${updateSiteCategoryName}&quot;/&gt; 
+		&lt;/feature&gt;
+</echo>    	
+    </target>
+	
+	<target name="-p2">
+		<condition property="is.p2" value="true">
+				<equals  arg1="${generate.p2.metadata}" arg2="true"/>
+		</condition>
+		<property name="p2archive" value="${buildResultsDirectory}/p2-repository-${version.full}.zip"/>
+		<antcall target="-createP2Archive"/>
+		<antcall target="-createP2UpdateSite"/>
+	</target>
+		
+	<target name="-createP2Archive" if="is.p2">
+		<pathconvert property="repodir">
+			<resources>
+			      <url url="${p2.metadata.repo}"/>
+			</resources>
+			<map from="file:" to=""/>
+		</pathconvert>
+		<zip destfile="${p2archive}" basedir="${repodir}"/>
+	</target>
+	
+	<target name="-createP2UpdateSite" if="is.p2">
+		<property name="p2updatesite" value="${buildResultsDirectory}/../p2-updateSite"/>
+		<delete dir="${p2updatesite}"/>
+		<mkdir dir="${p2updatesite}"/>
+		<unzip src="${p2archive}" dest="${p2updatesite}"/>
+	</target>
+	
+</project>
diff --git a/org.apache.easyant4e.releng/build-files/subversionSupport.xml b/org.apache.easyant4e.releng/build-files/subversionSupport.xml
new file mode 100644
index 0000000..55929b4
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/subversionSupport.xml
@@ -0,0 +1,26 @@
+<project name="to be included into customTargets.xml">
+
+	<import file="fetchSvnAll.xml"/>
+
+	<path id="project.classpath">
+		<pathelement location="${buildHome}/build-files/svn/svnant.jar"/>
+		<pathelement location="${buildHome}/build-files/svn/svnClientAdapter.jar"/>
+	</path>
+	
+  	<target name="fetchSubversion" if="is.svn.fetch">
+  		 <taskdef resource="svntask.properties" classpathref="project.classpath"/>
+  		 <property name="fetchTag" value="HEAD"/>
+  		 <antcall target="fetch.svn.all"/>
+  	</target>
+    
+    <target name="svn.co">
+    	<property name="target.dir" value="${element.id}"/>
+    	<condition property="svn.url" value="${pluginbuilder.svn.url}" else="${url}">
+    		<isset property="pluginbuilder.svn.url"/>
+    	</condition>
+     	<svn javahl="false" username="${pluginbuilder.svn.user}" password="${pluginbuilder.svn.password}">
+  			<checkout revision="${fetchTag}" url="${svn.url}/${project.name}" destPath="${buildDirectory}/${target}/${target.dir}" />
+  		</svn>    	
+	</target>  
+
+</project>
\ No newline at end of file
diff --git a/org.apache.easyant4e.releng/build-files/svn/SVNCLIENTADAPTER-LICENSE b/org.apache.easyant4e.releng/build-files/svn/SVNCLIENTADAPTER-LICENSE
new file mode 100644
index 0000000..4e11cce
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/svn/SVNCLIENTADAPTER-LICENSE
@@ -0,0 +1,185 @@
+SVNClientAdapter Library License
+
+This license applies to all portions of SVNClientAdapter library, which 
+are not externally-maintained libraries (e.g. JavaHL or JavaSVN).
+
+Such libraries have their own licenses; we recommend you read them, as
+their terms may differ from the terms below.
+
+=============================================================================
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
\ No newline at end of file
diff --git a/org.apache.easyant4e.releng/build-files/svn/svnClientAdapter.jar b/org.apache.easyant4e.releng/build-files/svn/svnClientAdapter.jar
new file mode 100644
index 0000000..a6ce6df
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/svn/svnClientAdapter.jar
Binary files differ
diff --git a/org.apache.easyant4e.releng/build-files/svn/svnant.jar b/org.apache.easyant4e.releng/build-files/svn/svnant.jar
new file mode 100644
index 0000000..ef9563a
--- /dev/null
+++ b/org.apache.easyant4e.releng/build-files/svn/svnant.jar
Binary files differ
diff --git a/org.apache.easyant4e.releng/build.properties b/org.apache.easyant4e.releng/build.properties
new file mode 100644
index 0000000..9f845e7
--- /dev/null
+++ b/org.apache.easyant4e.releng/build.properties
@@ -0,0 +1,210 @@
+# The prefix that will be used inside the generated archive. This should be set to eclipse
+# so that the archive can be directly unzipped into the dropins directory of the
+# Eclipse installation.
+# @category packaging
+archivePrefix=eclipse
+
+# The location under which all of the build output will be collected.
+# @category packaging
+collectingFolder=${archivePrefix}
+
+# Choose configurations if you want to build configuration specific plug-ins. However, if you
+# only want to create RCP distributables for different platforms do not change the default
+# *,*,*. If you select any other entry than *,*,* you also have to provide an assemble task in allElements.xml. 
+# @category compiling
+# @type list separator=&;values=*,*,*&win32,win32,x86&linux,gtk,ppc&linux,gtk,x86 & linux,gtk,x86_64 & linux,motif,x86 & solaris,motif,sparc & solaris,gtk,sparc & aix,motif,ppc & hpux,motif,PA_RISC & macosx,carbon,ppc & macosx,carbon,x86
+#configs=*,*,*
+
+
+# By default PDE creates one archive (result) per entry listed in the configs property.
+# Setting this value to true will cause PDE to only create one output containing all 
+# artifacts for all the platforms listed in the configs property.
+# @category packaging
+# @type Boolean
+#groupConfigurations=false
+
+#The format of the archive. By default a zip is created using antZip.
+#The list can only contain the configuration for which the desired format is different than zip.
+# E.g. win32,win32,x86 - antZip
+#archivesFormat=
+	
+# Set to true for Jnlp generation
+# @category jnlp
+# @type Boolean
+# generateJnlp=false
+
+# Codebase should be a URL that will be used as the root of all relative URLs in the output.
+# @category jnlp
+#jnlp.codebase=<codebase url>
+
+# @category jnlp
+#jnlp.j2se=<j2se version>
+
+# @category jnlp
+#jnlp.locale=<a locale>
+
+# Generate <offlineAllowed/> attribute in the generated features
+# @category jnlp
+# @type Boolean
+#jnlp.generateOfflineAllowed=
+
+# Set to ${configs} in order to filter the content of the generated jnlp files based on the configuration being built
+# @category jnlp
+# @type enum values=${configs} 
+# jnlp.configs=			
+
+# Check if you want to sign jars
+# @type Boolean
+# @category jarsigning
+#signJars=false
+
+# The Alias used for signing jars
+# @category jarsigning
+#sign.alias=
+
+# A path to the keystore used for signing jars
+# @category jarsigning
+#sign.keystore=
+
+# The password for the keystore
+# @category jarsigning
+#sign.storepass=
+
+#Arguments to send to the zip executable
+# @category packaging
+zipargs=
+
+#Arguments to send to the tar executable
+# @category packaging
+tarargs=
+
+# Control the creation of a file containing the version included in each configuration - on by default
+# @type Boolean 
+#generateVersionsLists=true
+
+# Indicates whether you want the set of plug-ins and features to be considered during the build to be limited to the ones reachable from the features / plugins being built
+# @type Boolean
+filteredDependencyCheck=false
+
+# Indicates whether the resolution should be done in development mode (i.e. ignore multiple bundles with singletons)
+# @type Boolean
+resolution.devMode=false
+
+#pluginPath is a list of locations in which to find plugins and features.  This list is separated by the platform file separator (; or :)
+#a location is one of:  
+#- the location of the jar or folder that is the plugin or feature : /path/to/foo.jar or /path/to/foo
+#- a directory that contains a /plugins or /features subdirectory
+#- the location of a feature.xml, or for 2.1 style plugins, the plugin.xml or fragment.xml
+#pluginPath=
+
+
+# The location of the Java jars to compile against.  Typically the rt.jar for your JDK/JRE
+# @category compiling
+# bootclasspath=${java.home}/lib/rt.jar
+
+# @category executionEnvironment
+#CDC-1.0/Foundation-1.0=
+# @category executionEnvironment
+#CDC-1.1/Foundation-1.1=
+# @category executionEnvironment
+#OSGi/Minimum-1.0=
+# @category executionEnvironment
+#OSGi/Minimum-1.1=
+# @category executionEnvironment
+#JRE-1.1=
+# @category executionEnvironment
+#J2SE-1.2=
+# @category executionEnvironment
+#J2SE-1.3=
+# @category executionEnvironment
+#J2SE-1.4=
+# @category executionEnvironment
+#J2SE-1.5=
+# @category executionEnvironment
+#JavaSE-1.6=
+# @category executionEnvironment
+#PersonalJava-1.1=
+# @category executionEnvironment
+#PersonalJava-1.2=
+# @category executionEnvironment
+#CDC-1.0/PersonalBasis-1.0=
+# @category executionEnvironment
+#CDC-1.0/PersonalJava-1.0=
+# @category executionEnvironment
+#CDC-1.1/PersonalBasis-1.1=
+# @category executionEnvironment
+#CDC-1.1/PersonalJava-1.1=
+
+# Specify the output format of the compiler log when eclipse jdt is used
+# @category compiling
+logExtension=.log
+
+# Whether or not to include debug info in the output jars
+# @category compiling
+# @type Boolean
+javacDebugInfo=false
+
+# Whether or not to fail the build if there are compiler errors
+# @category compiling
+# @type Boolean
+javacFailOnError=true
+
+# Enable or disable verbose mode of the compiler
+# @category compiling
+# @type Boolean
+javacVerbose=false
+
+# Extra arguments for the compiler. These are specific to the java compiler being used.
+# @category compiling
+#compilerArg=
+
+# Default value for the version of the source code. This value is used when compiling plug-ins that do not set the Bundle-RequiredExecutionEnvironment or set javacSource in build.properties
+# @type enum values=1.1,1.2,1.3,1.4,1.5,1.6
+# @category compiling
+#javacSource=1.3
+javacSource=1.5
+
+# Default value for the version of the byte code targeted. This value is used when compiling plug-ins that do not set the Bundle-RequiredExecutionEnvironment or set javacTarget in build.properties.
+# @type enum values=1.1,1.2,1.3,1.4,1.5,1.6
+# @category compiling
+#javacTarget=1.1
+javacTarget=1.5
+
+# Set the description for the update site. The update manager shows the description in the Updates dialog.
+# @category updateSite
+updateSiteDescription=Update site generated by pluginbuilder.
+
+# There will be one category for the generated update site. Here you can set the name.
+# It is more like an id with which features refer to their category and does not appear in the GUI.
+# @category updateSite
+updateSiteCategoryName=Builds
+
+# Here you can set the Label of the category which will be displayed in the Updates dialog.
+# @category updateSite
+updateSiteCategoryLabel=Nightly Builds
+
+# Create a provisioning (p2) repository. Since Eclipse 3.4 it is recommended that you create
+# a p2 repository for your features.
+# However, the installation of old-style (pre p2) update sites is still possible.
+# @type Boolean
+# @category p2
+generate.p2.metadata=true
+
+# @category hidden
+p2.metadata.repo=file:${buildDirectory}/repo
+
+# @category hidden
+p2.artifact.repo=file:${buildDirectory}/repo
+
+# The name of the metadata repository. The Update Manager will display this name.
+# @category p2
+p2.metadata.repo.name=EasyAnt For Eclipse Update Site
+
+# The name of the artifacts repository
+# @category p2
+p2.artifact.repo.name=Artifact Repo Name
+
+# @category hidden
+p2.flavor=tooling
+# @category hidden
+p2.publish.artifacts=true
\ No newline at end of file
diff --git a/org.apache.easyant4e.releng/build.xml b/org.apache.easyant4e.releng/build.xml
new file mode 100644
index 0000000..54d8485
--- /dev/null
+++ b/org.apache.easyant4e.releng/build.xml
@@ -0,0 +1,243 @@
+<!--  This script will not be uploaded to the server.
+      PLEASE DO NOT MODIFY 
+      If you modify this script it is likely that the build will not work on the server
+-->
+<project name="Build Facade" default="main">
+	<taskdef resource="org/pluginbuilder/anttasks/pluginbuildertasks.properties" classpath="build-files/pluginbuilder-anttasks.jar" />
+	
+	<GetHostName />
+	<property file="build_${hostname}.properties" />
+	<property file="build_local.properties" />
+	<property name="eclipse.installation.dir" value="${eclipseDir}"/>
+	<import file="build-files/build_shared.xml"/>
+	
+	<target name="-properties">		
+		
+		<!-- versioning -->
+		<property name="build.version" value="HEAD"/>
+		<property name="releaseConfigFile" value="releases/${build.version}.properties"/>
+		<condition property="releaseConfigFile.exists">
+			<available file="${releaseConfigFile}"/>
+		</condition>
+		<fail message="Could not read release config file: ${releaseConfigFile}" unless="releaseConfigFile.exists"/>
+		<property file="${releaseConfigFile}" />
+
+		<tstamp>
+		      <format property="version.qualifier" pattern="yyyyMMddHHmm" timezone="GMT" unit="minute"/>
+		</tstamp>
+		
+		<property name="buildTypePresentation" value=""/>
+		<property name="version.full" value="${version}.${version.qualifier}${buildTypePresentation}"/>
+
+		<!-- includes -->
+		<GetHostName />
+		<property file="build_${hostname}.properties" />
+		<property file="build_local.properties" />
+		<property file="pluginbuilder.config" />
+		
+		<!-- set defaults -->
+		<property name="buildTarget" value="main"/>
+		<property name="verboseAnt" value="-Ddummy=true"/>
+		
+		<!-- check if clean should be called -->
+		<condition property="is.clean">
+			<or>
+				<equals arg1="main" arg2="${buildTarget}" trim="true"/>
+		   		<equals arg1="fetch" arg2="${buildTarget}" trim="true"/>
+			</or>
+		</condition>
+		
+		<condition property="no.rcp.build" value="true">
+			<not>
+				<equals arg1="${pluginbuilder.is.rcpbuild}" arg2="true"/>
+			</not>
+		</condition>
+				
+	</target>
+		
+	<target name="-prepare.build.host">
+
+		<antcall target="unpack.eclipse"/>
+		
+		<available type="dir" file="${eclipseDir}/plugins" property="eclipseDir.plugins.exists"/>
+		<fail message="Could not find directory ${eclipseDir}/plugins. Please check eclipseDir in build_local.properties" unless="eclipseDir.plugins.exists"/>
+		
+		<!-- determine buildfiles -->
+		<BundleFileLocator eclipseInstallationRoot="${eclipseDir}" bundleId="org.eclipse.pde.build" filePath="scripts/build.xml" property="regularbuildfile" />		
+		<dirname file="${regularbuildfile}" property="scriptdir"/>
+		<property name="productbuildfile" value="${scriptdir}/productBuild/productBuild.xml"/>
+	
+		<!-- determine launcher -->
+		<BundleFileLocator eclipseInstallationRoot="${eclipseDir}" bundleId="org.eclipse.equinox.launcher" property="equinoxjar" />		
+
+	</target>
+	
+	<target name="-clean" if="is.clean">
+		<echo level="info" message="Cleaning directory ${buildDirectory}"/>
+		<delete dir="${buildDirectory}" verbose="false"/>
+		<mkdir dir="${buildDirectory}"/>
+	</target>
+	
+	<target name="-build" depends="-properties,-clean,-prepare.build.host">
+		<condition property="no.rcp.build" value="true">
+			<not>
+				<equals arg1="${pluginbuilder.is.rcpbuild}" arg2="true"/>
+			</not>
+		</condition>
+		<antcall target="-build.internal">
+			<param name="buildfile" value="${regularbuildfile}"/>
+	    </antcall>
+		<!-- build rcp omitting fetch -->
+		<property name="buildSystemProperty.skipFetch" value="true"/>
+		<antcall target="-build.rcp.internal"/>
+	</target>
+	
+	<target name="-build.rcp.internal" unless="no.rcp.build">
+		<property prefix="buildSystemProperty." file="${buildHome}/build-files/build_rcp.properties"/>
+		<antcall target="-checkProductProperty"/>
+		<antcall target="-build.internal"> 
+			<param name="buildfile" value="${productbuildfile}"/>
+		</antcall>
+	</target>
+
+	<target name="-checkProductProperty">
+		<condition property="isProductSet">
+			<and>
+				<isset property="buildSystemProperty.product"/>
+				<not><equals arg1="${product}" arg2=""/></not>
+			</and>
+		</condition>
+		<fail message="Building an RCP application requires a Product Configuration file to be specified ('product' property)." unless="isProductSet"/>
+	</target>
+	
+	<target name="rcp" depends="-properties,-clean,-prepare.build.host" description="Build RCP only">
+		<fail message="Please enable and configure an RCP build in the Plug-in Builder Editor before calling this target." if="no.rcp.build"/>
+		<antcall target="-build.rcp.internal"/>
+	</target>
+
+	<target name="-build.internal">
+		<property name="buildResultsDirectory" value="${buildDirectory}/results" />
+		
+		<java classname="org.eclipse.equinox.launcher.Main" fork="true" 
+			failonerror="true" errorproperty="build.stderr">
+			<arg value="-ws" />
+			<arg value="${ws}" />
+			<arg value="-os" />
+			<arg value="${os}" />
+			<arg value="-application" />
+			<arg value="org.eclipse.ant.core.antRunner" />
+			<arg value="-buildfile" />
+			<arg value="${buildfile}" />
+			<arg value="${buildTarget}" />
+			<arg value="-data" />
+			<arg value="${buildDirectory}/workspace" />
+			<arg value="${verboseAnt}"/>
+			<jvmarg value="-Dbasews=${ws}" />
+			<jvmarg value="-Dbaseos=${os}" />
+			<jvmarg value="-Dbasearch=${arch}" />
+			<jvmarg value="-Dbuilder=${buildHome}/build-files" />
+			<jvmarg value="-DjavacFailOnError=true"/>
+			<jvmarg value="-DbuildDirectory=${buildDirectory}"/>
+			<jvmarg value="-DbuildResultsDirectory=${buildResultsDirectory}"/>
+			<jvmarg value="-DbaseLocation=${eclipseDir}"/>
+			<jvmarg value="-DbuildHome=${buildHome}"/>
+			<jvmarg value="-Dversion.full=${version.full}"/>
+			<jvmarg value="-Dversion.qualifier=${version.qualifier}${buildTypePresentation}"/>
+			<jvmarg value="-DbuildType=${buildType}"/>
+			<jvmarg value="-DfetchTag=${fetchTag}"/>
+			<jvmarg value="-DbuildProperties=${buildHome}/build-files/build.properties"/>
+
+			<classpath>
+				<pathelement location="${equinoxjar}" />
+			</classpath>
+			
+			<syspropertyset>
+				<propertyset>
+					<propertyref prefix="buildSystemProperty"/>
+					<mapper type="glob" from="buildSystemProperty.*" to="*"/>
+				</propertyset>
+			</syspropertyset>
+		</java>
+		
+		<!-- save stderr for scrutinizing later -->
+		<echo file="${buildDirectory}/stderr.txt">${build.stderr}</echo>
+		
+		<echo taskname="stderr">${build.stderr}</echo>
+		
+		<condition property="is.build.error" value="true">
+			<contains string="${build.stderr}" substring="BUILD FAILED"/>
+		</condition>
+		<!-- Note that the fail task throws an exception which will be intercepted
+		     from calling antcalls. During that processing the status will 
+		     be lost and set to 1. Therefor ethe processing of TESTS FAILED which should 
+		     return an exit status of 2 can only take place in main targets. --> 
+		<fail message="PDE Build failed" if="is.build.error" status="1"/>
+
+	</target>
+	
+	<target name="main-cc"
+			description="This target is suited to be run from cruisecontrol. The property 'label' is expected to be set from cruisecontrol.">
+		<!-- Note that pluginbuilder also provides an EclipseLabelIncrementer which creates Eclipse version labels.
+			see http://www.pluginbuilder.org/faq.html -->
+		<property name="version.full" value="${label}"/> 
+		<SetRegex input="${label}" match=".+\..+\..+\.(.*)" property="version.qualifier" value="\1" />
+		<antcall target="-build"/>
+	</target>
+	
+	<target name="main" description="Run the main target of customTargets.xml. Return status 0,1,2 for Success, Build Failure and Test Failure">
+		<property name="buildTarget" value="main"/>
+		<antcall target="-build"/>
+
+		<!-- this must be done in a top level target because otherwise the 
+		     status would not get throuhg. If fail is called somewhere within
+		     an antcall the created exception will be caught which would result
+		     in a return status of 1 -->
+		<loadfile srcFile="${buildDirectory}/stderr.txt" property="build.stderr"/>
+		<condition property="is.tests.failed" value="true">
+			<contains string="${build.stderr}" substring="TESTS FAILED"/>
+		</condition>
+		<fail message="Tests failed" if="is.tests.failed" status="2"/>		
+	</target>
+
+	<target name="fetch" description="Run the fetch target of customTargets.xml.">
+		<property name="buildTarget" value="fetch"/>
+		<antcall target="-build"/>
+	</target>	
+	
+	<target name="generate" description="Run the generate target of customTargets.xml.">
+		<property name="buildTarget" value="generate"/>
+		<antcall target="-build"/>
+	</target>
+	
+	<target name="process" description="Run the process target of customTargets.xml.">
+		<property name="buildTarget" value="process"/>
+		<antcall target="-build"/>
+	</target>
+			
+	<target name="assemble" description="Run the assemble target of customTargets.xml.">
+		<property name="buildTarget" value="assemble"/>
+		<antcall target="-build"/>
+	</target>
+	
+	<target name="postBuild" description="Run the postBuild target of customTargets.xml.">
+		<property name="buildTarget" value="postBuild"/>
+		<antcall target="-build"/>
+		<!-- see main for a description why this must take place here. It is very ugly -->
+		<loadfile srcFile="${buildDirectory}/stderr.txt" property="build.stderr"/>
+		<condition property="is.tests.failed" value="true">
+			<contains string="${build.stderr}" substring="TESTS FAILED"/>
+		</condition>
+		<fail message="Tests failed" if="is.tests.failed" status="2"/>
+	</target>
+	
+	<target name="buildProperties" description="Print out derived properties for the current build." depends="-properties">
+		<fail message="You have to set the property 'buildPropertiesFile' if calling buildProperties" unless="buildPropertiesFile"/>
+		<condition property="subdir" value="nightly" else="releases">
+			<equals arg1="${buildType}" arg2="N"/>
+		</condition>
+		<echo file="${buildPropertiesFile}">relativeServerResultsDir: ${subdir}
+version.full: ${version.full}
+version.qualifier: ${version.qualifier}</echo>
+	</target>
+
+</project>
\ No newline at end of file
diff --git a/org.apache.easyant4e.releng/build_local.properties b/org.apache.easyant4e.releng/build_local.properties
new file mode 100644
index 0000000..c165ebd
--- /dev/null
+++ b/org.apache.easyant4e.releng/build_local.properties
@@ -0,0 +1,26 @@
+# The location of this pluginbuilder project. It provides the base directory for the build scripts.
+# @category localsettings
+# @type Directory
+buildHome=/home/jerome/tools/easyant/easyant4e.git/org.apache.easyant4e.releng
+
+# The directory where the build takes place. This directory WILL BE DELETED before every build.
+# @category localsettings
+# @type Directory
+buildDirectory=/home/jerome/pluginbuilder/org.apache.easyant4e.releng
+
+# The eclipse build host. Must be an Eclipse SDK installation with JDT and PDE. And in the case of RCP builds the RCP Delta Pack must be included, too.
+# @category localsettings
+# @type Directory
+eclipseDir=/home/jerome/tools/easyant/eclipse
+
+# Environment for both the Eclipse build and test host. Determines baseos.
+# @category localsettings
+os=linux
+
+# Environment for both the Eclipse build and test host. Determines basews.
+# @category localsettings
+ws=gtk
+
+# Environment for both the Eclipse build and test host. Determines basearch.
+# @category localsettings
+arch=x86
\ No newline at end of file
diff --git a/org.apache.easyant4e.releng/build_shared.xml b/org.apache.easyant4e.releng/build_shared.xml
new file mode 100644
index 0000000..8d17365
--- /dev/null
+++ b/org.apache.easyant4e.releng/build_shared.xml
@@ -0,0 +1,116 @@
+<project name="Shared build targets">
+	<!-- the following properties must be set from the calling script 
+    <property name="eclipse.installation.dir" value="${buildDirectory}"/>
+    <property name="eclipse.local.tar.non.server" value="${test.eclipse.zip}"/>
+    eclipse.download.cache,pluginbuilder.eclipse.url
+    optional:
+    <property name="pluginbuilder.additional.feature.urls" value="featureurl1,featureurl2"/>
+    -->
+    
+	<taskdef resource="net/sf/antcontrib/antcontrib.properties" classpath="${buildHome}/build-files/ant-contrib.jar" />
+	
+	<target name="unpack.eclipse">
+		<condition property="unpack.eclipse">
+			<not>
+				<available type="dir" file="${eclipse.installation.dir}"/>
+			</not>
+		</condition>
+		<antcall target="-unpack.eclipse.ifnecessary"/>
+	</target>    
+    
+	<!-- call either with or feature.url or pluginbuilder.eclipse.url
+		 sets property archive.location to the archive path in download cache.
+	 -->
+	<target name="-set.archive.location" if="pluginbuilder.is.server">
+		<!-- set default, useful for server where pluginbuilder.eclipse.url.default can be specified in build_local.properties --> 
+		<property name="pluginbuilder.eclipse.url" value="${pluginbuilder.eclipse.url.default}"/>
+		<condition property="archive.url" value="${feature.url}" else="${pluginbuilder.eclipse.url}">
+				<isset property="feature.url"/>
+		</condition>
+		<mkdir dir="${eclipse.download.cache}"/>
+		<tempfile destdir="${eclipse.download.cache}" property="tmp.file" suffix=".txt" prefix="downloadurl"/>		
+		<echo file="${tmp.file}" message="${archive.url}"/>
+		<checksum file="${tmp.file}" property="pluginbuilder.eclipse.url.checksum"/>
+		<delete file="${tmp.file}"/>
+		<property name="archive.location" value="${eclipse.download.cache}/${pluginbuilder.eclipse.url.checksum}"/>
+		<!-- <echo message="${archive.location} is archive location for ${archive.url}"/> -->
+	</target>
+	
+	<target name="-set.eclipse.local.tar.server" if="pluginbuilder.is.server" depends="-set.archive.location">
+		<property name="eclipse.local.tar" value="${archive.location}"/>
+	</target>
+	
+	<target name="-set.eclipse.local.tar.non.server" unless="pluginbuilder.is.server">
+		<property name="eclipse.local.tar" value="${eclipse.local.tar.non.server}"/>
+	</target>
+	
+	<target name="-get.archive.ifnecessary" unless="eclipse.is.downloaded">
+		<condition property="archive.url" value="${feature.url}" else="${pluginbuilder.eclipse.url}">
+				<isset property="feature.url"/>
+		</condition>
+		<get src="${archive.url}" dest="${archive.location}" />		
+	</target>
+	
+	<target name="-get.archive" depends="-set.archive.location" if="pluginbuilder.is.server">
+		<condition property="eclipse.is.downloaded">
+			<available file="${archive.location}" property="${eclipse.is.downloaded}"/>
+		</condition>		
+		<antcall target="-get.archive.ifnecessary"/> 
+	</target>
+	
+	<target name="-get.features" if="pluginbuilder.is.server" >
+		<property name="pluginbuilder.feature.urls" value="${pluginbuilder.feature.urls.default}"/>
+		<foreach list="${pluginbuilder.feature.urls}" param="feature.url" delimiter="," target="-get.archive" inheritall="true"/>
+	</target>
+	
+	<target name="-unpack.features" if="pluginbuilder.is.server">
+		<property name="pluginbuilder.feature.urls" value="${pluginbuilder.feature.urls.default}"/>
+		<foreach list="${pluginbuilder.feature.urls}" param="feature.url" delimiter="," target="-unpack.feature" inheritall="true"/>
+	</target>
+	
+	<target name="-unpack.feature" depends="-set.archive.location">
+		<property name="tempunziplocation" value="${buildDirectory}/tmpunzip"/>
+		<delete dir="${tempunziplocation}" failonerror="false"/>
+		<mkdir dir="${tempunziplocation}"/>
+		<unzip src="${archive.location}" overwrite="true" dest="${tempunziplocation}"/>
+		<condition property="moveroot" value="${tempunziplocation}/eclipse" else="${tempunziplocation}">
+				<available file="${tempunziplocation}/eclipse" type="dir"/>
+		</condition>
+		<move todir="${eclipse.installation.dir}" includeemptydirs="true">
+			<fileset dir="${moveroot}" includes="**"/>
+		</move>
+	</target>
+			
+	<target name="-unpack.eclipse.ifnecessary" if="unpack.eclipse">
+		<antcall target="-get.archive"/>
+		<condition property="is.windows">
+		  <os family="windows"/>
+		</condition>
+		<antcall target="-unpack.eclipse.windows"/>
+		<antcall target="-unpack.eclipse.linux"/>
+		<antcall target="-get.features"/>
+		<antcall target="-unpack.features"/>
+	</target>
+	
+	<target name="-unpack.eclipse.windows" if="is.windows" depends="-set.eclipse.local.tar.server,-set.eclipse.local.tar.non.server">
+		<unzip src="${eclipse.local.tar}" overwrite="true" dest="${eclipse.installation.dir}/.."/>		
+	</target>
+	
+	<target name="-unpack.eclipse.linux" unless="is.windows" depends="-set.eclipse.local.tar.server,-set.eclipse.local.tar.non.server">
+		<untar src="${eclipse.local.tar}" overwrite="true" dest="${eclipse.installation.dir}/.." compression="gzip"/>		
+	</target>
+	
+	<target name="test">
+		<property name="buildDirectory" value="C:/Temp/tst"/>
+		<mkdir dir="${buildDirectory}"/>
+		<property name="eclipse.download.cache" value="C:/Temp/downloadcache"/>
+		<property name="pluginbuilder.is.server" value="true"/>
+		<property name="pluginbuilder.eclipse.url" value="http://mirror.yoxos-eclipse-distribution.de/eclipse.org/eclipse/downloads/drops/R-3.2.2-200702121330/eclipse-PDE-3.2.2.zip"/>
+		
+		<property name="eclipse.installation.dir" value="C:/Temp/eclipse_root/eclipse"/>
+		<delete dir="${eclipse.installation.dir}" failonerror="false"/>
+		<property name="pluginbuilder.feature.urls" value="http://self.pluginbuilder.org/0.2.0/org.pluginbuilder.feature-0.2.0.20070218PRD.zip,http://mirror.yoxos-eclipse-distribution.de/eclipse.org/eclipse/downloads/drops/R-3.2.2-200702121330/eclipse-examples-3.2.2.zip"/>
+		<antcall target="unpack.eclipse"/>
+	</target>
+	
+</project>
\ No newline at end of file
diff --git a/org.apache.easyant4e.releng/maps/all.map b/org.apache.easyant4e.releng/maps/all.map
new file mode 100644
index 0000000..cbbebef
--- /dev/null
+++ b/org.apache.easyant4e.releng/maps/all.map
@@ -0,0 +1,6 @@
+feature@org.apache.easyant4e.feature=COPY,/home/jerome/tools/easyant/easyant4e.git,org.apache.easyant4e.feature
+plugin@org.apache.easyant=COPY,/home/jerome/tools/easyant/easyant4e.git,org.apache.easyant
+plugin@org.apache.easyant4e=COPY,/home/jerome/tools/easyant/easyant4e.git,org.apache.easyant4e
+feature@org.apache.ivyde.feature=COPY,/home/jerome/tools/easyant/ivyde.git,org.apache.ivyde.feature
+plugin@org.apache.ivyde.eclipse=COPY,/home/jerome/tools/easyant/ivyde.git,org.apache.ivyde.eclipse
+plugin@org.apache.ivy=COPY,/home/jerome/tools/easyant,ivy.git
diff --git a/org.apache.easyant4e.releng/pluginbuilder.config b/org.apache.easyant4e.releng/pluginbuilder.config
new file mode 100644
index 0000000..6803fd6
--- /dev/null
+++ b/org.apache.easyant4e.releng/pluginbuilder.config
@@ -0,0 +1,10 @@
+#Mon Oct 19 21:52:24 GMT+01:00 2009
+autotestsuite.class.exclusions=.*All(Tests|PDE_Tests|_Tests|PDETests).*
+pluginbuilder.features=org.apache.easyant4e.feature
+pluginbuilder.is.svn=false
+autotestsuite.class.inclusions=.*
+pluginbuilder.is.runtests=false
+autotestsuite.plugin.inclusions=.*(test|tests)$
+pluginbuilder.is.cvs=false
+pluginbuilder.is.copy=true
+pluginbuilder.is.rcpbuild=false
diff --git a/org.apache.easyant4e.releng/releases/HEAD.properties b/org.apache.easyant4e.releng/releases/HEAD.properties
new file mode 100644
index 0000000..d21a3f3
--- /dev/null
+++ b/org.apache.easyant4e.releng/releases/HEAD.properties
@@ -0,0 +1,6 @@
+#Written from Plug-in Builder Editor
+#Sat Oct 17 22:41:09 GMT+01:00 2009
+buildType=N
+version=1.0.0
+fetchTag=HEAD
+buildTypePresentation=
diff --git a/org.apache.easyant4e.tests/.classpath b/org.apache.easyant4e.tests/.classpath
new file mode 100644
index 0000000..285106c
--- /dev/null
+++ b/org.apache.easyant4e.tests/.classpath
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="datas"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.apache.easyant4e.tests/.project b/org.apache.easyant4e.tests/.project
new file mode 100644
index 0000000..8b40ad6
--- /dev/null
+++ b/org.apache.easyant4e.tests/.project
@@ -0,0 +1,28 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.apache.easyant4e.tests</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.apache.easyant4e.tests/.settings/org.eclipse.jdt.core.prefs b/org.apache.easyant4e.tests/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..3210fba
--- /dev/null
+++ b/org.apache.easyant4e.tests/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Wed Jun 17 21:58:50 GMT+01:00 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/org.apache.easyant4e.tests/META-INF/MANIFEST.MF b/org.apache.easyant4e.tests/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..96add3d
--- /dev/null
+++ b/org.apache.easyant4e.tests/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Tests Plug-in
+Bundle-SymbolicName: org.apache.easyant4e.tests
+Bundle-Version: 1.0.0.qualifier
+Bundle-Activator: org.apache.easyant4e.tests.TestPlugin
+Require-Bundle: org.apache.easyant4e,
+ org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.junit4,
+ org.eclipse.core.resources,
+ org.eclipse.jdt.core,
+ org.eclipse.jdt.launching,
+ org.eclipse.ui.forms,
+ org.eclipse.jdt.ui,
+ org.eclipse.ui.ide,
+ org.eclipse.pde.core
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Import-Package: org.apache.easyant.core.report
diff --git a/org.apache.easyant4e.tests/build.properties b/org.apache.easyant4e.tests/build.properties
new file mode 100644
index 0000000..34d2e4d
--- /dev/null
+++ b/org.apache.easyant4e.tests/build.properties
@@ -0,0 +1,4 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .
diff --git a/org.apache.easyant4e.tests/datas/simplejavaproject/.classpath b/org.apache.easyant4e.tests/datas/simplejavaproject/.classpath
new file mode 100644
index 0000000..c6adc53
--- /dev/null
+++ b/org.apache.easyant4e.tests/datas/simplejavaproject/.classpath
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry excluding="/simplejavaproject/target" kind="src" output="target" path="src/main/java"/>
+	<classpathentry excluding="/simplejavaproject/target" kind="src" output="target" path="src/main/resources"/>
+	<classpathentry excluding="/simplejavaproject/target" kind="src" output="target" path="src/test/java"/>
+	<classpathentry excluding="/simplejavaproject/target" kind="src" output="target" path="src/test/resources"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
+	<classpathentry kind="con" path="org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/module.ivy/*"/>
+	<classpathentry kind="output" path="target"/>
+</classpath>
diff --git a/org.apache.easyant4e.tests/datas/simplejavaproject/.project b/org.apache.easyant4e.tests/datas/simplejavaproject/.project
new file mode 100644
index 0000000..8df07c7
--- /dev/null
+++ b/org.apache.easyant4e.tests/datas/simplejavaproject/.project
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>simplejavaproject</name>
+	<comment>simplejavaproject description</comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.apache.easyant4e.EasyAntBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.apache.easyant4e.EasyAntNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.apache.easyant4e.tests/datas/simplejavaproject/module.ivy b/org.apache.easyant4e.tests/datas/simplejavaproject/module.ivy
new file mode 100644
index 0000000..aeb4b6b
--- /dev/null
+++ b/org.apache.easyant4e.tests/datas/simplejavaproject/module.ivy
@@ -0,0 +1,26 @@
+<!--
+	Copyright 2008 the EasyAnt project
+	
+	See the NOTICE file distributed with this work for additional information 
+	regarding copyright ownership.
+	
+	Licensed under the Apache License, Version 2.0 (the "License");
+	you may not use this file except in compliance with the License.
+	You may obtain a copy of the License at
+	
+	http://www.apache.org/licenses/LICENSE-2.0
+	
+	Unless required by applicable law or agreed to in writing, software
+	distributed under the License is distributed on an "AS IS" BASIS,
+	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+	See the License for the specific language governing permissions and
+	limitations under the License.  
+-->
+<ivy-module version="2.0" xmlns:ea="http://www.easyant.org"> 
+	<info organisation="org.apache.easyant" module="simplejavaproject" status="integration" >
+		<ea:build type="org.apache.easyant.buildtypes#build-std-java;0.2">
+			<ea:property name="run.main.classname" value="org.apache.easyant.example.Example"/>
+			<ea:plugin module="org.apache.easyant.plugins#run-java;0.1" as="run"/>
+       	</ea:build>
+	</info>
+</ivy-module>
diff --git a/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/AbstractEasyAntTest.java b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/AbstractEasyAntTest.java
new file mode 100644
index 0000000..35babc9
--- /dev/null
+++ b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/AbstractEasyAntTest.java
@@ -0,0 +1,94 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.tests;
+
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.EasyAntPlugin;
+import org.apache.easyant4e.services.EasyantCoreService;
+import org.apache.easyant4e.services.EasyantProjectService;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.ui.IPackagesViewPart;
+import org.eclipse.jdt.ui.JavaUI;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IPerspectiveDescriptor;
+import org.eclipse.ui.ISelectionService;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.junit.After;
+import org.junit.Before;
+
+import com.google.inject.Inject;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public abstract class AbstractEasyAntTest {
+	protected IProject testProject;
+	protected IJavaProject testJavaProject;
+	
+	@Inject
+	EasyantCoreService coreService;
+	
+	@Inject
+	EasyantProjectService projectService;
+	
+	@Before
+	public void setUp() throws Exception {
+		EasyAntPlugin easyAntPlugin = Activator.getEasyAntPlugin();
+		assertNotNull(easyAntPlugin);
+		easyAntPlugin.injectMembers(this);
+		assertNotNull(coreService);
+		assertNotNull(projectService);
+		
+		//System.out.println("setUp");
+		String testProjectName = "TestProject";
+		this.testProject = EclipseProjectBuilder.createProject(testProjectName);
+	    assertNotNull(testProject);
+	    IFile testModuleDesc = EclipseProjectBuilder.createModuleDescriptorFile(testProject, "org.apache.easyant");
+	    assertNotNull(testModuleDesc);
+	    assertTrue(testModuleDesc.exists());
+	    
+	    String testJavaProjectName = "TestJavaProject";
+	    this.testJavaProject = EclipseProjectBuilder.createJavaProject(testJavaProjectName);
+	    assertNotNull(testProject);
+	    IFile testJavaModuleDesc = EclipseProjectBuilder.createModuleDescriptorFile(testJavaProject.getProject(), "org.apache.easyant");
+	    assertNotNull(testJavaModuleDesc);
+	    assertTrue(testJavaModuleDesc.exists());	   
+	}
+	
+	@After
+	public void tearDown() throws CoreException {
+		if(this.testProject!=null){
+			EclipseProjectBuilder.deleteProject(testProject);
+			this.testProject = null;
+		}
+		if(this.testJavaProject!=null){
+			EclipseProjectBuilder.deleteProject(testJavaProject.getProject());
+			this.testJavaProject = null;			
+		}
+	}
+}
diff --git a/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/EasyAntAllTests.java b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/EasyAntAllTests.java
new file mode 100644
index 0000000..58d8274
--- /dev/null
+++ b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/EasyAntAllTests.java
@@ -0,0 +1,39 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.tests;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+@RunWith(Suite.class)
+@SuiteClasses(value = { 
+		ImportProjectTest.class,
+		StartupTest.class, 
+		EasyantCoreServiceTest.class,
+		EasyantProjectServiceTest.class	
+		
+})
+public class EasyAntAllTests {
+
+}
diff --git a/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/EasyantCoreServiceTest.java b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/EasyantCoreServiceTest.java
new file mode 100644
index 0000000..97a5a01
--- /dev/null
+++ b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/EasyantCoreServiceTest.java
@@ -0,0 +1,82 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.tests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.services.EasyantCoreService;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyantCoreServiceTest extends AbstractEasyAntTest {
+
+/*
+	@Test
+	public void testGetIvyInstance() {
+		Ivy ivy = coreService.getIvyInstance(testProject);
+		assertNotNull(ivy);
+	}
+*/
+
+	@Test
+	public void testGetPluginsRepositoryPath() {
+		String pluginsRepositoryPath = coreService.getPluginsRepositoryPath();
+		assertNotNull(pluginsRepositoryPath);
+		String pluginPath = System.getProperty("user.home") + "/.easyant/repository";
+		assertEquals(pluginPath, pluginsRepositoryPath);
+	}
+
+	@Test
+	public void testInstallPluginsRepository() {
+		String pluginsRepositoryPath = coreService.getPluginsRepositoryPath();
+		File pluginsRepositoryDir = new File(pluginsRepositoryPath);
+		assertTrue(deleteDirectory(pluginsRepositoryDir));
+		assertFalse(pluginsRepositoryDir.exists());
+		coreService.installPluginsRepository();
+		assertTrue(pluginsRepositoryDir.exists());
+	}
+
+	private boolean deleteDirectory(File path) {
+		boolean resultat = true;
+
+		if (path.exists()) {
+			File[] files = path.listFiles();
+			for (int i = 0; i < files.length; i++) {
+				if (files[i].isDirectory()) {
+					resultat &= deleteDirectory(files[i]);
+				} else {
+					resultat &= files[i].delete();
+				}
+			}
+		}
+		resultat &= path.delete();
+		return (resultat);
+	}
+
+}
diff --git a/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/EasyantProjectServiceTest.java b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/EasyantProjectServiceTest.java
new file mode 100644
index 0000000..d0028b9
--- /dev/null
+++ b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/EasyantProjectServiceTest.java
@@ -0,0 +1,121 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.tests;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.util.List;
+
+import org.apache.easyant.core.report.PhaseReport;
+import org.apache.easyant.core.report.TargetReport;
+import org.apache.easyant4e.EasyAntConstants;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.junit.Test;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyantProjectServiceTest extends AbstractEasyAntTest {
+
+/*
+	@Test
+	public void testGetIvyInstance() {
+		Ivy ivy = projectService.getIvyInstance(testProject);
+		assertNotNull(ivy);
+	}
+*/
+	
+	// @Test
+	// public void testAddNature(){
+	// assertFalse(projectService.hasEasyAntNature(testProject));
+	// projectService.addNature(testProject);
+	// assertTrue(projectService.hasEasyAntNature(testProject));
+	// assertFalse(projectService.hasEasyAntBuilder(testProject));
+	// }
+	//	
+	// @Test
+	// public void testRemoveNature(){
+	// assertFalse(projectService.hasEasyAntNature(testProject));
+	// projectService.addNature(testProject);
+	// assertTrue(projectService.hasEasyAntNature(testProject));
+	// assertFalse(projectService.hasEasyAntBuilder(testProject));
+	// projectService.removeNature(testProject);
+	// assertFalse(projectService.hasEasyAntNature(testProject));
+	// assertFalse(projectService.hasEasyAntBuilder(testProject));
+	// }
+
+	@Test
+	public void testAddNatureOnJavaProject() {
+		IProject javaProject = testJavaProject.getProject();
+		assertFalse(projectService.hasEasyAntNature(javaProject));
+		assertFalse(projectService.hasEasyAntBuilder(javaProject));
+		projectService.addNature(javaProject);
+		assertTrue(projectService.hasEasyAntNature(javaProject));
+		assertTrue(projectService.hasEasyAntBuilder(javaProject));
+		// TODO check classpath and source folder
+	}
+
+	@Test
+	public void testRemoveNatureOnJavaProject() {
+		IProject javaProject = testJavaProject.getProject();
+		assertFalse(projectService.hasEasyAntNature(javaProject));
+		projectService.addNature(javaProject);
+		assertTrue(projectService.hasEasyAntNature(javaProject));
+		assertTrue(projectService.hasEasyAntBuilder(javaProject));
+		projectService.removeNature(javaProject);
+		assertFalse(projectService.hasEasyAntNature(javaProject));
+		assertFalse(projectService.hasEasyAntBuilder(javaProject));
+		// TODO check classpath and source folder
+	}
+
+	@Test
+	public void testGetPhases() {
+		IProject javaProject = testJavaProject.getProject();
+		IFile ivyFile = javaProject.getFile("module.ivy");
+		assertNotNull(ivyFile);
+		List<PhaseReport> phases = projectService.getPhases(ivyFile);
+		assertNotNull(phases);		
+		assertTrue("nb phases:" + phases.size(), phases.size() > 0);
+	}
+
+	@Test
+	public void testGetTargets() {
+		IProject javaProject = testJavaProject.getProject();
+		IFile ivyFile = javaProject.getFile("module.ivy");
+		assertNotNull(ivyFile);
+		List<TargetReport> targets = projectService.getTargets(ivyFile);
+		assertNotNull(targets);		
+		assertTrue("nb targets:" + targets.size(), targets.size() > 0);
+	}
+
+	@Test
+	public void testRunBuild() {
+		try {
+			projectService.runBuild(testJavaProject.getProject(), "compile", EasyAntConstants.ANT_LOGLEVEL_DEBUG, null);
+		} catch (Exception e) {
+			fail(e.getMessage());
+		}
+	}
+
+}
diff --git a/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/EclipseProjectBuilder.java b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/EclipseProjectBuilder.java
new file mode 100644
index 0000000..c1e3a76
--- /dev/null
+++ b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/EclipseProjectBuilder.java
@@ -0,0 +1,249 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.tests;
+
+import java.io.ByteArrayInputStream;
+import java.io.InputStream;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.launching.JavaRuntime;
+
+/**
+ * This is a modified version of the TestProject class written by Erich Gamma
+ * and Kent Beck and described in their book
+ * "Contributing to Eclipse: Principles, Patterns, and Plug-Ins" It's largely
+ * inspired by Spring IDE TestSuite
+ */
+public class EclipseProjectBuilder {
+
+	// private IProject project;
+	// private IJavaProject javaProject;
+	// private IPackageFragmentRoot sourceFolder;
+
+	public EclipseProjectBuilder() throws CoreException {
+		// IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		// project = root.getProject("TestProject");
+		// project.create(null);
+		// project.open(null);
+		// javaProject = JavaCore.create(project);
+		//
+		// IFolder binFolder = createBinFolder();
+		//
+		// setJavaNature();
+		// javaProject.setRawClasspath(new IClasspathEntry[0], null);
+		//
+		// createOutputFolder(binFolder);
+		// addSystemLibraries();
+	}
+
+	public static IProject createProject(String name) throws CoreException {
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		IProject project = root.getProject(name);
+		project.create(null);
+		project.open(null);
+		return project;
+	}
+
+	public static IJavaProject createJavaProject(String name) throws CoreException {
+		IProject project = createProject(name);
+		IJavaProject javaProject = JavaCore.create(project);
+		addJavaNature(project);
+		javaProject.setRawClasspath(new IClasspathEntry[0], null);
+		createOutputFolder(javaProject);
+		addSystemLibraries(javaProject);
+		return javaProject;
+	}
+
+	private static void addJavaNature(IProject project) throws CoreException {
+		IProjectDescription description = project.getDescription();
+		description.setNatureIds(new String[] { JavaCore.NATURE_ID });
+		project.setDescription(description, null);
+	}
+
+	private static void createOutputFolder(IJavaProject javaProject) throws CoreException {
+		IFolder binFolder = createBinFolder(javaProject.getProject());
+		IPath outputLocation = binFolder.getFullPath();
+		javaProject.setOutputLocation(outputLocation, null);
+	}
+
+	private static IFolder createBinFolder(IProject project) throws CoreException {
+		IFolder binFolder = project.getFolder("bin");
+		binFolder.create(false, true, null);
+		return binFolder;
+	}
+
+	private static void addSystemLibraries(IJavaProject javaProject) throws JavaModelException {
+		IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
+		IClasspathEntry[] newEntries = new IClasspathEntry[oldEntries.length + 1];
+		System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length);
+		newEntries[oldEntries.length] = JavaRuntime.getDefaultJREContainerEntry();
+		javaProject.setRawClasspath(newEntries, null);
+	}
+
+	public static IFile createModuleDescriptorFile(IProject project, String org) throws CoreException {
+		IFile moduleDescFile = project.getFile("module.ivy");
+		String content = "" 
+				+ "<ivy-module version=\"2.0\" xmlns:ea=\"http://www.easyant.org\">"
+				+ "  <info organisation=\"" + org + "\" module=\"" + project.getName() + "\" status=\"integration\" >"
+				+ "    <description>project description</description>" 
+				+ "    <ea:build type=\"org.apache.easyant.buildtypes#build-std-java;0.2\" />"
+				+ "  </info>" 
+				+ "</ivy-module>";
+		InputStream in = new ByteArrayInputStream(content.getBytes());
+		moduleDescFile.create(in, true, null);
+		return moduleDescFile;
+	}
+
+	public static void deleteProject(IProject project) throws CoreException {
+		// waitForIndexer();
+		deleteProject(project, true);
+	}
+	
+	public static void deleteProject(IProject project, boolean deleteContent) throws CoreException {
+		// waitForIndexer();
+		project.delete(deleteContent, true, new NullProgressMonitor());
+	}
+
+	// public IJavaProject getJavaProject() {
+	// return javaProject;
+	// }
+
+	// public void addJar(String plugin, String jar) throws
+	// MalformedURLException,
+	// IOException, JavaModelException {
+	// Path result = findFileInPlugin(plugin, jar);
+	// IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
+	// IClasspathEntry[] newEntries = new IClasspathEntry[oldEntries.length +
+	// 1];
+	// System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length);
+	// newEntries[oldEntries.length] = JavaCore.newLibraryEntry(result, null,
+	// null);
+	// javaProject.setRawClasspath(newEntries, null);
+	// }
+	//
+	// public IPackageFragment createPackage(String name) throws CoreException {
+	// if (sourceFolder == null)
+	// sourceFolder = createSourceFolder();
+	// return sourceFolder.createPackageFragment(name, false, null);
+	// }
+	//
+	// public IType createType(IPackageFragment pack, String cuName, String
+	// source)
+	// throws JavaModelException {
+	// StringBuffer buf = new StringBuffer();
+	// buf.append("package " + pack.getElementName() + ";\n");
+	// buf.append("\n");
+	// buf.append(source);
+	// ICompilationUnit cu = pack.createCompilationUnit(cuName,
+	// buf.toString(), false, null);
+	// return cu.getTypes()[0];
+	// }
+	//
+	// /**
+	// * Wait for autobuild notification to occur, that is
+	// * for the autbuild to finish.
+	// */
+	// public void waitForAutoBuild() {
+	// boolean wasInterrupted = false;
+	// do {
+	// try {
+	// Platform.getJobManager().join(
+	// ResourcesPlugin.FAMILY_AUTO_BUILD, null);
+	// wasInterrupted = false;
+	// } catch (OperationCanceledException e) {
+	// throw (e);
+	// } catch (InterruptedException e) {
+	// wasInterrupted = true;
+	// }
+	// } while (wasInterrupted);
+	// }
+	//
+	// public void dispose() throws CoreException {
+	// waitForIndexer();
+	// project.delete(true, true, null);
+	// }
+	//
+
+	//
+	// public IFolder createXmlFolder() throws CoreException {
+	// IFolder xmlFolder = project.getFolder("xml");
+	// if (!xmlFolder.exists()) {
+	// xmlFolder.create(false, true, null);
+	// }
+	// return xmlFolder;
+	// }
+	//
+
+	//
+	// private IPackageFragmentRoot createSourceFolder() throws CoreException {
+	// IFolder folder = project.getFolder("src");
+	// folder.create(false, true, null);
+	// IPackageFragmentRoot root = javaProject.getPackageFragmentRoot(folder);
+	//
+	// IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
+	// IClasspathEntry[] newEntries = new IClasspathEntry[oldEntries.length +
+	// 1];
+	// System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length);
+	// newEntries[oldEntries.length] = JavaCore.newSourceEntry(root.getPath());
+	// javaProject.setRawClasspath(newEntries, null);
+	// return root;
+	// }
+	//
+
+	// private Path findFileInPlugin(String plugin, String file)
+	// throws MalformedURLException, IOException {
+	// IPluginRegistry registry = Platform.getPluginRegistry();
+	// IPluginDescriptor descriptor = registry.getPluginDescriptor(plugin);
+	// URL pluginURL = descriptor.getInstallURL();
+	// URL jarURL = new URL(pluginURL, file);
+	// URL localJarURL = Platform.asLocalURL(jarURL);
+	// return new Path(localJarURL.getPath());
+	// }
+	//
+	// private void waitForIndexer() throws JavaModelException {
+	// new SearchEngine().searchAllTypeNames(ResourcesPlugin.getWorkspace(),
+	// null, null, IJavaSearchConstants.EXACT_MATCH,
+	// IJavaSearchConstants.CASE_SENSITIVE,
+	// IJavaSearchConstants.CLASS, SearchEngine
+	// .createJavaSearchScope(new IJavaElement[0]),
+	// new ITypeNameRequestor() {
+	// public void acceptClass(char[] packageName,
+	// char[] simpleTypeName, char[][] enclosingTypeNames,
+	// String path) {
+	// }
+	//
+	// public void acceptInterface(char[] packageName,
+	// char[] simpleTypeName, char[][] enclosingTypeNames,
+	// String path) {
+	// }
+	// }, IJavaSearchConstants.WAIT_UNTIL_READY_TO_SEARCH, null);
+	// }
+}
diff --git a/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/ExtensionRegistryTest.java b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/ExtensionRegistryTest.java
new file mode 100644
index 0000000..d2c44ae
--- /dev/null
+++ b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/ExtensionRegistryTest.java
@@ -0,0 +1,85 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.tests;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.eclipse.core.internal.registry.ExtensionRegistry;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.IContributor;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionPoint;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.RegistryFactory;
+import org.eclipse.core.runtime.spi.IDynamicExtensionRegistry;
+import org.junit.Test;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class ExtensionRegistryTest {
+
+	@Test
+	public void testRemoveExtension() {
+		IExtensionRegistry reg = RegistryFactory.getRegistry();		
+		
+		//assertNull(reg.getExtension("org.apache.ivyde.eclipse.ui.actions.ResolveAction"));
+		//assertNull(reg.getExtension("org.eclipse.ui.popupMenus","org.apache.ivyde.eclipse.ui.actions.ResolveAction"));
+		//assertNull(reg.getExtension("org.eclipse.ui","popupMenus","org.apache.ivyde.eclipse.ui.actions.ResolveAction"));
+
+		IDynamicExtensionRegistry reg2 = (IDynamicExtensionRegistry)reg;
+		for(IContributor contributor : reg2.getAllContributors()){			
+			if("org.apache.ivyde.eclipse".equals(contributor.getName())){
+				System.out.println("--> contributor "+contributor);
+				reg2.removeContributor(contributor, ((ExtensionRegistry) reg2).getTemporaryUserToken());
+				System.out.println("--> remove all extensions ");
+			}
+		}		
+		
+//		IExtension[] extensions = reg.getExtensions("org.apache.ivyde.eclipse");
+//		assertNotNull(extensions);
+//		for(IExtension extension:extensions){
+//			if("org.eclipse.ui.popupMenus".equals(extension.getExtensionPointUniqueIdentifier())){
+//				reg.removeExtension(extension, ((ExtensionRegistry) reg).getTemporaryUserToken());
+//			}
+//			System.out.println(extension.getNamespaceIdentifier() +" - "+extension.getExtensionPointUniqueIdentifier());			
+//			final IConfigurationElement[] configElements = extension.getConfigurationElements();
+//	        for (IConfigurationElement element:configElements) {
+//	        	System.out.println("\t--> "+element.getName()+" : "+element.getAttribute("id"));		        	
+//	        }		        
+//		}
+		
+	
+	}
+
+//	private void removeExtension(String extensionPointId, String extensionId) {
+//		IExtensionRegistry reg = RegistryFactory.getRegistry();
+//		IExtension extension = reg.getExtension(extensionPointId, extensionId);
+//		if (extension != null) {
+//			reg.removeExtension(extension, getUserToken());
+//		}
+//	}
+//
+//	private Object getUserToken() {
+//		IExtensionRegistry registry = RegistryFactory.getRegistry();
+//		// return null; // require -Declipse.registry.nulltoken=true
+//		return ((ExtensionRegistry) registry).getTemporaryUserToken();
+//	}
+}
diff --git a/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/ImportProjectTest.java b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/ImportProjectTest.java
new file mode 100644
index 0000000..3c78a2d
--- /dev/null
+++ b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/ImportProjectTest.java
@@ -0,0 +1,165 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.tests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.io.File;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.EasyAntPlugin;
+import org.apache.easyant4e.services.EasyantProjectService;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.pde.core.plugin.IPluginModelBase;
+import org.eclipse.pde.core.plugin.PluginRegistry;
+import org.eclipse.pde.internal.core.util.CoreUtility;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.google.inject.Inject;
+
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class ImportProjectTest{
+	@Inject
+	EasyantProjectService projectService;
+	
+	@Before
+	public void setUp() throws Exception {
+		EasyAntPlugin easyAntPlugin = Activator.getEasyAntPlugin();
+		assertNotNull(easyAntPlugin);
+		easyAntPlugin.injectMembers(this);
+		assertNotNull(projectService);
+	}	
+	
+	IProject simpleJavaProject;
+	@Test
+	public void testImportSimpleProject() throws Exception {
+		final String projectName = "simplejavaproject";
+		IProjectDescription description = Activator.getEasyAntPlugin().getPluginWorkspace().newProjectDescription(projectName);
+		assertNotNull(description);
+		URL url = getClass().getResource("/datas/"+projectName);
+		assertNotNull(url);
+		String filePath = url.getFile();
+		assertNotNull(filePath);
+		//String testWorkspacePath = ResourcesPlugin.getWorkspace().getRoot().getLocation().toOSString();
+		
+		IPath projectLocation = getSimpleJavaProjectLocation(filePath);
+		assertNotNull(projectLocation);
+		description.setLocation(projectLocation);
+		final String comment = projectName+ " description";
+		description.setComment(comment);
+		String[] newNatures= {};
+		description.setNatureIds(newNatures);	
+	
+		Thread.sleep(2000);
+		Shell messageShell = PlatformUI.getWorkbench().getDisplay().getActiveShell();
+		assertNotNull(messageShell);
+		simpleJavaProject = projectService.importProject(description, messageShell, new NullProgressMonitor());
+		assertNotNull(simpleJavaProject);
+		assertTrue(simpleJavaProject.exists());
+		assertTrue(simpleJavaProject.isOpen());
+		assertEquals(projectName, simpleJavaProject.getName());
+		try {
+			assertEquals(comment, simpleJavaProject.getDescription().getComment());
+		} catch (CoreException e) {
+			fail(e.getMessage());
+		}
+		assertTrue(projectService.hasEasyAntNature(simpleJavaProject));
+		
+		//Assert source folders
+		assertTrue(simpleJavaProject.hasNature(JavaCore.NATURE_ID));	
+		IJavaProject javaProject = (IJavaProject)simpleJavaProject.getNature(JavaCore.NATURE_ID);
+		assertNotNull(javaProject);
+		List<IClasspathEntry> entries = new ArrayList<IClasspathEntry>();
+		entries.addAll(Arrays.asList(javaProject.getRawClasspath()));
+		assertTrue(entries.size()>0);
+		boolean srcMainJavaSourceFolderFound=false;
+		boolean srcTestJavaSourceFolderFound=false;
+		boolean srcMainResourcesSourceFolderFound=false;
+		boolean srcTestResourcesSourceFolderFound=false;
+		for(IClasspathEntry entry:entries){
+			if(IClasspathEntry.CPE_SOURCE==entry.getEntryKind()){
+				String path = entry.getPath().toOSString();
+				assertNotNull(path);
+				if("/simplejavaproject/src/main/java".equals(path)){
+					srcMainJavaSourceFolderFound=true;
+				}else if("/simplejavaproject/src/test/java".equals(path)){
+					srcTestJavaSourceFolderFound=true;
+				}else if("/simplejavaproject/src/main/resources".equals(path)){
+					srcMainResourcesSourceFolderFound=true;
+				}else if("/simplejavaproject/src/test/resources".equals(path)){
+					srcTestResourcesSourceFolderFound=true;
+				}
+			}
+		}
+		assertTrue(srcMainJavaSourceFolderFound);
+		assertTrue(srcTestJavaSourceFolderFound);
+		assertTrue(srcMainResourcesSourceFolderFound);
+		assertTrue(srcTestResourcesSourceFolderFound);
+		
+		//TODO assert classpath
+		//org.eclipse.jdt.launching.JRE_CONTAINER
+		//org.apache.ivyde.eclipse.cpcontainer.IVYDE_CONTAINER/module.ivy/*
+	}
+	
+	private IPath getSimpleJavaProjectLocation(String projectPath){
+		IPluginModelBase model = PluginRegistry.findModel(TestPlugin.PLUGIN_ID);
+		assertNotNull(model);
+		IPath projectLocation=null;
+		if (model != null && model.getInstallLocation() != null) {
+			File modelNode = new File(model.getInstallLocation());
+			String pluginPath = modelNode.getAbsolutePath();
+			projectLocation = new Path(pluginPath + "/" + projectPath);
+		}
+		return projectLocation;
+	}
+
+	@After
+	public void tearDown() throws CoreException {
+		if(simpleJavaProject!=null){
+			EclipseProjectBuilder.deleteProject(simpleJavaProject,false);
+		}
+	}
+}
diff --git a/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/StartupTest.java b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/StartupTest.java
new file mode 100644
index 0000000..e9e84bb
--- /dev/null
+++ b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/StartupTest.java
@@ -0,0 +1,82 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.tests;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.EasyAntPlugin;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.views.navigator.ResourceNavigator;
+import org.junit.Test;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class StartupTest extends AbstractEasyAntTest{
+	
+	@Test
+	public void testActivatorStartup() {
+		EasyAntPlugin easyAntPlugin = Activator.getEasyAntPlugin(); 
+		assertNotNull(easyAntPlugin);
+	}
+
+	@Test
+	public void testEasyAntCoreServiceInit() {
+		assertNotNull(coreService);			
+	}
+	
+	@Test
+	public void testEasyAntProjectServiceInit() {
+		assertNotNull(projectService);					
+	}
+		
+	@Test
+	public void testGetCurrentProject() {	    	
+		ResourceNavigator resourceNavigator = getResourceNavigator();
+		assertNotNull(resourceNavigator);
+		
+		resourceNavigator.selectReveal(new StructuredSelection(testProject));
+		IProject project1 = Activator.getEasyAntPlugin().getCurrentProject();
+		assertNotNull(project1);
+		assertEquals(testProject, project1);
+		
+		resourceNavigator.selectReveal(new StructuredSelection(testJavaProject));
+		IProject project2 = Activator.getEasyAntPlugin().getCurrentProject();
+		assertNotNull(project2);
+		assertEquals(testJavaProject.getProject(), project2);
+	}
+	
+	private ResourceNavigator getResourceNavigator(){
+		ResourceNavigator navigator = null;
+		try {
+			navigator = (ResourceNavigator) PlatformUI.getWorkbench()
+				.getActiveWorkbenchWindow().getActivePage().showView("org.eclipse.ui.views.ResourceNavigator");
+		} catch (PartInitException e) {
+			throw new RuntimeException(e);
+		}	
+		return navigator;
+	}
+	
+}
diff --git a/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/TestPlugin.java b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/TestPlugin.java
new file mode 100644
index 0000000..762452f
--- /dev/null
+++ b/org.apache.easyant4e.tests/src/org/apache/easyant4e/tests/TestPlugin.java
@@ -0,0 +1,50 @@
+package org.apache.easyant4e.tests;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class TestPlugin extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.apache.easyant4e.tests";
+
+	// The shared instance
+	private static TestPlugin plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public TestPlugin() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static TestPlugin getDefault() {
+		return plugin;
+	}
+
+}
diff --git a/org.apache.easyant4e/.checkstyle b/org.apache.easyant4e/.checkstyle
new file mode 100644
index 0000000..2984dfe
--- /dev/null
+++ b/org.apache.easyant4e/.checkstyle
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<fileset-config file-format-version="1.2.0" simple-config="true">
+    <local-check-config name="EasyAnt4E" location="/quality/checkstyle/checkstyle-config" type="project" description="">
+        <property name="checkstyle.src.dir" value="${basedir}/../quality/checkstyle"/>
+        <additional-data name="protect-config-file" value="false"/>
+    </local-check-config>
+    <fileset name="tous" enabled="true" check-config-name="EasyAnt4E" local="true">
+        <file-match-pattern match-pattern="." include-pattern="true"/>
+    </fileset>
+</fileset-config>
diff --git a/org.apache.easyant4e/.classpath b/org.apache.easyant4e/.classpath
new file mode 100644
index 0000000..edcdd29
--- /dev/null
+++ b/org.apache.easyant4e/.classpath
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry exported="true" kind="lib" path="lib/guice/guice-2.0.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/guice/aopalliance.jar"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/org.apache.easyant4e/.fbprefs b/org.apache.easyant4e/.fbprefs
new file mode 100644
index 0000000..621c424
--- /dev/null
+++ b/org.apache.easyant4e/.fbprefs
@@ -0,0 +1,124 @@
+#FindBugs User Preferences
+#Sun Apr 19 13:12:13 GMT+01:00 2009
+detectorAppendingToAnObjectOutputStream=AppendingToAnObjectOutputStream|true
+detectorBadAppletConstructor=BadAppletConstructor|false
+detectorBadResultSetAccess=BadResultSetAccess|true
+detectorBadSyntaxForRegularExpression=BadSyntaxForRegularExpression|true
+detectorBadUseOfReturnValue=BadUseOfReturnValue|true
+detectorBadlyOverriddenAdapter=BadlyOverriddenAdapter|true
+detectorBooleanReturnNull=BooleanReturnNull|true
+detectorCallToUnsupportedMethod=CallToUnsupportedMethod|true
+detectorCheckImmutableAnnotation=CheckImmutableAnnotation|true
+detectorCheckTypeQualifiers=CheckTypeQualifiers|true
+detectorCloneIdiom=CloneIdiom|true
+detectorComparatorIdiom=ComparatorIdiom|true
+detectorConfusedInheritance=ConfusedInheritance|true
+detectorConfusionBetweenInheritedAndOuterMethod=ConfusionBetweenInheritedAndOuterMethod|true
+detectorCrossSiteScripting=CrossSiteScripting|true
+detectorDoInsideDoPrivileged=DoInsideDoPrivileged|true
+detectorDontCatchIllegalMonitorStateException=DontCatchIllegalMonitorStateException|true
+detectorDontUseEnum=DontUseEnum|true
+detectorDroppedException=DroppedException|true
+detectorDumbMethodInvocations=DumbMethodInvocations|true
+detectorDumbMethods=DumbMethods|true
+detectorDuplicateBranches=DuplicateBranches|true
+detectorEmptyZipFileEntry=EmptyZipFileEntry|true
+detectorEqualsOperandShouldHaveClassCompatibleWithThis=EqualsOperandShouldHaveClassCompatibleWithThis|true
+detectorFinalizerNullsFields=FinalizerNullsFields|true
+detectorFindBadCast2=FindBadCast2|true
+detectorFindBadForLoop=FindBadForLoop|true
+detectorFindCircularDependencies=FindCircularDependencies|false
+detectorFindDeadLocalStores=FindDeadLocalStores|true
+detectorFindDoubleCheck=FindDoubleCheck|true
+detectorFindEmptySynchronizedBlock=FindEmptySynchronizedBlock|true
+detectorFindFieldSelfAssignment=FindFieldSelfAssignment|true
+detectorFindFinalizeInvocations=FindFinalizeInvocations|true
+detectorFindFloatEquality=FindFloatEquality|true
+detectorFindHEmismatch=FindHEmismatch|true
+detectorFindInconsistentSync2=FindInconsistentSync2|true
+detectorFindJSR166LockMonitorenter=FindJSR166LockMonitorenter|true
+detectorFindLocalSelfAssignment2=FindLocalSelfAssignment2|true
+detectorFindMaskedFields=FindMaskedFields|true
+detectorFindMismatchedWaitOrNotify=FindMismatchedWaitOrNotify|true
+detectorFindNakedNotify=FindNakedNotify|true
+detectorFindNonSerializableStoreIntoSession=FindNonSerializableStoreIntoSession|true
+detectorFindNonSerializableValuePassedToWriteObject=FindNonSerializableValuePassedToWriteObject|true
+detectorFindNonShortCircuit=FindNonShortCircuit|true
+detectorFindNullDeref=FindNullDeref|true
+detectorFindNullDerefsInvolvingNonShortCircuitEvaluation=FindNullDerefsInvolvingNonShortCircuitEvaluation|true
+detectorFindOpenStream=FindOpenStream|true
+detectorFindPuzzlers=FindPuzzlers|true
+detectorFindRefComparison=FindRefComparison|true
+detectorFindReturnRef=FindReturnRef|true
+detectorFindRunInvocations=FindRunInvocations|true
+detectorFindSelfComparison=FindSelfComparison|true
+detectorFindSelfComparison2=FindSelfComparison2|true
+detectorFindSleepWithLockHeld=FindSleepWithLockHeld|true
+detectorFindSpinLoop=FindSpinLoop|true
+detectorFindSqlInjection=FindSqlInjection|true
+detectorFindTwoLockWait=FindTwoLockWait|true
+detectorFindUncalledPrivateMethods=FindUncalledPrivateMethods|true
+detectorFindUnconditionalWait=FindUnconditionalWait|true
+detectorFindUninitializedGet=FindUninitializedGet|true
+detectorFindUnrelatedTypesInGenericContainer=FindUnrelatedTypesInGenericContainer|true
+detectorFindUnreleasedLock=FindUnreleasedLock|true
+detectorFindUnsatisfiedObligation=FindUnsatisfiedObligation|true
+detectorFindUnsyncGet=FindUnsyncGet|true
+detectorFindUselessControlFlow=FindUselessControlFlow|true
+detectorFormatStringChecker=FormatStringChecker|true
+detectorHugeSharedStringConstants=HugeSharedStringConstants|true
+detectorIDivResultCastToDouble=IDivResultCastToDouble|true
+detectorIncompatMask=IncompatMask|true
+detectorInconsistentAnnotations=InconsistentAnnotations|true
+detectorInefficientMemberAccess=InefficientMemberAccess|false
+detectorInefficientToArray=InefficientToArray|true
+detectorInfiniteLoop=InfiniteLoop|true
+detectorInfiniteRecursiveLoop=InfiniteRecursiveLoop|true
+detectorInfiniteRecursiveLoop2=InfiniteRecursiveLoop2|false
+detectorInheritanceUnsafeGetResource=InheritanceUnsafeGetResource|true
+detectorInitializationChain=InitializationChain|true
+detectorInstantiateStaticClass=InstantiateStaticClass|true
+detectorInvalidJUnitTest=InvalidJUnitTest|true
+detectorIteratorIdioms=IteratorIdioms|true
+detectorLazyInit=LazyInit|true
+detectorLoadOfKnownNullValue=LoadOfKnownNullValue|true
+detectorMethodReturnCheck=MethodReturnCheck|true
+detectorMultithreadedInstanceAccess=MultithreadedInstanceAccess|true
+detectorMutableLock=MutableLock|true
+detectorMutableStaticFields=MutableStaticFields|true
+detectorNaming=Naming|true
+detectorNumberConstructor=NumberConstructor|true
+detectorOverridingEqualsNotSymmetrical=OverridingEqualsNotSymmetrical|true
+detectorPreferZeroLengthArrays=PreferZeroLengthArrays|true
+detectorPublicSemaphores=PublicSemaphores|false
+detectorQuestionableBooleanAssignment=QuestionableBooleanAssignment|true
+detectorReadReturnShouldBeChecked=ReadReturnShouldBeChecked|true
+detectorRedundantInterfaces=RedundantInterfaces|true
+detectorRepeatedConditionals=RepeatedConditionals|true
+detectorRuntimeExceptionCapture=RuntimeExceptionCapture|true
+detectorSerializableIdiom=SerializableIdiom|true
+detectorStartInConstructor=StartInConstructor|true
+detectorStaticCalendarDetector=StaticCalendarDetector|true
+detectorStringConcatenation=StringConcatenation|true
+detectorSuperfluousInstanceOf=SuperfluousInstanceOf|true
+detectorSuspiciousThreadInterrupted=SuspiciousThreadInterrupted|true
+detectorSwitchFallthrough=SwitchFallthrough|true
+detectorSynchronizeAndNullCheckField=SynchronizeAndNullCheckField|true
+detectorSynchronizeOnClassLiteralNotGetClass=SynchronizeOnClassLiteralNotGetClass|true
+detectorSynchronizingOnContentsOfFieldToProtectField=SynchronizingOnContentsOfFieldToProtectField|true
+detectorURLProblems=URLProblems|true
+detectorUncallableMethodOfAnonymousClass=UncallableMethodOfAnonymousClass|true
+detectorUnnecessaryMath=UnnecessaryMath|true
+detectorUnreadFields=UnreadFields|true
+detectorUseObjectEquals=UseObjectEquals|false
+detectorUselessSubclassMethod=UselessSubclassMethod|false
+detectorVarArgsProblems=VarArgsProblems|true
+detectorVolatileUsage=VolatileUsage|true
+detectorWaitInLoop=WaitInLoop|true
+detectorWrongMapIterator=WrongMapIterator|true
+detectorXMLFactoryBypass=XMLFactoryBypass|true
+detector_threshold=2
+effort=default
+filter_settings=Medium|BAD_PRACTICE,CORRECTNESS,MT_CORRECTNESS,PERFORMANCE,STYLE|false
+filter_settings_neg=I18N,NOISE,MALICIOUS_CODE,SECURITY,EXPERIMENTAL|
+run_at_full_build=true
diff --git a/org.apache.easyant4e/.pmd b/org.apache.easyant4e/.pmd
new file mode 100644
index 0000000..726c68f
--- /dev/null
+++ b/org.apache.easyant4e/.pmd
@@ -0,0 +1,941 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<pmd>
+    <useProjectRuleSet>false</useProjectRuleSet>
+    <ruleSetFile>.ruleset</ruleSetFile>
+    <rules>
+        <rule>
+            <name>AvoidDecimalLiteralsInBigDecimalConstructor</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidMultipleUnaryOperators</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThreadGroup</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingHardCodedIP</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingOctalValues</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BigIntegerInstantiation</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanInstantiation</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BrokenNullCheck</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CheckResultSet</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassCastExceptionWithToArray</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CollapsibleIfStatements</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoubleCheckedLocking</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyCatchBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyFinallyBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyIfStmt</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyInitializer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyStatementNotInLoop</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyStaticInitializer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptySwitchStatements</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptySynchronizedBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyTryBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyWhileStmt</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ForLoopShouldBeWhileLoop</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JumbledIncrementer</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MisplacedNullCheck</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>OverrideBothEqualsAndHashcode</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReturnFromFinallyBlock</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnconditionalIfStatement</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryConversionTemporary</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryFinalModifier</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryReturn</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedNullCheckInEquals</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessOperationOnImmutable</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessOverridingMethod</name>
+            <ruleset>Basic Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ForLoopsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IfElseStmtsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IfStmtsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>WhileLoopsMustUseBraces</name>
+            <ruleset>Braces Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneThrowsCloneNotSupportedException</name>
+            <ruleset>Clone Implementation Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ProperCloneImplementation</name>
+            <ruleset>Clone Implementation Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CyclomaticComplexity</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveClassLength</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveMethodLength</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveParameterList</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessivePublicCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssConstructorCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssMethodCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NcssTypeCount</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NPathComplexity</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyFields</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyMethods</name>
+            <ruleset>Code Size Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AssignmentInOperand</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AtLeastOneConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidAccessibilityAlteration</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFinalLocalVariable</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingNativeCode</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingShortType</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidUsingVolatile</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanInversion</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CallSuperInConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DataflowAnomalyAnalysis</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DefaultPackage</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotCallGarbageCollectionExplicitly</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DontImportSun</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NullAssignment</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>OnlyOneReturn</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousOctalEscape</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryConstructor</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryParentheses</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedModifier</name>
+            <ruleset>Controversial Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CouplingBetweenObjects</name>
+            <ruleset>Coupling Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExcessiveImports</name>
+            <ruleset>Coupling Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractClassWithoutAbstractMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractClassWithoutAnyMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AccessorClassGeneration</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AssignmentToNonFinalStatic</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidConstantsInterface</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDeeplyNestedIfStmts</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidInstanceofChecksInCatchClause</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidProtectedFieldInFinalClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidReassigningParameters</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidSynchronizedAtMethodLevel</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BadComparison</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassWithOnlyPrivateConstructorsShouldBeFinal</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloseResource</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CompareObjectsWithEquals</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConfusingTernary</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConstructorCallsOverridableMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DefaultLabelNotLastInSwitchStmt</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyMethodInAbstractClassShouldBeAbstract</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EqualsNull</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalFieldCouldBeStatic</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IdempotentOperations</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ImmutableField</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InstantiationToGetClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingBreakInSwitch</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingStaticMethodInNonInstantiatableClass</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonCaseLabelInSwitchStatement</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonStaticInitializer</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NonThreadSafeSingleton</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>OptimizableToArrayCall</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PositionLiteralsFirstInComparisons</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PreserveStackTrace</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReturnEmptyArrayRatherThanNull</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimpleDateFormatNeedsLocale</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanExpressions</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanReturns</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyConditional</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SingularField</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SwitchDensity</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SwitchStmtsShouldHaveDefault</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooFewBranchesForASwitchStatement</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UncommentedEmptyConstructor</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UncommentedEmptyMethod</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryLocalBeforeReturn</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnsynchronizedStaticDateFormatter</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseCollectionIsEmpty</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseLocaleWithCaseConversions</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseNotifyAllInsteadOfNotify</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseSingleton</name>
+            <ruleset>Design Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCallingFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>EmptyFinalizer</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeDoesNotCallSuperFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeOnlyCallsSuperFinalize</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeOverloaded</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>FinalizeShouldBeProtected</name>
+            <ruleset>Finalizer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DontImportJavaLang</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DuplicateImports</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ImportFromSamePackage</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TooManyStaticImports</name>
+            <ruleset>Import Statement Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotCallSystemExit</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotUseThreads</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LocalHomeNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LocalInterfaceSessionNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MDBAndSessionBeanNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>RemoteInterfaceNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>RemoteSessionInterfaceNamingConvention</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StaticEJBFieldShouldBeFinal</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseProperClassLoader</name>
+            <ruleset>J2EE Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ProperLogger</name>
+            <ruleset>Jakarta Commons Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseCorrectExceptionLogging</name>
+            <ruleset>Jakarta Commons Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidPrintStackTrace</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LoggerIsNotStaticFinal</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MoreThanOneLogger</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SystemPrintln</name>
+            <ruleset>Java Logging Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BeanMembersShouldSerialize</name>
+            <ruleset>JavaBean Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MissingSerialVersionUID</name>
+            <ruleset>JavaBean Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitAssertionsShouldIncludeMessage</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitSpelling</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitStaticSuite</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitTestsShouldIncludeAssert</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyBooleanAssertion</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>TestClassWithoutTestCases</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryBooleanAssertion</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertEqualsInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertNullInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseAssertSameInsteadOfAssertTrue</name>
+            <ruleset>JUnit Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidAssertAsIdentifier</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidEnumAsIdentifier</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ByteInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>IntegerInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4SuitesShouldUseSuiteAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseAfterAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseBeforeAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnit4TestShouldUseTestAnnotation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>JUnitUseExpected</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LongInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceEnumerationWithIterator</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceHashtableWithMap</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ReplaceVectorWithList</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ShortInstantiation</name>
+            <ruleset>Migration Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AbstractNaming</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDollarSigns</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFieldNameMatchingMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidFieldNameMatchingTypeName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>BooleanGetMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ClassNamingConventions</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LongVariable</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodNamingConventions</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodWithSameNameAsEnclosingClass</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MisleadingVariableName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>NoPackage</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>PackageCase</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ShortMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ShortVariable</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousConstantFieldName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousEqualsMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SuspiciousHashcodeMethodName</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>VariableNamingConventions</name>
+            <ruleset>Naming Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AddEmptyString</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidArrayLoops</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidInstantiatingObjectsInLoops</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LocalVariableCouldBeFinal</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>MethodArgumentCouldBeFinal</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SimplifyStartsWith</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryWrapperObjectCreation</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseArrayListInsteadOfVector</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseArraysAsList</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseStringBufferForStringAppends</name>
+            <ruleset>Optimization Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ArrayIsStoredDirectly</name>
+            <ruleset>Security Code Guidelines</ruleset>
+        </rule>
+        <rule>
+            <name>MethodReturnsInternalArray</name>
+            <ruleset>Security Code Guidelines</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCatchingNPE</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidCatchingThrowable</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidRethrowingException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingNewInstanceOfSameException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingNullPointerException</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidThrowingRawExceptionTypes</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotExtendJavaLangError</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>DoNotThrowExceptionInFinally</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ExceptionAsFlowControl</name>
+            <ruleset>Strict Exception Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AppendCharacterWithChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidDuplicateLiterals</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>AvoidStringBufferField</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>ConsecutiveLiteralAppends</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InefficientEmptyStringCheck</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InefficientStringBuffering</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>InsufficientStringBufferDeclaration</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringBufferInstantiationWithChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringInstantiation</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>StringToString</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnnecessaryCaseChange</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseEqualsToCompareStrings</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseIndexOfChar</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UselessStringValueOf</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UseStringBufferLength</name>
+            <ruleset>String and StringBuffer Rules</ruleset>
+        </rule>
+        <rule>
+            <name>CloneMethodMustImplementCloneable</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>LooseCoupling</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>SignatureDeclareThrowsException</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedImports</name>
+            <ruleset>Type Resolution Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedFormalParameter</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedLocalVariable</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedPrivateField</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+        <rule>
+            <name>UnusedPrivateMethod</name>
+            <ruleset>Unused Code Rules</ruleset>
+        </rule>
+    </rules>
+    <includeDerivedFiles>false</includeDerivedFiles>
+    <violationsAsErrors>true</violationsAsErrors>
+</pmd>
diff --git a/org.apache.easyant4e/.project b/org.apache.easyant4e/.project
new file mode 100644
index 0000000..2cc8f8f
--- /dev/null
+++ b/org.apache.easyant4e/.project
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.apache.easyant4e</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.ManifestBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.eclipse.pde.SchemaBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>com.atlassw.tools.eclipse.checkstyle.CheckstyleBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>edu.umd.cs.findbugs.plugin.eclipse.findbugsBuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.eclipse.pde.PluginNature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+		<nature>com.atlassw.tools.eclipse.checkstyle.CheckstyleNature</nature>
+		<nature>edu.umd.cs.findbugs.plugin.eclipse.findbugsNature</nature>
+	</natures>
+</projectDescription>
diff --git a/org.apache.easyant4e/.settings/org.eclipse.jdt.core.prefs b/org.apache.easyant4e/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..85e2ac9
--- /dev/null
+++ b/org.apache.easyant4e/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,7 @@
+#Fri Apr 10 17:04:56 GMT+01:00 2009
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
diff --git a/org.apache.easyant4e/META-INF/MANIFEST.MF b/org.apache.easyant4e/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..dd53b36
--- /dev/null
+++ b/org.apache.easyant4e/META-INF/MANIFEST.MF
@@ -0,0 +1,40 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: %pluginName
+Bundle-SymbolicName: org.apache.easyant4e;singleton:=true
+Bundle-Version: 1.0.0.qualifier
+Bundle-ClassPath: .,
+ lib/guice/aopalliance.jar,
+ lib/guice/guice-2.0.jar
+Bundle-Vendor: %providerName
+Bundle-Localization: plugin
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Require-Bundle: 
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources,
+ org.eclipse.jdt.core,
+ org.eclipse.ui,
+ org.eclipse.jdt.ui,
+ org.eclipse.ui.forms,
+ org.eclipse.ui.console,
+ org.eclipse.ui.ide,
+ org.eclipse.jface.text,
+ org.eclipse.jdt.launching,
+ org.apache.easyant,
+ org.apache.ivyde.eclipse
+Bundle-Activator: org.apache.easyant4e.Activator
+Bundle-ActivationPolicy: lazy
+Export-Package: com.google.inject,
+ org.apache.easyant4e,
+ org.apache.easyant4e.ant.editor,
+ org.apache.easyant4e.builders,
+ org.apache.easyant4e.configurers,
+ org.apache.easyant4e.console,
+ org.apache.easyant4e.ivyde.extension,
+ org.apache.easyant4e.ivyde.extension.model,
+ org.apache.easyant4e.ivyde.extension.page,
+ org.apache.easyant4e.modules,
+ org.apache.easyant4e.natures,
+ org.apache.easyant4e.providers,
+ org.apache.easyant4e.services,
+ org.apache.easyant4e.wizards
diff --git a/org.apache.easyant4e/TODO.txt b/org.apache.easyant4e/TODO.txt
new file mode 100644
index 0000000..0d75e07
--- /dev/null
+++ b/org.apache.easyant4e/TODO.txt
@@ -0,0 +1,14 @@
+* support different kind of project (java, scala)
+* update ivyDE setting when project.ivysettings.file change, when a user edit the module.ivy file
+* use checksum or version number to reinstall the local repository
+ou juste checker par rapport au qualifier
+* add internal package
+* Add Preference to manager EasyAnt core preferences (i.e: ivysettings configuration)
+* Add cool icons everywhere
+* create a new project from EasyAnt skeleton
+* Add I18N
+* Add launch config to run EaysAnt build
+===============================================================
+* bug en mode buildé : affichage en vert dans la console du message "BUILD FAILED"
+* lorsque l'on crée les source folder, tester l'existance des répertoires : ouvrir une popup pour demander à l'utilisateur ... checker cela notamment pour le multimodule
+
diff --git a/org.apache.easyant4e/build.properties b/org.apache.easyant4e/build.properties
new file mode 100644
index 0000000..7151f70
--- /dev/null
+++ b/org.apache.easyant4e/build.properties
@@ -0,0 +1,16 @@
+
+# <copyright>
+# </copyright>
+#
+# $Id$
+
+bin.includes = .,\
+               META-INF/,\
+               plugin.xml,\
+               plugin.properties,\
+               icons/,\
+               lib/guice/aopalliance.jar,\
+               lib/guice/guice-2.0.jar
+jars.compile.order = .
+source.. = src/
+output.. = bin/
diff --git a/org.apache.easyant4e/icons/EasyAnt-logo.gif b/org.apache.easyant4e/icons/EasyAnt-logo.gif
new file mode 100644
index 0000000..ea18794
--- /dev/null
+++ b/org.apache.easyant4e/icons/EasyAnt-logo.gif
Binary files differ
diff --git a/org.apache.easyant4e/icons/EasyAntNature.gif b/org.apache.easyant4e/icons/EasyAntNature.gif
new file mode 100755
index 0000000..6df3469
--- /dev/null
+++ b/org.apache.easyant4e/icons/EasyAntNature.gif
Binary files differ
diff --git a/org.apache.easyant4e/icons/build.gif b/org.apache.easyant4e/icons/build.gif
new file mode 100644
index 0000000..762fff4
--- /dev/null
+++ b/org.apache.easyant4e/icons/build.gif
Binary files differ
diff --git a/org.apache.easyant4e/icons/console.gif b/org.apache.easyant4e/icons/console.gif
new file mode 100644
index 0000000..a598f60
--- /dev/null
+++ b/org.apache.easyant4e/icons/console.gif
Binary files differ
diff --git a/org.apache.easyant4e/icons/console.png b/org.apache.easyant4e/icons/console.png
new file mode 100644
index 0000000..e767bc6
--- /dev/null
+++ b/org.apache.easyant4e/icons/console.png
Binary files differ
diff --git a/org.apache.easyant4e/icons/debug_loglevel.gif b/org.apache.easyant4e/icons/debug_loglevel.gif
new file mode 100644
index 0000000..ac5431f
--- /dev/null
+++ b/org.apache.easyant4e/icons/debug_loglevel.gif
Binary files differ
diff --git a/org.apache.easyant4e/icons/default_incremental.gif b/org.apache.easyant4e/icons/default_incremental.gif
new file mode 100644
index 0000000..fbcf2f8
--- /dev/null
+++ b/org.apache.easyant4e/icons/default_incremental.gif
Binary files differ
diff --git a/org.apache.easyant4e/icons/form_banner.gif b/org.apache.easyant4e/icons/form_banner.gif
new file mode 100644
index 0000000..aebc0b2
--- /dev/null
+++ b/org.apache.easyant4e/icons/form_banner.gif
Binary files differ
diff --git a/org.apache.easyant4e/icons/full/obj16/ant_buildfile.gif b/org.apache.easyant4e/icons/full/obj16/ant_buildfile.gif
new file mode 100755
index 0000000..6df3469
--- /dev/null
+++ b/org.apache.easyant4e/icons/full/obj16/ant_buildfile.gif
Binary files differ
diff --git a/org.apache.easyant4e/icons/phase.gif b/org.apache.easyant4e/icons/phase.gif
new file mode 100644
index 0000000..84f4af5
--- /dev/null
+++ b/org.apache.easyant4e/icons/phase.gif
Binary files differ
diff --git a/org.apache.easyant4e/icons/sa_onesample48.gif b/org.apache.easyant4e/icons/sa_onesample48.gif
new file mode 100644
index 0000000..e65c123
--- /dev/null
+++ b/org.apache.easyant4e/icons/sa_onesample48.gif
Binary files differ
diff --git a/org.apache.easyant4e/icons/target.gif b/org.apache.easyant4e/icons/target.gif
new file mode 100644
index 0000000..146a903
--- /dev/null
+++ b/org.apache.easyant4e/icons/target.gif
Binary files differ
diff --git a/org.apache.easyant4e/lib/guice/aopalliance.jar b/org.apache.easyant4e/lib/guice/aopalliance.jar
new file mode 100644
index 0000000..578b1a0
--- /dev/null
+++ b/org.apache.easyant4e/lib/guice/aopalliance.jar
Binary files differ
diff --git a/org.apache.easyant4e/lib/guice/guice-2.0.jar b/org.apache.easyant4e/lib/guice/guice-2.0.jar
new file mode 100644
index 0000000..204c4c2
--- /dev/null
+++ b/org.apache.easyant4e/lib/guice/guice-2.0.jar
Binary files differ
diff --git a/org.apache.easyant4e/plugin.properties b/org.apache.easyant4e/plugin.properties
new file mode 100644
index 0000000..71bcc6a
--- /dev/null
+++ b/org.apache.easyant4e/plugin.properties
@@ -0,0 +1,8 @@
+
+# <copyright>
+# </copyright>
+#
+# $Id$
+
+pluginName = Easyant for Eclipse
+providerName = www.easyant.org
diff --git a/org.apache.easyant4e/plugin.xml b/org.apache.easyant4e/plugin.xml
new file mode 100644
index 0000000..3325c66
--- /dev/null
+++ b/org.apache.easyant4e/plugin.xml
@@ -0,0 +1,176 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.0"?>
+
+<!--
+ <copyright>
+ </copyright>
+
+ $Id$
+-->
+
+<plugin>
+	<extension 
+		point="org.eclipse.core.resources.natures" id="EasyAntNature" name="EasyAntNature">
+		<runtime>
+        	<run class="org.apache.easyant4e.natures.EasyAntNature" /> 
+      	</runtime>
+   	</extension>
+   
+   <extension point="org.eclipse.core.resources.builders" id="EasyAntBuilder" name="EasyAntBuilder">
+      <builder>
+         <run class="org.apache.easyant4e.builders.EasyAntBuilder" /> 
+      </builder>
+   </extension>
+   
+   <extension point="org.eclipse.ui.ide.projectNatureImages">
+      <image 
+         id="org.apache.easyant4e.natures.EasyAntNatureImage"
+         natureId="org.apache.easyant4e.EasyAntNature"
+         icon="icons/EasyAntNature.gif">
+      </image>
+   </extension>
+
+   <extension point="org.eclipse.ui.popupMenus">
+      <objectContribution
+            adaptable="true"
+            objectClass="org.eclipse.core.resources.IProject"
+            nameFilter="*"
+            id="org.apache.easyant4e.ui.popupMenus.contribution.IProject">
+         <menu id="org.apache.easyant4e.ui.menu" label="EasyAnt" path="additionsEasyAnt">
+               <groupMarker name="nature"/> 
+         </menu>    
+         <action
+               class="org.apache.easyant4e.natures.AddEasyAntNatureAction"
+               enablesFor="1"
+               id="org.apache.easyant4e.natures.AddEasyAntNatureAction"
+               icon = "icons/EasyAntNature.gif"
+               label="Convert Project to EasyAnt Project..."
+               menubarPath="org.apache.easyant4e.ui.menu/nature">
+         </action>
+         <action
+               class="org.apache.easyant4e.natures.RemoveEasyAntNatureAction"
+               enablesFor="1"
+               id="org.apache.easyant4e.natures.RemoveEasyAntNatureAction"
+               icon = "icons/EasyAntNature.gif"
+               label="Remove EasyAnt Nature..."
+               menubarPath="org.apache.easyant4e.ui.menu/nature">
+         </action>
+      </objectContribution>
+   </extension>
+
+   <extension
+         point="org.eclipse.ui.importWizards">
+      <wizard
+            class="org.apache.easyant4e.wizards.EasyAntImportWizard"
+            id="org.apache.easyant4e.wizards.EasyAntImportWizard"
+            category="org.apache.easyant4e.wizards.category"
+            name="Existing EasyAnt Project"
+            icon="icons/EasyAntNature.gif">
+            <description>Import an existing EasyAnt Project</description>
+      </wizard>
+      <category
+            id="org.apache.easyant4e.wizards.category"
+            name="EasyAnt">
+      </category>
+   </extension>
+
+   <extension
+         point="org.apache.ivyde.eclipse.moduleDescriptorExtension">
+      <moduleDescriptor
+            modelContributorClass="org.apache.easyant4e.ivyde.extension.model.EasyAntModuleDescriptorExtension"></moduleDescriptor>
+   </extension>
+   <extension
+         point="org.apache.ivyde.eclipse.editorPage">
+      <editorPage
+            pageClass="org.apache.easyant4e.ivyde.extension.page.BuildPage">
+      </editorPage>
+   </extension>
+
+   <extension point="org.eclipse.ui.console.consoleFactories">
+	  <consoleFactory 
+	     label="EasyAnt Console"
+	     class="org.apache.easyant4e.console.EasyAntConsoleFactory"
+	     icon="icons/full/obj16/ant_buildfile.gif">
+	  </consoleFactory>
+	</extension>
+
+	<extension
+          point="org.eclipse.ui.startup">
+       <startup
+             class="org.apache.easyant4e.Startup"></startup>
+    </extension>
+    <!--
+    <extension
+          point="org.eclipse.ant.core.antTasks">
+       <antTask
+             class="org.apache.easyant.tasks.CoreRevisionCheckerTask"
+             library="lib/easyant-core.jar"
+             name="org.apache.easyant.tasks.CoreRevisionCheckerTask">
+       </antTask>
+       <antTask
+             class="org.apache.easyant.tasks.Import"
+             library="lib/easyant-core.jar"
+             name="org.apache.easyant.tasks.Import">
+       </antTask>
+       <antTask
+             class="org.apache.easyant.tasks.LoadModule"
+             library="lib/easyant-core.jar"
+             name="org.apache.easyant.tasks.LoadModule">
+       </antTask>
+       <antTask
+             class="org.apache.easyant.tasks.ParameterTask"
+             library="lib/easyant-core.jar"
+             name="org.apache.easyant.tasks.ParameterTask">
+       </antTask>
+       <antTask
+             class="org.apache.easyant.tasks.PathTask"
+             library="lib/easyant-core.jar"
+             name="org.apache.easyant.tasks.PathTask">
+       </antTask>
+       <antTask
+             class="org.apache.easyant.tasks.PropertyTask"
+             library="lib/easyant-core.jar"
+             name="org.apache.easyant.tasks.PropertyTask">
+       </antTask>
+       <antTask
+             class="org.apache.easyant.tasks.RepositoryReport"
+             library="lib/easyant-core.jar"
+             name="org.apache.easyant.tasks.RepositoryReport">
+       </antTask>
+       <antTask
+             class="org.apache.easyant.tasks.SubModule"
+             library="lib/easyant-core.jar"
+             name="org.apache.easyant.tasks.SubModule">
+       </antTask>
+    </extension>
+    -->
+<!--
+ 	<extension
+       point="org.eclipse.ui.console.consolePageParticipants">
+    <consolePageParticipant
+          class="org.apache.easyant4e.console.EasyAntConsolePageParticipant"
+          id="org.apache.easyant4e.console.EasyAntConsolePageParticipant">
+       <enablement>
+          <instanceof
+                value="org.apache.easyant4e.console.EasyAntConsole">
+          </instanceof></enablement>
+    </consolePageParticipant>
+ </extension>
+-->
+
+   <!--
+    <extension
+         point="org.eclipse.ui.editors">
+      <editor
+            class="org.apache.easyant4e.ant.editor.AntEditor"
+            extensions="ant"
+            icon="icons/full/obj16/ant_buildfile.gif"
+            id="org.eclipse.ant.ui.internal.editor.AntEditor"
+            name="EasyAnt Editor">
+            <contentTypeBinding
+               contentTypeId="org.eclipse.ant.core.antBuildFile"/> 
+      </editor>
+   </extension>
+   -->
+
+</plugin>
diff --git a/org.apache.easyant4e/src/ivysettings-remote.xml b/org.apache.easyant4e/src/ivysettings-remote.xml
new file mode 100644
index 0000000..6e0a1d1
--- /dev/null
+++ b/org.apache.easyant4e/src/ivysettings-remote.xml
@@ -0,0 +1,45 @@
+<!--
+   Copyright 2008-2009 the EasyAnt project
+
+	See the NOTICE file distributed with this work for additional information 
+	regarding copyright ownership.
+	
+	Licensed under the Apache License, Version 2.0 (the "License");
+	you may not use this file except in compliance with the License.
+	You may obtain a copy of the License at
+	
+	http://www.apache.org/licenses/LICENSE-2.0
+	
+	Unless required by applicable law or agreed to in writing, software
+	distributed under the License is distributed on an "AS IS" BASIS,
+	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+	See the License for the specific language governing permissions and
+	limitations under the License.
+-->
+<ivysettings>
+	<settings defaultResolver="main"/>	
+	<property name="easyant.repo.url" value="http://repository.easyant.org"/>
+	<!-- Directory use by ivy retreive in order to store modules (plugins and build types) -->
+	<property name="easyant.modules.dir" value="${user.home}/.easyant/modules"/>	
+	<resolvers>
+		<filesystem name="local">
+			<ivy pattern="${easyant.modules.dir}/[organisation]/[module]/[revision]/[module].ivy" />			
+			<artifact pattern="${easyant.modules.dir}/[organisation]/[module]/[revision]/[artifact](-[classifier]).[ext]"/>
+		</filesystem>
+		<!-- EasyAnt modules -->
+		<url name="easyant-modules">
+			<ivy pattern="${easyant.repo.url}/modules/[organisation]/[module]/[revision]/[module].ivy" />			
+			<artifact pattern="${easyant.repo.url}/modules/[organisation]/[module]/[revision]/[artifact](-[classifier]).[ext]"/>			
+		</url>
+		<!-- External required libraries -->
+		<url name="easyant-shared">
+			<ivy pattern="${easyant.repo.url}/shared/[organisation]/[module]/[revision]/[module].ivy" />
+			<artifact pattern="${easyant.repo.url}/shared/[organisation]/[module]/[revision]/[artifact](-[classifier]).[ext]"/>		
+		</url>
+		<chain name="main" returnFirst="true">
+			<resolver ref="local"/>
+			<resolver ref="easyant-modules" />
+			<resolver ref="easyant-shared" />
+		</chain>		
+	</resolvers>	
+</ivysettings>
diff --git a/org.apache.easyant4e/src/ivysettings.xml b/org.apache.easyant4e/src/ivysettings.xml
new file mode 100644
index 0000000..72c53fe
--- /dev/null
+++ b/org.apache.easyant4e/src/ivysettings.xml
@@ -0,0 +1,40 @@
+<!--
+   Copyright 2008-2009 the EasyAnt project
+
+	See the NOTICE file distributed with this work for additional information 
+	regarding copyright ownership.
+	
+	Licensed under the Apache License, Version 2.0 (the "License");
+	you may not use this file except in compliance with the License.
+	You may obtain a copy of the License at
+	
+	http://www.apache.org/licenses/LICENSE-2.0
+	
+	Unless required by applicable law or agreed to in writing, software
+	distributed under the License is distributed on an "AS IS" BASIS,
+	WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+	See the License for the specific language governing permissions and
+	limitations under the License.
+-->
+<ivysettings>
+	<settings defaultResolver="main"/>
+	<caches useOrigin="true" defaultCacheDir="${user.home}/.easyant/easyant-cache" />
+	<!-- Directory use by ivy retreive in order to store modules (plugins and build types) -->
+	<property name="easyant.repo.dir" value="${user.home}/.easyant/easyant-repository"/>
+	<resolvers>
+		<!-- EasyAnt modules -->
+		<filesystem name="easyant-modules">
+			<ivy pattern="${easyant.repo.dir}/modules/[organisation]/[module]/[revision]/[module].ivy"/>
+			<artifact pattern="${easyant.repo.dir}/modules/[organisation]/[module]/[revision]/[artifact](-[classifier]).[ext]"/>
+		</filesystem>
+		<!-- External required libraries -->
+		<filesystem name="easyant-shared">
+			<ivy pattern="${easyant.repo.dir}/shared/[organisation]/[module]/[revision]/[module].ivy"/>
+			<artifact pattern="${easyant.repo.dir}/shared/[organisation]/[module]/[revision]/[artifact](-[classifier]).[ext]"/>
+		</filesystem>
+		<chain name="main" returnFirst="true">
+			<resolver ref="easyant-modules"/>
+			<resolver ref="easyant-shared"/>
+		</chain>
+	</resolvers>
+</ivysettings>
\ No newline at end of file
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/Activator.java b/org.apache.easyant4e/src/org/apache/easyant4e/Activator.java
new file mode 100644
index 0000000..0184807
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/Activator.java
@@ -0,0 +1,121 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e;
+
+import org.apache.easyant4e.modules.EasyAnt4EclipseModule;
+import org.apache.easyant4e.modules.EasyAntCoreModule;
+import org.apache.easyant4e.services.EasyantCoreService;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+import com.google.inject.Inject;
+
+
+/**
+ * This class manage plugin life cycle
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class Activator extends AbstractUIPlugin {
+
+	private EasyAntPlugin easyAntPlugin;
+	private EasyAntCoreModule easyAntCoreModule;
+	private EasyAnt4EclipseModule easyAnt4EclipseModule;
+
+	private EasyantCoreService easyantCoreService;
+	
+	@Inject
+	public void setEasyantCoreService(EasyantCoreService easyantCoreService) {
+		this.easyantCoreService = easyantCoreService;
+	}
+
+	public static final String PLUGIN_ID = "org.apache.easyant4e";
+
+	// The shared instance.
+	private static Activator plugin;
+	
+
+	/**
+	 * Create an activator and a EasyAntModule
+	 * 
+	 */
+	public Activator() {
+		super();
+		if (plugin == null) {
+			plugin = this;
+			this.easyAntCoreModule = new EasyAntCoreModule();
+			this.easyAnt4EclipseModule = new EasyAnt4EclipseModule();
+		}
+	}
+
+	@Override
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		initializeEasyAntPlugin();		
+		easyantCoreService.installPluginsRepository();
+		Activator.getDefault().getLog().log(
+				new Status(IStatus.INFO, Activator.PLUGIN_ID, 0, "EasyAnt For Eclipse started", null));
+	}
+
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		Activator.getDefault().getLog().log(
+				new Status(IStatus.INFO, Activator.PLUGIN_ID, 0, "EasyAnt For Eclipse shutdown", null));
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance.
+	 * 
+	 * @return the plugin instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+	/**
+	 * Returns the EasyAnt Plugin instance.
+	 * 
+	 * @return the EasyAnt plugin instance
+	 */
+	public static EasyAntPlugin getEasyAntPlugin() {
+		return getDefault().getEasyAntPluginInstance();
+	}
+
+	/**
+	 * Returns the EasyAntPlugin instance.
+	 */
+	private EasyAntPlugin getEasyAntPluginInstance() {
+		if (easyAntPlugin == null) {
+			initializeEasyAntPlugin();
+		}
+		return easyAntPlugin;
+	}
+
+	private void initializeEasyAntPlugin() {
+		if (easyAntPlugin == null) {
+			easyAntPlugin = new EasyAntPlugin(easyAntCoreModule, easyAnt4EclipseModule);
+			easyAntPlugin.injectMembers(this);
+		}
+	}
+		
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/EasyAntConstants.java b/org.apache.easyant4e/src/org/apache/easyant4e/EasyAntConstants.java
new file mode 100644
index 0000000..9fa9598
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/EasyAntConstants.java
@@ -0,0 +1,60 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public interface EasyAntConstants {
+
+	
+	public static final String IVY_MODULE_TAG = "ivy-module";
+	public static final String IVY_INFO_TAG = "info";
+	//public static final String IVY_DESCRIPTION_TAG = "description";
+
+	public static final String EASYANT_TAG = "ea:build";
+	public static final String EASYANT_TYPE_ATTR = "type";
+
+	public static final String EASYANT_PROPERTY_TAG = "ea:property";
+	public static final String EASYANT_PROPERTY_NAME_ATTR = "name";
+	public static final String EASYANT_PROPERTY_VALUE_ATTR = "value";
+	public static final String EASYANT_PROPERTY_FILE_ATTR = "file";
+
+	public static final String EASYANT_PLUGIN_TAG = "ea:plugin";
+	public static final String EASYANT_PLUGIN_MODULE_ATTR = "module";
+	public static final String EASYANT_PLUGIN_AS_ATTR = "as";
+	public static final String EASYANT_PLUGIN_MODE_ATTR = "mode";
+	public static final String EASYANT_PLUGIN_MODE_INCLUDE = "include";
+	public static final String EASYANT_PLUGIN_MODE_IMPORT = "import";
+	public static final String EASYANT_PLUGIN_MANDATORY_ATTR = "mandatory";
+
+	public static final String EASYANT_BUILD_TYPES_ORG = "org.apache.easyant.buildtypes";
+	public static final String EASYANT_BUILD_PLUGINS_ORG = "org.apache.easyant.plugins";
+
+	public static final String PLUGINS_SETTINGS = "ivysettings.xml";
+	
+	//Ant log level
+	public static final int ANT_LOGLEVEL_ERR = 0;
+    public static final int ANT_LOGLEVEL_WARN = 1;
+    public static final int ANT_LOGLEVEL_INFO = 2;
+    public static final int ANT_LOGLEVEL_VERBOSE = 3;
+    public static final int ANT_LOGLEVEL_DEBUG = 4;
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/EasyAntPlugin.java b/org.apache.easyant4e/src/org/apache/easyant4e/EasyAntPlugin.java
new file mode 100644
index 0000000..6b230b7
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/EasyAntPlugin.java
@@ -0,0 +1,158 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e;
+
+import org.apache.easyant4e.services.EasyantProjectService;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jdt.internal.ui.packageview.ClassPathContainer;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.ui.PlatformUI;
+
+import com.google.inject.Guice;
+import com.google.inject.Injector;
+import com.google.inject.Module;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyAntPlugin {
+
+	private final Injector injector;
+
+	public EasyAntPlugin(Module... modules) {
+		injector = Guice.createInjector(modules);
+		injectMembers(this);
+	}
+
+	public void injectMembers(Object instance) {
+		injector.injectMembers(instance);
+	}
+
+	/**
+	 * Return the {@link EasyantCoreService}.
+	 */
+	/*public EasyantCoreService getEasyantCoreService() {
+		return getInstance(EasyantCoreService.class);
+	}*/
+
+	/**
+	 * Return the {@link EasyantProjectService}.
+	 */
+	/*
+	public EasyantProjectService getEasyantProjectService() {
+		return getInstance(EasyantProjectService.class);
+	}*/
+
+	public IProject getCurrentProject() {
+		try {
+			return getSelectedProject();
+		} catch (CoreException e) {
+			log(e);
+		}
+		return null;
+	}
+
+	// private IJavaProject getJavaProject() throws CoreException {
+	// IProject project = getSelectedProject();
+	// IJavaProject javaProject=null;
+	// if(project.hasNature(JavaCore.NATURE_ID)){
+	// javaProject = (IJavaProject)project.getNature(JavaCore.NATURE_ID);
+	// }
+	// return javaProject;
+	//}
+
+	private IProject getSelectedProject() throws CoreException {
+		IProject project = null;
+		Object selectedResource = getSelectedResource();
+		if (selectedResource instanceof IResource) {
+			IResource resource = (IResource) selectedResource;
+			project = resource.getProject();
+		} else if (selectedResource instanceof ClassPathContainer) {
+			// FIXME maybe use Adaptable and WorkbenchAdapter to resolve project
+			// container
+			project = ((ClassPathContainer) selectedResource).getJavaProject().getProject();
+		}
+		return project;
+	}
+
+	private Object getSelectedResource() {
+		IStructuredSelection selection = getStructuredSelection();
+		if (selection != null) {
+			Object element = selection.getFirstElement();
+			return element;
+		}
+		return null;
+	}
+
+	private IStructuredSelection getStructuredSelection() {
+		ISelection selection = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getSelectionService()
+				.getSelection();
+		if (selection instanceof IStructuredSelection) {
+			IStructuredSelection ss = (IStructuredSelection) selection;
+			return ss;
+		}
+		return null;
+	}
+
+	public void log(int severity, String message) {
+		log(severity, message, null);
+	}
+
+	public void log(int severity, String message, Throwable e) {
+		log(new Status(severity, Activator.PLUGIN_ID, 0, message, e));
+	}
+
+	public void log(CoreException e) {
+		log(e.getStatus().getSeverity(), "EasyAnt For Eclipse - Internal Error", e);
+	}
+
+	public void log(IStatus status) {
+		Activator.getDefault().getLog().log(status);
+	}
+
+	/**
+	 * Return the workspace used by the workbench
+	 * 
+	 * This method is internal to the workbench and must not be called by any
+	 * plugins.
+	 */
+	public IWorkspace getPluginWorkspace() {
+		return ResourcesPlugin.getWorkspace();
+	}
+
+	/**
+	 * Get instances from the injector.
+	 * 
+	 * @param type
+	 *            the type to get an instance of
+	 * @return the instance
+	 */
+	public <T> T getInstance(Class<T> type) {
+		return injector.getInstance(type);
+	}
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/Startup.java b/org.apache.easyant4e/src/org/apache/easyant4e/Startup.java
new file mode 100644
index 0000000..a2d4332
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/Startup.java
@@ -0,0 +1,64 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e;
+
+import org.eclipse.core.internal.registry.ExtensionRegistry;
+import org.eclipse.core.runtime.IExtension;
+import org.eclipse.core.runtime.IExtensionRegistry;
+import org.eclipse.core.runtime.RegistryFactory;
+import org.eclipse.ui.IStartup;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+// http://wiki.eclipse.org/FAQ_How_do_I_make_my_plug-in_dynamic_aware%3F
+// http://wiki.eclipse.org/FAQ_How_do_I_make_my_plug-in_dynamic_enabled%3F
+public class Startup implements IStartup {
+
+	public void earlyStartup() {
+		//TODO add aspect to kill 
+		//ExtensionRegistry -> private boolean checkReadWriteAccess(Object key, boolean persist) {
+		
+//		System.out.println("--- clean IvyDE extension");
+//		IExtensionRegistry reg = RegistryFactory.getRegistry();
+//		IExtension[] extensions = reg.getExtensions("org.apache.ivyde.eclipse");		
+//		for (IExtension extension : extensions) {
+//			if ("org.eclipse.ui.popupMenus".equals(extension.getExtensionPointUniqueIdentifier())) {
+//				System.out.println("--> remove "+extension);
+//				try{
+//					reg.removeExtension(extension, getUserToken());
+//				}catch(Exception e){
+//					e.printStackTrace();
+//				}
+//				System.out.println("--> extension removed!");
+//				break;
+//			}
+//		}
+	}
+
+	/*
+	private Object getUserToken() {
+		IExtensionRegistry registry = RegistryFactory.getRegistry();
+		//return null; // require -Declipse.registry.nulltoken=true
+		return ((ExtensionRegistry) registry).getTemporaryUserToken();
+	}
+*/
+	
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/ant/editor/EasyAntEditor.java b/org.apache.easyant4e/src/org/apache/easyant4e/ant/editor/EasyAntEditor.java
new file mode 100644
index 0000000..4736741
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/ant/editor/EasyAntEditor.java
@@ -0,0 +1,27 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.ant.editor;
+
+/**
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+//@SuppressWarnings("restriction")
+public class EasyAntEditor /*extends org.eclipse.ant.internal.ui.editor.AntEditor*/ {
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/builders/EasyAntBuilder.java b/org.apache.easyant4e/src/org/apache/easyant4e/builders/EasyAntBuilder.java
new file mode 100644
index 0000000..2939523
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/builders/EasyAntBuilder.java
@@ -0,0 +1,103 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.builders;
+
+import java.util.Map;
+
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.EasyAntConstants;
+import org.apache.easyant4e.services.EasyantProjectService;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IWorkspaceRunnable;
+import org.eclipse.core.resources.IncrementalProjectBuilder;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+
+import com.google.inject.Inject;
+
+//import com.google.inject.Inject;
+
+/**
+ * The EastAnt builder.
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyAntBuilder extends IncrementalProjectBuilder {
+
+	private IProgressMonitor monitor;
+
+	private EasyantProjectService easyantProjectService;
+		
+	public EasyAntBuilder(){
+		Activator.getEasyAntPlugin().injectMembers(this);
+	}
+	
+	@Inject
+	public void setEasyantProjectService(EasyantProjectService easyantProjectService) {
+		this.easyantProjectService = easyantProjectService;
+	}
+	
+	@SuppressWarnings("unchecked")
+	@Override
+	protected IProject[] build(final int kind, final Map args, final IProgressMonitor monitor) throws CoreException {
+		this.monitor = monitor;
+		if (!getProject().exists()) {
+			return new IProject[] {};
+		} else {
+			try {
+				if (FULL_BUILD == kind) {
+					doBuild();
+				} else { // FIXME maybe check INCREMENTAL_BUILD or AUTO_BUILD
+					IResourceDelta delta = getDelta(getProject());
+					if (delta == null) {
+						doBuild();
+					} else {
+						doBuild(delta);
+					}
+				}
+			} catch (OperationCanceledException e) {
+				Activator.getEasyAntPlugin().log(IStatus.CANCEL, "EasyAnt build canceled", e);
+			}
+			return null;
+		}
+	}
+
+	protected void doBuild() throws CoreException {
+		IWorkspaceRunnable buildOperation = createBuildOperation(); 
+		buildOperation.run(monitor);
+	}
+
+	protected void doBuild(IResourceDelta delta) throws CoreException {
+		doBuild();
+	}
+	
+	private IWorkspaceRunnable createBuildOperation(){
+		// TODO maybe use WorkspaceModifyOperation
+		return new IWorkspaceRunnable(){			
+			public void run(IProgressMonitor monitor) throws CoreException {
+				// TODO call good target
+				easyantProjectService.runBuild(getProject(), "compile", EasyAntConstants.ANT_LOGLEVEL_WARN, monitor);
+			}			
+		};
+	}
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/configurers/Configurer.java b/org.apache.easyant4e/src/org/apache/easyant4e/configurers/Configurer.java
new file mode 100644
index 0000000..4de5dfd
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/configurers/Configurer.java
@@ -0,0 +1,30 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.configurers;
+
+/**
+ * This interface must be implement to configure use in order to configure a basic eclipse project.
+ * 
+ * In example : you muste add JavaNature, ScalaNature, GroovyNature or others
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public interface Configurer {
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/console/EasyAntConsole.java b/org.apache.easyant4e/src/org/apache/easyant4e/console/EasyAntConsole.java
new file mode 100644
index 0000000..6be8be4
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/console/EasyAntConsole.java
@@ -0,0 +1,43 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.console;
+
+import org.eclipse.ui.console.IConsole;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public interface EasyAntConsole extends IConsole{
+
+	void show();
+	void close();
+	boolean isOpen();
+	
+	void info(String msg);
+	void error(String msg);
+	
+	 /**
+     * Show the console.
+     * 
+     * @param showNoMatterWhat
+     *            ignore preferences if <code>true</code>
+     */
+    void show(boolean showNoMatterWhat);
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/console/EasyAntConsoleFactory.java b/org.apache.easyant4e/src/org/apache/easyant4e/console/EasyAntConsoleFactory.java
new file mode 100644
index 0000000..fac34b9
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/console/EasyAntConsoleFactory.java
@@ -0,0 +1,48 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.console;
+
+import org.apache.easyant4e.Activator;
+import org.eclipse.ui.console.IConsoleFactory;
+
+import com.google.inject.Inject;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyAntConsoleFactory implements IConsoleFactory {
+	
+	private EasyAntConsole console;
+	
+	public EasyAntConsoleFactory(){
+		Activator.getEasyAntPlugin().injectMembers(this);
+	}
+	
+	@Inject
+	public void setConsole(EasyAntConsole console) {
+		this.console = console;
+	}
+	
+	public void openConsole() {		
+		if (console != null) {
+			console.show();
+		}
+	}
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/console/EasyAntConsoleImpl.java b/org.apache.easyant4e/src/org/apache/easyant4e/console/EasyAntConsoleImpl.java
new file mode 100644
index 0000000..cf74ed7
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/console/EasyAntConsoleImpl.java
@@ -0,0 +1,102 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.console;
+
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.EasyAntPlugin;
+import org.apache.easyant4e.providers.ImageProvider;
+import org.apache.ivyde.eclipse.ui.console.IvyConsole;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.PartInitException;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.console.ConsolePlugin;
+import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.console.IConsoleManager;
+
+import com.google.inject.Inject;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyAntConsoleImpl extends IvyConsole implements EasyAntConsole {
+	
+	private boolean isOpen=false;
+	
+	public boolean isOpen() {
+		//TODO get the stat
+		return isOpen;
+	}
+
+	public void setOpen(boolean isOpen) {
+		this.isOpen = isOpen;
+	}
+	
+	@Inject
+	public EasyAntConsoleImpl(ImageProvider imageProvider) {		
+		super("EasyAnt", imageProvider.getConsoleImageDescriptor());		
+	}
+
+	public void show() {		
+		IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
+		IConsole[] existing = manager.getConsoles();
+		boolean exists = false;
+		for (int i = 0; i < existing.length; i++) {
+			if (this == existing[i]) {
+				exists = true;
+			}
+		}
+		if (!exists) {
+			manager.addConsoles(new IConsole[] { this });
+		}
+		manager.showConsoleView(this);
+		setOpen(true);
+		
+		//show the Error log view
+		showErrorLogView();
+		
+	}
+	
+	private void showErrorLogView(){
+	    if (PlatformUI.getWorkbench().getActiveWorkbenchWindow() != null) {
+            if (PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage() != null) {
+                    try {
+						PlatformUI.getWorkbench().getActiveWorkbenchWindow().getActivePage().showView("org.eclipse.pde.runtime.LogView", null, IWorkbenchPage.VIEW_ACTIVATE);
+					} catch (PartInitException e) {
+						Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot show the Error Log view.", e);
+					}
+            }
+	    }
+	}
+
+	@Override
+	public void error(String msg) {
+		showErrorLogView();
+		super.error(msg);
+	}
+
+	public void close() {
+		IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
+		manager.removeConsoles(new IConsole[] { this });
+		//ConsolePlugin.getDefault().getConsoleManager().addConsoleListener(new MyLifecycle());
+		setOpen(false);
+	}
+	
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/console/EasyAntConsolePageParticipant.java b/org.apache.easyant4e/src/org/apache/easyant4e/console/EasyAntConsolePageParticipant.java
new file mode 100644
index 0000000..d799870
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/console/EasyAntConsolePageParticipant.java
@@ -0,0 +1,55 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.console;
+
+import org.eclipse.ui.console.IConsole;
+import org.eclipse.ui.console.IConsolePageParticipant;
+import org.eclipse.ui.part.IPageBookViewPage;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyAntConsolePageParticipant implements IConsolePageParticipant {
+
+	//private CloseConsoleAction closeAction;
+
+	public void init(IPageBookViewPage page, IConsole console) {
+		// closeAction = new IvyConsoleRemoveAction(console);
+		// IToolBarManager manager =
+		// page.getSite().getActionBars().getToolBarManager();
+		// manager.appendToGroup(IConsoleConstants.LAUNCH_GROUP, closeAction);
+	}
+
+	public void dispose() {
+	//	closeAction = null;
+	}
+
+	@SuppressWarnings("unchecked")
+	public Object getAdapter(Class adapter) {
+		return null;
+	}
+
+	public void activated() {
+	}
+
+	public void deactivated() {
+	}
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/RepositoryInstaller.java b/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/RepositoryInstaller.java
new file mode 100644
index 0000000..2431834
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/RepositoryInstaller.java
@@ -0,0 +1,105 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.ivyde.extension;
+
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.net.URL;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipInputStream;
+
+import org.apache.easyant4e.Activator;
+import org.eclipse.core.runtime.IStatus;
+
+/**
+ * This class unpack the default EasyAnt repository in local file system.
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class RepositoryInstaller {
+	static final int BUFFER_SIZE = 102400;
+	static final String REPOSITORY_ARCHIVE_PATH = "repository.zip";
+	private URL interpreterZipUrl;
+
+	public void install(File installDir) {
+		this.interpreterZipUrl = Activator.getDefault().getBundle().getResource(REPOSITORY_ARCHIVE_PATH);
+		try {
+			unPackArchive(installDir);
+		} catch (IOException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot install EasyAnt repository", e);
+		}
+	}
+
+	private void unPackArchive(File installDir) throws IOException {
+		InputStream inputStream = this.interpreterZipUrl.openStream();
+		ZipInputStream zipFileStream = new ZipInputStream(inputStream);
+		ZipEntry zipEntry = zipFileStream.getNextEntry();
+		while (zipEntry != null) {
+			File destination = new File(installDir.getPath(), zipEntry.getName());
+			if (!zipEntry.isDirectory()) {
+				/*
+				 * Copy files (and make sure parent directory exist)
+				 */
+				File parentFile = destination.getParentFile();
+				boolean parentFileExist = isFileExists(parentFile);
+				if (!parentFileExist) {
+					parentFileExist = parentFile.mkdirs();
+				}
+				if (parentFileExist) {
+					OutputStream os = null;
+					try {
+						os = new FileOutputStream(destination);
+						byte[] buffer = new byte[BUFFER_SIZE];
+						while (true) {
+							int len = zipFileStream.read(buffer);
+							if (zipFileStream.available() == 0) {
+								break;
+							}
+							os.write(buffer, 0, len);
+						}
+					} finally {
+						if (null != os) {
+							os.close();
+						}
+					}
+				} else {
+					Activator.getEasyAntPlugin().log(IStatus.ERROR,
+							"Installing EasyAnt repository, but " + parentFile + " already exists!");
+				}
+			} else {
+				boolean created = destination.mkdirs();
+				if (!created) {
+					Activator.getEasyAntPlugin().log(IStatus.ERROR,
+							"Installing EasyAnt repository. Cannot create directory: " + destination);
+				}
+			}
+			zipFileStream.closeEntry();
+			zipEntry = zipFileStream.getNextEntry();
+		}
+		inputStream.close();
+		zipFileStream.close();
+	}
+
+	private boolean isFileExists(File file) {
+		return (null != file && file.exists());
+	}
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/model/EasyAntModuleDescriptorExtension.java b/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/model/EasyAntModuleDescriptorExtension.java
new file mode 100644
index 0000000..d102e08
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/model/EasyAntModuleDescriptorExtension.java
@@ -0,0 +1,330 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.ivyde.extension.model;
+
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_BUILD_PLUGINS_ORG;
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_BUILD_TYPES_ORG;
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_PLUGIN_AS_ATTR;
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_PLUGIN_MANDATORY_ATTR;
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_PLUGIN_MODE_ATTR;
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_PLUGIN_MODE_IMPORT;
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_PLUGIN_MODE_INCLUDE;
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_PLUGIN_MODULE_ATTR;
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_PLUGIN_TAG;
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_PROPERTY_FILE_ATTR;
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_PROPERTY_NAME_ATTR;
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_PROPERTY_TAG;
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_PROPERTY_VALUE_ATTR;
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_TAG;
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_TYPE_ATTR;
+import static org.apache.easyant4e.EasyAntConstants.IVY_INFO_TAG;
+import static org.apache.easyant4e.EasyAntConstants.IVY_MODULE_TAG;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.easyant.core.descriptor.PropertyDescriptor;
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.services.EasyantCoreService;
+import org.apache.ivyde.common.ivyfile.IvyModuleDescriptorModel;
+import org.apache.ivyde.common.model.IDocumentedValueProvider;
+import org.apache.ivyde.common.model.IvyFile;
+import org.apache.ivyde.common.model.IvyTag;
+import org.apache.ivyde.common.model.IvyTagAttribute;
+import org.apache.ivyde.eclipse.extension.ModuleDescriptorExtension;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+
+import com.google.inject.Inject;
+
+/**
+ * This class provide extension in order to add EasyAnt semantic information in
+ * Ivy module descriptor model.
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyAntModuleDescriptorExtension implements ModuleDescriptorExtension {
+
+	private IvyModuleDescriptorModel model;
+	private IvyTag rootTag;
+	private EasyantCoreService easyantCoreService;
+		
+	@Inject
+	public void setEasyantCoreService(EasyantCoreService easyantCoreService) {
+		this.easyantCoreService=easyantCoreService;
+	}
+	
+	public EasyAntModuleDescriptorExtension() {
+		super();
+		Activator.getEasyAntPlugin().injectMembers(this);
+	}
+
+	public IvyModuleDescriptorModel contributeModel(IvyModuleDescriptorModel model) {
+		this.model = model;
+		this.rootTag = model.getRootIvyTag();
+		contributeEasyAntTag();
+		return model;
+	}
+
+	private IvyTag contributeEasyAntTag() {
+		IvyTag easyAntTag = createEasyAndTag();
+		return easyAntTag;
+	}
+
+	private IvyTag createEasyAndTag() {
+		IvyTag easyAntTag = new IvyTag(EASYANT_TAG, "Describes how to build this module with EasyAnt.");
+		easyAntTag.addAttribute(new IvyTagAttribute(EASYANT_TYPE_ATTR, "The name of the build type used to build this module.", true,
+				createBuildTypesValueProvider()));
+		model.addTag(easyAntTag);
+		getDescriptionTag().addChildIvyTag(easyAntTag);
+		easyAntTag = createEasyAndTagChilds(easyAntTag);
+		return easyAntTag;
+	}
+
+	private IvyTag createEasyAndTagChilds(IvyTag easyAntTag) {
+		createPropertyTag(rootTag, easyAntTag);
+		createPluginTag(rootTag, easyAntTag);
+		return easyAntTag;
+	}
+
+	private IvyTag getDescriptionTag() {
+		return model.getIvyTag(IVY_INFO_TAG, IVY_MODULE_TAG);
+	}
+
+	private IDocumentedValueProvider createBuildTypesValueProvider() {
+		final List<String> buildTypes = getBuildTypes();
+		IDocumentedValueProvider buildTypesValueProvider = new IDocumentedValueProvider() {
+			public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
+				return buildTypes.toArray(new String[buildTypes.size()]);
+			}
+			public String getDocForValue(String value, IvyFile ivyFile) {
+				String description = easyantCoreService.getBuildTypeDescription(value);
+				return description;
+			}
+		};
+		return buildTypesValueProvider;
+	}
+
+	private List<String> getBuildTypes() {
+		// load default build types
+		final ArrayList<String> buildTypes = new ArrayList<String>();
+		Job job = new Job("Easyant - Getting list of Build Types (" + EASYANT_BUILD_TYPES_ORG + ") " + "from repository ...") {
+			protected IStatus run(IProgressMonitor monitor) {
+				for (String module : easyantCoreService.getAllCoreBuildTypes()) {
+					String shortName = module.substring(module.indexOf("#")+1);
+					buildTypes.add(shortName);
+					buildTypes.add(module);
+				}
+				return Status.OK_STATUS;
+			}
+		};
+		job.setPriority(Job.LONG);
+		job.schedule();
+		return buildTypes;
+	}
+
+	private IvyTag createPropertyTag(IvyTag root, IvyTag parent) {
+		// Contribute <property name="" value=""> Tag
+		IvyTag propertyTag = new IvyTag(EASYANT_PROPERTY_TAG, "Define a property in order to configure the build type or plugins.");
+		propertyTag.addAttribute(new IvyTagAttribute(EASYANT_PROPERTY_NAME_ATTR, "The name of property. (associated with the 'value' tag)", false,
+				createPropertyNameValueProvider()));
+		propertyTag.addAttribute(new IvyTagAttribute(EASYANT_PROPERTY_VALUE_ATTR, "The value of property identified by the 'name' tag", false,
+				createPropertyValueProvider()));
+		propertyTag.addAttribute(new IvyTagAttribute(EASYANT_PROPERTY_FILE_ATTR, "Define a property file containing some properties 'name=value' pairs.", false));
+		model.addTag(propertyTag);
+		parent.addChildIvyTag(propertyTag);
+		return propertyTag;
+	}
+
+	private IvyTag createPluginTag(IvyTag root, IvyTag parent) {
+		// Contribute <plugin module="" as=""> Tag
+		IvyTag propertyTag = new IvyTag(EASYANT_PLUGIN_TAG, "Define a plugin used to contribute additionnal parts of the build process.");
+		propertyTag.addAttribute(new IvyTagAttribute(EASYANT_PLUGIN_MODULE_ATTR, "The name of the plugin.", true,
+				createPluginModuleValueProvider()));
+		propertyTag.addAttribute(new IvyTagAttribute(EASYANT_PLUGIN_AS_ATTR, "The name of the prefix used to call plugin's targets, i.e. for 'as=\"myplugin\"': myplugin:target1", true));
+		propertyTag.addAttribute(new IvyTagAttribute(EASYANT_PLUGIN_MODE_ATTR, "The kind of import.", true,
+				createPluginModeValueProvider()));
+		propertyTag.addAttribute(new IvyTagAttribute(EASYANT_PLUGIN_MANDATORY_ATTR, "The mandatory status", false,
+				createPluginMandatoryValueProvider()));
+		model.addTag(propertyTag);
+		parent.addChildIvyTag(propertyTag);
+		return propertyTag;
+	}
+
+	private IDocumentedValueProvider createPluginModuleValueProvider() {
+		final List<String> buildPlugins = getBuildPlugins();
+		IDocumentedValueProvider pluginModuleValueProvider = new IDocumentedValueProvider() {
+			public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
+				return buildPlugins.toArray(new String[buildPlugins.size()]);
+			}
+			public String getDocForValue(String value, IvyFile ivyFile) {
+				String description = easyantCoreService.getPluginDescription(value);
+				return description;
+			}
+		};
+		return pluginModuleValueProvider;
+	}
+
+	private List<String> getBuildPlugins() {
+		final ArrayList<String> buildPlugins = new ArrayList<String>();
+		// load default build plugins
+		Job job = new Job("Easyant - Getting list of Plugins (" + EASYANT_BUILD_PLUGINS_ORG + ") from repository ...") {
+			protected IStatus run(IProgressMonitor monitor) {
+				for (String module : easyantCoreService.getAllCorePlugins()) {
+					String shortName = module.substring(module.indexOf("#")+1);
+					buildPlugins.add(shortName);
+					buildPlugins.add(module);
+				}
+				return Status.OK_STATUS;
+			}
+		};
+		job.setPriority(Job.LONG);
+		job.schedule();
+		return buildPlugins;
+	}
+
+	private IDocumentedValueProvider createPluginModeValueProvider() {
+		IDocumentedValueProvider pluginModeValueProvider = new IDocumentedValueProvider() {
+			public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
+				return new String[] { EASYANT_PLUGIN_MODE_IMPORT, EASYANT_PLUGIN_MODE_INCLUDE };
+			}
+			public String getDocForValue(String value, IvyFile ivyFile) {
+				//TODO get documentation for import and include
+				return null;
+			}
+		};
+		return pluginModeValueProvider;
+	}
+
+	private IDocumentedValueProvider createPluginMandatoryValueProvider() {
+		IDocumentedValueProvider pluginMandatoryValueProvider = new IDocumentedValueProvider() {
+			public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
+				return new String[] { Boolean.TRUE.toString(), Boolean.FALSE.toString() };
+			}
+			public String getDocForValue(String value, IvyFile ivyFile) {
+				return null;
+			}
+		};
+		return pluginMandatoryValueProvider;
+	}
+
+	private IDocumentedValueProvider createPropertyValueProvider() {
+		IDocumentedValueProvider propertyValueValueProvider = new IDocumentedValueProvider() {
+
+			public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
+				PropertyDescriptor propertyDescriptor = getPropertyDescriptor(att, ivyFile);
+				if (propertyDescriptor != null) {
+				    String value = propertyDescriptor.getDefaultValue();
+				    if(value==null){
+				        value = propertyDescriptor.getValue();
+				    }
+				    if(value!=null){
+				        return new String[] { value };
+                    }
+			        return new String[] {};	 
+				}
+				return new String[] {};
+			}
+			public String getDocForValue(String value, IvyFile ivyFile) {
+				return null;
+			}
+		};
+		return propertyValueValueProvider;
+	}
+
+	private IDocumentedValueProvider createPropertyNameValueProvider() {
+		IDocumentedValueProvider propertyNameValueProvider = new IDocumentedValueProvider() {
+			public String[] getValuesfor(IvyTagAttribute att, IvyFile ivyFile) {
+				String buildType = getBuildType(ivyFile);
+				if (buildType != null) {
+					List<PropertyDescriptor> propertyDescriptors = easyantCoreService.getPropertiesForBuildType(buildType);
+					String[] names = new String[propertyDescriptors.size()];
+					int i = 0;
+					for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
+						names[i] = propertyDescriptor.getName();
+						i++;
+					}
+					return names;
+				}
+				return new String[] {};
+			}
+			public String getDocForValue(String value, IvyFile ivyFile) {
+				String buildType = getBuildType(ivyFile);
+				if(buildType!=null){
+					PropertyDescriptor propertyDescriptor = getPropertyDescriptor(buildType, value);
+					if(propertyDescriptor!=null){
+						return propertyDescriptor.getDescription();
+					}
+				}
+				return null;
+			}
+		};
+		return propertyNameValueProvider;
+	}
+
+	List<PropertyDescriptor> propertyDescriptorsCache;
+	private PropertyDescriptor getPropertyDescriptor(String buildType, String propertyName) {
+		if(propertyDescriptorsCache==null){
+			propertyDescriptorsCache= easyantCoreService.getPropertiesForBuildType(buildType);
+		}
+		for (PropertyDescriptor propertyDescriptor : propertyDescriptorsCache) {
+			if (propertyName.equals(propertyDescriptor.getName())) {
+				return propertyDescriptor;
+			}
+		}
+		return null;
+	}
+	
+	private PropertyDescriptor getPropertyDescriptor(IvyTagAttribute att, IvyFile ivyFile) {
+		String buildType = getBuildType(ivyFile);
+		if (ivyFile.getAllAttsValues().containsKey(EASYANT_PROPERTY_NAME_ATTR)) {
+			String propertyNameValue = ivyFile.getAllAttsValues().get(EASYANT_PROPERTY_NAME_ATTR).toString();
+			if (buildType != null && propertyNameValue != null) {
+				List<PropertyDescriptor> propertyDescriptors = easyantCoreService.getPropertiesForBuildType(buildType);
+				for (PropertyDescriptor propertyDescriptor : propertyDescriptors) {
+					if (propertyNameValue.equals(propertyDescriptor.getName())) {
+						return propertyDescriptor;
+					}
+				}
+			}
+		}
+		return null;
+	}
+
+	@SuppressWarnings("unchecked")
+	private String getBuildType(IvyFile ivyFile) {
+		if (EASYANT_TAG.equals(ivyFile.getParentTagName())) {
+			int[] indexes = ivyFile.getParentTagIndex();
+			if (indexes != null && indexes.length > 0) {
+				Map<String, String> allAttsValuesForEasyAntTag = ivyFile.getAllAttsValues(indexes[0] + 1);
+				String typeValue = allAttsValuesForEasyAntTag.get(EASYANT_TYPE_ATTR);
+				return typeValue;
+			}
+		}else if (IVY_INFO_TAG.equals(ivyFile.getParentTagName())) {
+			Map<String, String> allAttsValuesForEasyAntTag = ivyFile.getAllAttsValues(ivyFile.getOffset() + 1);
+			String typeValue = allAttsValuesForEasyAntTag.get(EASYANT_TYPE_ATTR);
+			return typeValue;
+		}
+		return null;
+	}
+	
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/BuildLifeCycleContentProvider.java b/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/BuildLifeCycleContentProvider.java
new file mode 100644
index 0000000..383436d
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/BuildLifeCycleContentProvider.java
@@ -0,0 +1,96 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.ivyde.extension.page;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.apache.easyant.core.report.PhaseReport;
+import org.apache.easyant.core.report.TargetReport;
+import org.apache.easyant4e.services.EasyantProjectService;
+import org.apache.ivyde.eclipse.ui.core.IvyFileEditorInput;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.Viewer;
+
+import com.google.inject.Inject;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class BuildLifeCycleContentProvider implements ITreeContentProvider {
+
+	private EasyantProjectService easyantProjectService;
+
+	public BuildLifeCycleContentProvider() {
+	}
+
+	@Inject
+	public void setEasyantProjectService(EasyantProjectService easyantProjectService) {
+		this.easyantProjectService = easyantProjectService;
+	}
+
+	public Object[] getElements(Object inputElement) {
+		if (inputElement instanceof IvyFileEditorInput) {
+			IvyFileEditorInput ivyFileEditorInput = (IvyFileEditorInput) inputElement;
+			IFile ivyFile = ivyFileEditorInput.getFile();
+			List<PhaseReport> phaseReports = easyantProjectService.getPhases(ivyFile);
+			List<TargetReport> targetReports = easyantProjectService.getTargets(ivyFile);
+			ArrayList<Object> o = new ArrayList<Object>();
+			o.addAll(phaseReports);
+			o.addAll(targetReports);
+			Object[] input = o.toArray(new Object[o.size()]);
+			return input;
+		}
+		return new Object[0];
+	}
+
+	public void dispose() {
+	}
+
+	public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+	}
+
+	public Object[] getChildren(Object parentElement) {
+		if (parentElement instanceof PhaseReport) {
+			PhaseReport phaseReport = (PhaseReport) parentElement;
+			//if (phaseReport.getName().equals("compile")) {
+			//	System.out.println("coucou");
+			//}
+			List<TargetReport> targetReports = phaseReport.getTargetReports();
+			return targetReports.toArray(new TargetReport[targetReports.size()]);
+		}
+		return null;
+	}
+
+	public Object getParent(Object element) {
+		return null;
+	}
+
+	public boolean hasChildren(Object element) {
+		if (element instanceof PhaseReport) {
+			PhaseReport phaseReport = (PhaseReport) element;
+			List<TargetReport> targetReports = phaseReport.getTargetReports();
+			return (targetReports != null && targetReports.size() > 0);
+		}
+		return false;
+	}
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/BuildLifecycleBlock.java b/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/BuildLifecycleBlock.java
new file mode 100644
index 0000000..5e57512
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/BuildLifecycleBlock.java
@@ -0,0 +1,301 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.ivyde.extension.page;
+
+import org.apache.easyant.core.report.PhaseReport;
+import org.apache.easyant.core.report.TargetReport;
+import org.apache.easyant4e.EasyAntConstants;
+import org.apache.easyant4e.console.EasyAntConsole;
+import org.apache.easyant4e.providers.ImageProvider;
+import org.apache.easyant4e.services.EasyantProjectService;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.WorkspaceJob;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jdt.internal.ui.callhierarchy.HistoryListAction;
+import org.eclipse.jface.action.Action;
+import org.eclipse.jface.action.ActionContributionItem;
+import org.eclipse.jface.action.IMenuCreator;
+import org.eclipse.jface.viewers.DoubleClickEvent;
+import org.eclipse.jface.viewers.IDoubleClickListener;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.jface.viewers.TreeViewer;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Menu;
+import org.eclipse.swt.widgets.MenuItem;
+import org.eclipse.ui.IFileEditorInput;
+import org.eclipse.ui.forms.DetailsPart;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.MasterDetailsBlock;
+import org.eclipse.ui.forms.SectionPart;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+import org.eclipse.ui.forms.widgets.Section;
+
+import com.google.inject.Inject;
+
+//import com.google.inject.Inject;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class BuildLifecycleBlock extends MasterDetailsBlock {
+	private FormPage page;	
+
+	private BuildLifeCycleContentProvider buildLifeCycleContentProvider;
+	private BuildLifecycleLabelProvider buildLifecycleLabelProvider;
+	private EasyantProjectService easyantProjectService;
+	private PhaseDetailsPage phaseDetailsPage;
+	private TargetDetailsPage targetDetailsPage;
+	private EasyAntConsole console;
+	private ImageProvider imageProvider;
+	private boolean enableInfoLogLevel = false;
+	private boolean enableVerboseLogLevel = false;
+	private boolean enableDebugLogLevel = false;
+	
+	
+	public BuildLifecycleBlock() {}
+	
+	@Inject
+	public void setImageProvider(ImageProvider imageProvider) {
+		this.imageProvider = imageProvider;
+	}
+	
+	@Inject
+	public void setConsole(EasyAntConsole console) {
+		this.console = console;
+	}
+	
+	@Inject
+	public void setPhaseDetailsPage(PhaseDetailsPage phaseDetailsPage) {
+		this.phaseDetailsPage = phaseDetailsPage;
+	}
+
+	@Inject
+	public void setTargetDetailsPage(TargetDetailsPage targetDetailsPage) {
+		this.targetDetailsPage = targetDetailsPage;
+	}
+
+	@Inject
+	public void setEasyantProjectService(EasyantProjectService easyantProjectService) {
+		this.easyantProjectService = easyantProjectService;
+	}
+
+	@Inject
+	public void setBuildLifecycleLabelProvider(BuildLifecycleLabelProvider buildLifecycleLabelProvider) {
+		this.buildLifecycleLabelProvider = buildLifecycleLabelProvider;
+	}
+
+	@Inject
+	public void setBuildLifeCycleContentProvider(BuildLifeCycleContentProvider buildLifeCycleContentProvider) {
+		this.buildLifeCycleContentProvider = buildLifeCycleContentProvider;
+	}
+
+	public void setPage(FormPage page) {
+		this.page = page;
+	}
+	
+	@Override
+	protected void createMasterPart(final IManagedForm managedForm, final Composite parent) {
+		createBuildLifecyclePart(managedForm, parent);
+	}
+
+	protected void createBuildLifecyclePart(final IManagedForm managedForm, final Composite parent) {
+		FormToolkit toolkit = managedForm.getToolkit();
+		Section section = toolkit.createSection(parent, Section.DESCRIPTION | Section.TITLE_BAR);
+		section.setText("Build Lifecycle");
+		section.setDescription("The build lifecycle has the following build phases:");
+		section.marginWidth = 10;
+		section.marginHeight = 5;
+		Composite client = toolkit.createComposite(section, SWT.WRAP);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.marginWidth = 2;
+		layout.marginHeight = 2;
+		client.setLayout(layout);
+		toolkit.paintBordersFor(client);
+
+		section.setClient(client);
+		final SectionPart spart = new SectionPart(section);
+		managedForm.addPart(spart);
+		TreeViewer viewer = new TreeViewer(client);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.heightHint = 20;
+		gd.widthHint = 100;
+		viewer.getTree().setLayoutData(gd);
+		viewer.addSelectionChangedListener(new ISelectionChangedListener() {
+			public void selectionChanged(SelectionChangedEvent event) {
+				managedForm.fireSelectionChanged(spart, event.getSelection());
+			}
+		});
+		viewer.addDoubleClickListener(new IDoubleClickListener(){
+			public void doubleClick(DoubleClickEvent event) {
+				ISelection selection = event.getSelection();
+				if(selection instanceof StructuredSelection){
+					StructuredSelection structuredSelection = (StructuredSelection)selection;
+					if(!structuredSelection.isEmpty()){
+						Object o = structuredSelection.getFirstElement();						
+						if(o instanceof PhaseReport){
+							runPhase((PhaseReport)o);
+						}else if(o instanceof TargetReport){							
+							runTarget((TargetReport)o);
+						}
+					}
+				}				
+			}			
+		});
+		viewer.setContentProvider(buildLifeCycleContentProvider);
+		viewer.setLabelProvider(buildLifecycleLabelProvider);
+		viewer.setInput(page.getEditor().getEditorInput());
+		// viewer.expandAll();
+	}
+
+	private void runPhase(final PhaseReport phase){
+		Job job = new WorkspaceJob("Easyant running phase " + phase.getName() + "...") {
+			@Override
+			public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
+				easyantProjectService.runBuild(getProject(), phase.getName(), getLogLevel(), monitor);
+				return Status.OK_STATUS;
+			}
+		};
+		job.schedule();
+	}
+	
+	private void runTarget(final TargetReport target){
+		Job job = new WorkspaceJob("Easyant running target " + target.getName() + "...") {
+			@Override
+			public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {				
+				easyantProjectService.runBuild(getProject(), target.getName(), getLogLevel(), monitor);
+				return Status.OK_STATUS;
+			}
+		};
+		job.schedule();
+	}
+	
+	private int getLogLevel(){
+		int logLevel = EasyAntConstants.ANT_LOGLEVEL_WARN;
+		if(enableInfoLogLevel){
+			logLevel = EasyAntConstants.ANT_LOGLEVEL_INFO;
+		}
+		if(enableVerboseLogLevel){
+			logLevel = EasyAntConstants.ANT_LOGLEVEL_VERBOSE;
+		}		
+		if(enableDebugLogLevel){
+			logLevel = EasyAntConstants.ANT_LOGLEVEL_DEBUG;
+		}
+		return logLevel;
+	}
+	
+	protected void registerPages(DetailsPart detailsPart) {
+		phaseDetailsPage.setProject(getProject());
+		detailsPart.registerPage(PhaseReport.class, phaseDetailsPage);
+		targetDetailsPage.setProject(getProject());
+		detailsPart.registerPage(TargetReport.class, targetDetailsPage);
+	}
+
+	@Override
+	protected void createToolBarActions(IManagedForm managedForm) {
+		final ScrolledForm form = managedForm.getForm();
+		Action setLogLevelAction = new LogLevelDropDownAction();
+		form.getToolBarManager().add(setLogLevelAction);
+	}
+
+	private IProject getProject() {
+		if (page.getEditor().getEditorInput() instanceof IFileEditorInput) {
+			IFileEditorInput fileEditorInput = (IFileEditorInput) page.getEditor().getEditorInput();
+			IFile ivyFile = fileEditorInput.getFile();
+			return ivyFile.getProject();
+		}
+		return null;
+	}
+	
+	private class LogLevelDropDownAction extends Action implements IMenuCreator {
+		private Menu menu;
+		
+		public LogLevelDropDownAction(){
+			super("setDebugLogLevel", Action.AS_DROP_DOWN_MENU);
+			setMenuCreator(this);
+			setToolTipText("Set the log level in console view.");
+			setImageDescriptor(imageProvider.getDebugLogLevelImage());		
+		}
+		
+		public Menu getMenu(Menu parent) { return null; }
+		public Menu getMenu(Control parent) {
+			if (menu == null){
+				menu = new Menu(parent);
+				MenuItem info = new MenuItem(menu, SWT.CHECK);
+				info.setText("INFO");
+				info.addSelectionListener(new SelectionListener() {
+					public void widgetSelected(SelectionEvent e) {
+						enableInfoLogLevel=!enableInfoLogLevel;
+						phaseDetailsPage.setLogLevel(getLogLevel());
+						targetDetailsPage.setLogLevel(getLogLevel());
+					}
+					public void widgetDefaultSelected(SelectionEvent e) {}
+				});
+				MenuItem verbose = new MenuItem(menu, SWT.CHECK);
+				verbose.setText("VERBOSE");
+				verbose.addSelectionListener(new SelectionListener() {
+					public void widgetSelected(SelectionEvent e) {
+						enableVerboseLogLevel=!enableVerboseLogLevel;
+						phaseDetailsPage.setLogLevel(getLogLevel());
+						targetDetailsPage.setLogLevel(getLogLevel());
+					}
+					public void widgetDefaultSelected(SelectionEvent e) {}
+				});
+				MenuItem debug = new MenuItem(menu, SWT.CHECK);
+				debug.setText("DEBUG");
+				debug.addSelectionListener(new SelectionListener() {
+					public void widgetSelected(SelectionEvent e) {
+						enableDebugLogLevel=!enableDebugLogLevel;
+						phaseDetailsPage.setLogLevel(getLogLevel());
+						targetDetailsPage.setLogLevel(getLogLevel());
+					}
+					public void widgetDefaultSelected(SelectionEvent e) {}
+				});
+			}
+			return menu;
+		}
+		
+		public void dispose() {
+			if (menu != null){
+				menu.dispose();
+				menu=null;
+			}
+		}
+		
+		public void run() {}
+	}
+		
+}
\ No newline at end of file
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/BuildLifecycleLabelProvider.java b/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/BuildLifecycleLabelProvider.java
new file mode 100644
index 0000000..8657343
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/BuildLifecycleLabelProvider.java
@@ -0,0 +1,67 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.ivyde.extension.page;
+
+import org.apache.easyant.core.report.PhaseReport;
+import org.apache.easyant.core.report.TargetReport;
+import org.apache.easyant4e.providers.ImageProvider;
+import org.eclipse.jface.viewers.BaseLabelProvider;
+import org.eclipse.jface.viewers.ILabelProvider;
+import org.eclipse.swt.graphics.Image;
+
+import com.google.inject.Inject;
+
+//import com.google.inject.Inject;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class BuildLifecycleLabelProvider extends BaseLabelProvider implements ILabelProvider {
+
+	@Inject 
+	private ImageProvider imageProvider;
+	
+	public BuildLifecycleLabelProvider(){
+		
+	}
+	
+	public Image getImage(Object element) {
+		if (element instanceof PhaseReport) {
+			return imageProvider.getPhaseImage();
+		}
+		if (element instanceof TargetReport) {
+			return imageProvider.getTargetImage();
+		}
+		return null;
+	}
+
+	public String getText(Object element) {
+		if (element instanceof PhaseReport) {
+			PhaseReport phaseReport = (PhaseReport) element;
+			return phaseReport.getName();
+		}
+		if (element instanceof TargetReport) {
+			TargetReport targetReport = (TargetReport) element;
+			return targetReport.getName();
+		}
+		return element.toString();
+	}
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/BuildPage.java b/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/BuildPage.java
new file mode 100644
index 0000000..c0b9e3a
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/BuildPage.java
@@ -0,0 +1,79 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.ivyde.extension.page;
+
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.console.EasyAntConsole;
+import org.apache.easyant4e.providers.ImageProvider;
+import org.apache.ivyde.eclipse.extension.IvyEditorPage;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.editor.FormPage;
+import org.eclipse.ui.forms.widgets.ScrolledForm;
+
+import com.google.inject.Inject;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class BuildPage extends FormPage implements IvyEditorPage {
+
+	private static final String ID = "build";
+	private static final String NAME = "Build";
+	private BuildLifecycleBlock buildLifecycleBlock;
+	private ImageProvider imageProvider;
+	private EasyAntConsole console;
+
+	@Inject
+	public void setEasyAntConsole(EasyAntConsole console){
+		this.console = console;
+	}
+	
+	@Inject
+	public void setBuildLifecycleBlock(BuildLifecycleBlock buildLifecycleBlock) {
+		this.buildLifecycleBlock = buildLifecycleBlock;
+	}
+	
+	@Inject
+	public void setImageProvider(ImageProvider imageProvider) {
+		this.imageProvider = imageProvider;
+	}
+
+	public BuildPage() {
+		super(ID, NAME);
+		Activator.getEasyAntPlugin().injectMembers(this);
+	}
+
+	protected void createFormContent(IManagedForm managedForm) {
+		super.createFormContent(managedForm);
+		buildLifecycleBlock.setPage(this);
+		
+		final ScrolledForm form = managedForm.getForm();
+		form.setText("EasyAnt Build");
+		form.setBackgroundImage(imageProvider.getFormBackgroundImage());
+		buildLifecycleBlock.createContent(managedForm);
+		
+		console.show();	
+	}
+
+	public String getPageName() {
+		return NAME;
+	}
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/PhaseDetailsPage.java b/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/PhaseDetailsPage.java
new file mode 100644
index 0000000..73224ca
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/PhaseDetailsPage.java
@@ -0,0 +1,210 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.ivyde.extension.page;
+
+import org.apache.easyant.core.report.PhaseReport;
+import org.apache.easyant4e.EasyAntConstants;
+import org.apache.easyant4e.providers.ImageProvider;
+import org.apache.easyant4e.services.EasyantProjectService;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.WorkspaceJob;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.IDetailsPage;
+import org.eclipse.ui.forms.IFormPart;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.forms.widgets.TableWrapData;
+import org.eclipse.ui.forms.widgets.TableWrapLayout;
+
+import com.google.inject.Inject;
+
+//import com.google.inject.Inject;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class PhaseDetailsPage implements IDetailsPage {
+	private IManagedForm mform;
+	private PhaseReport phase;
+	private IProject project;
+
+	private Text description;
+	private Text depends;
+
+	private EasyantProjectService easyantProjectService;
+
+	private ImageProvider imageProvider;
+	
+	private int logLevel=EasyAntConstants.ANT_LOGLEVEL_WARN;
+	
+	public void setLogLevel(int logLevel){
+		this.logLevel=logLevel;
+	}
+
+	public PhaseDetailsPage() {
+	}
+
+	public void setProject(IProject project) {
+		this.project = project;
+	}
+
+	@Inject
+	public void setImageProvider(ImageProvider imageProvider) {
+		this.imageProvider = imageProvider;
+	}
+
+	@Inject
+	public void setEasyantProjectService(EasyantProjectService easyantProjectService) {
+		this.easyantProjectService = easyantProjectService;
+	}
+
+	public void initialize(IManagedForm mform) {
+		this.mform = mform;
+	}
+
+	public void createContents(Composite parent) {
+		TableWrapLayout layout = new TableWrapLayout();
+		layout.topMargin = 5;
+		layout.leftMargin = 5;
+		layout.rightMargin = 2;
+		layout.bottomMargin = 2;
+		parent.setLayout(layout);
+
+		FormToolkit toolkit = mform.getToolkit();
+		Section section1 = toolkit.createSection(parent, Section.DESCRIPTION | Section.TITLE_BAR);
+		section1.marginWidth = 10;
+		section1.setText("Phase Details");
+		section1
+				.setDescription("Phases define an ordered set of build phases. Build phases are responsible for the build choreography at macro level.");
+		TableWrapData td = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);
+		td.grabHorizontal = true;
+		section1.setLayoutData(td);
+		Composite client = toolkit.createComposite(section1);
+		GridLayout glayout = new GridLayout();
+		glayout.marginWidth = glayout.marginHeight = 0;
+		client.setLayout(glayout);
+
+		createSpacer(toolkit, client, 2);
+
+		toolkit.createLabel(client, "Description:");
+		description = toolkit.createText(client, "", SWT.MULTI | SWT.WRAP);
+		GridData gdDescription = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
+		gdDescription.widthHint = 10;
+		description.setLayoutData(gdDescription);
+
+		createSpacer(toolkit, client, 2);
+
+		toolkit.createLabel(client, "Depends:");
+		depends = toolkit.createText(client, "", SWT.MULTI | SWT.WRAP);
+		GridData gdDepends = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
+		gdDepends.widthHint = 10;
+		depends.setLayoutData(gdDepends);
+
+		createSpacer(toolkit, client, 2);
+
+		ImageHyperlink buildLink = toolkit.createImageHyperlink(client, SWT.NULL);
+		buildLink.setText("Run this phase...");
+		buildLink.setForeground(PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_BLUE));
+		buildLink.setImage(imageProvider.getBuildImage());
+		buildLink.addHyperlinkListener(new HyperlinkAdapter() {
+			public void linkActivated(HyperlinkEvent e) {
+				Job job = new WorkspaceJob("Easyant running phase " + phase.getName() + "...") {
+					@Override
+					public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
+						easyantProjectService.runBuild(project, phase.getName(), logLevel, monitor);
+						return Status.OK_STATUS;
+					}
+				};
+				job.schedule();
+			}
+		});
+
+		section1.setClient(client);
+	}
+
+	private void createSpacer(FormToolkit toolkit, Composite parent, int span) {
+		Label spacer = toolkit.createLabel(parent, ""); //$NON-NLS-1$
+		GridData gd = new GridData();
+		gd.horizontalSpan = span;
+		spacer.setLayoutData(gd);
+	}
+
+	private void update() {
+		if (phase.getDescription() != null) {
+			description.setText(phase.getDescription());
+		}
+		if (phase.getDepends() != null) {
+			depends.setText(phase.getDepends());
+		}
+	}
+
+	public void selectionChanged(IFormPart part, ISelection selection) {
+		IStructuredSelection ssel = (IStructuredSelection) selection;
+		if (ssel.size() == 1) {
+			phase = (PhaseReport) ssel.getFirstElement();
+		} else {
+			phase = null;
+		}
+		update();
+	}
+
+	public void commit(boolean onSave) {
+	}
+
+	public void setFocus() {
+	}
+
+	public void dispose() {
+	}
+
+	public boolean isDirty() {
+		return false;
+	}
+
+	public boolean isStale() {
+		return false;
+	}
+
+	public void refresh() {
+		update();
+	}
+
+	public boolean setFormInput(Object input) {
+		return false;
+	}
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/TargetDetailsPage.java b/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/TargetDetailsPage.java
new file mode 100644
index 0000000..45065f1
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/ivyde/extension/page/TargetDetailsPage.java
@@ -0,0 +1,207 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.ivyde.extension.page;
+
+import org.apache.easyant.core.report.TargetReport;
+import org.apache.easyant4e.EasyAntConstants;
+import org.apache.easyant4e.providers.ImageProvider;
+import org.apache.easyant4e.services.EasyantProjectService;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.WorkspaceJob;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.jobs.Job;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.forms.IDetailsPage;
+import org.eclipse.ui.forms.IFormPart;
+import org.eclipse.ui.forms.IManagedForm;
+import org.eclipse.ui.forms.events.HyperlinkAdapter;
+import org.eclipse.ui.forms.events.HyperlinkEvent;
+import org.eclipse.ui.forms.widgets.FormToolkit;
+import org.eclipse.ui.forms.widgets.ImageHyperlink;
+import org.eclipse.ui.forms.widgets.Section;
+import org.eclipse.ui.forms.widgets.TableWrapData;
+import org.eclipse.ui.forms.widgets.TableWrapLayout;
+
+import com.google.inject.Inject;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class TargetDetailsPage implements IDetailsPage {
+	private IManagedForm mform;
+	private TargetReport target;
+
+	private IProject project;
+
+	private Text description;
+	private Text depends;
+	
+	private EasyantProjectService easyantProjectService;
+
+	private ImageProvider imageProvider;	
+
+	private int logLevel=EasyAntConstants.ANT_LOGLEVEL_WARN;
+	
+	public void setLogLevel(int logLevel){
+		this.logLevel=logLevel;
+	}
+	
+	public TargetDetailsPage() {}
+	
+	public void setProject(IProject project) {
+		this.project = project;
+	}
+	
+	@Inject
+	public void setImageProvider(ImageProvider imageProvider) {
+		this.imageProvider = imageProvider;
+	}
+	
+	
+	@Inject
+	public void setEasyantProjectService(EasyantProjectService easyantProjectService) {
+		this.easyantProjectService = easyantProjectService;
+	}
+
+	public void createContents(Composite parent) {
+		TableWrapLayout layout = new TableWrapLayout();
+		layout.topMargin = 5;
+		layout.leftMargin = 5;
+		layout.rightMargin = 2;
+		layout.bottomMargin = 2;
+		parent.setLayout(layout);
+
+		FormToolkit toolkit = mform.getToolkit();
+		Section section1 = toolkit.createSection(parent, Section.DESCRIPTION | Section.TITLE_BAR);
+		section1.marginWidth = 10;
+		section1.setText("Target Details");
+		section1.setDescription("Targets define a build unit.");		
+		TableWrapData td = new TableWrapData(TableWrapData.FILL, TableWrapData.TOP);
+		td.grabHorizontal = true;
+		section1.setLayoutData(td);
+		Composite client = toolkit.createComposite(section1);
+		GridLayout glayout = new GridLayout();
+		glayout.marginWidth = glayout.marginHeight = 0;
+		client.setLayout(glayout);
+
+		createSpacer(toolkit, client, 2);
+
+		toolkit.createLabel(client, "Description:");
+		description = toolkit.createText(client, "", SWT.MULTI | SWT.WRAP);
+		GridData gdDescription = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
+		gdDescription.widthHint = 10;
+		description.setLayoutData(gdDescription);
+
+		createSpacer(toolkit, client, 2);
+		
+		toolkit.createLabel(client, "Depends:");
+		depends = toolkit.createText(client, "", SWT.MULTI | SWT.WRAP);
+		GridData gdDepends = new GridData(GridData.FILL_HORIZONTAL | GridData.VERTICAL_ALIGN_BEGINNING);
+		gdDepends.widthHint = 10;
+		depends.setLayoutData(gdDepends);
+
+		createSpacer(toolkit, client, 2);
+		
+		ImageHyperlink buildLink = toolkit.createImageHyperlink(client, SWT.NULL);
+		buildLink.setText("Run this target...");
+		buildLink.setForeground(PlatformUI.getWorkbench().getDisplay().getSystemColor(SWT.COLOR_BLUE));
+		buildLink.setImage(imageProvider.getBuildImage());
+		buildLink.addHyperlinkListener(new HyperlinkAdapter() {
+			public void linkActivated(HyperlinkEvent e) {
+				Job job = new WorkspaceJob("Easyant running target " + target.getName() + "...") {
+					@Override
+					public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
+						easyantProjectService.runBuild(project, target.getName(), logLevel, monitor);
+						return Status.OK_STATUS;
+					}
+				};
+				job.schedule();
+			}
+		});
+		section1.setClient(client);
+	}
+
+	private void createSpacer(FormToolkit toolkit, Composite parent, int span) {
+		Label spacer = toolkit.createLabel(parent, ""); //$NON-NLS-1$
+		GridData gd = new GridData();
+		gd.horizontalSpan = span;
+		spacer.setLayoutData(gd);
+	}
+	
+	public void initialize(IManagedForm form) {
+		this.mform = form;
+	}
+
+	public void selectionChanged(IFormPart part, ISelection selection) {
+		IStructuredSelection ssel = (IStructuredSelection) selection;
+		if (ssel.size() == 1) {
+			target = (TargetReport) ssel.getFirstElement();
+		} else {
+			target = null;
+		}
+		update();
+	}
+
+	private void update() {
+		if(target.getDescription()!=null){
+			description.setText(target.getDescription());
+		}
+		if(target.getDepends()!=null){
+			depends.setText(target.getDepends());
+		}
+	}
+
+
+	public void commit(boolean onSave) {
+	}
+
+	public void dispose() {
+	}
+	
+	public boolean isDirty() {
+		return false;
+	}
+
+	public boolean isStale() {
+		return false;
+	}
+
+	public void refresh() {
+	}
+
+	public void setFocus() {
+	}
+
+	public boolean setFormInput(Object input) {
+		return false;
+	}
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/modules/EasyAnt4EclipseModule.java b/org.apache.easyant4e/src/org/apache/easyant4e/modules/EasyAnt4EclipseModule.java
new file mode 100644
index 0000000..086fe5a
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/modules/EasyAnt4EclipseModule.java
@@ -0,0 +1,68 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.modules;
+
+import org.apache.easyant4e.console.EasyAntConsole;
+import org.apache.easyant4e.console.EasyAntConsoleImpl;
+import org.apache.easyant4e.ivyde.extension.page.BuildLifeCycleContentProvider;
+import org.apache.easyant4e.ivyde.extension.page.BuildLifecycleBlock;
+import org.apache.easyant4e.ivyde.extension.page.BuildLifecycleLabelProvider;
+import org.apache.easyant4e.ivyde.extension.page.PhaseDetailsPage;
+import org.apache.easyant4e.ivyde.extension.page.TargetDetailsPage;
+import org.apache.easyant4e.providers.ImageProvider;
+import org.apache.easyant4e.providers.ImageProviderImpl;
+import org.apache.easyant4e.services.EasyantCoreService;
+import org.apache.easyant4e.services.EasyantCoreServiceImpl;
+import org.apache.easyant4e.services.EasyantProjectService;
+import org.apache.easyant4e.services.EasyantProjectServiceImpl;
+import org.apache.easyant4e.wizards.EasyAntImportWizardPage;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Singleton;
+
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyAnt4EclipseModule extends AbstractModule{
+
+
+	@Override
+	protected void configure() {		
+		bind(EasyAntConsole.class).to(EasyAntConsoleImpl.class).in(Singleton.class);
+		bind(ImageProvider.class).to(ImageProviderImpl.class).in(Singleton.class);
+		bind(EasyantCoreService.class).to(EasyantCoreServiceImpl.class).in(Singleton.class);
+		bind(EasyantProjectService.class).to(EasyantProjectServiceImpl.class).in(Singleton.class);
+		
+		bind(BuildLifecycleBlock.class).in(Singleton.class);
+		bind(BuildLifeCycleContentProvider.class).in(Singleton.class);
+		bind(BuildLifecycleLabelProvider.class).in(Singleton.class);		
+		bind(PhaseDetailsPage.class).in(Singleton.class);
+		bind(TargetDetailsPage.class).in(Singleton.class);
+		
+		bind(EasyAntImportWizardPage.class);//.in(Singleton.class);
+		
+		// Bind to instance
+        //binder.bind(Appendable.class).toInstance(System.out);
+		
+	}
+
+	
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/modules/EasyAntCoreModule.java b/org.apache.easyant4e/src/org/apache/easyant4e/modules/EasyAntCoreModule.java
new file mode 100644
index 0000000..f9b79d2
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/modules/EasyAntCoreModule.java
@@ -0,0 +1,53 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.modules;
+
+import static org.apache.easyant4e.EasyAntConstants.PLUGINS_SETTINGS;
+
+import java.net.URL;
+
+import org.apache.easyant.core.EasyAntConfiguration;
+import org.apache.easyant.core.EasyAntEngine;
+import org.apache.easyant.core.factory.EasyantConfigurationFactory;
+import org.apache.easyant4e.Activator;
+
+import com.google.inject.AbstractModule;
+import com.google.inject.Provider;
+import com.google.inject.Singleton;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyAntCoreModule extends AbstractModule{
+
+	@Override
+	protected void configure() {	
+		bind(EasyAntEngine.class).toProvider(new Provider<EasyAntEngine>() {
+			public EasyAntEngine get() {
+				URL url = Activator.getDefault().getBundle().getResource(PLUGINS_SETTINGS);		
+				EasyAntConfiguration configuration= EasyantConfigurationFactory.getInstance().createDefaultConfiguration();
+				configuration.setEasyantIvySettingsUrl(url);
+				return new EasyAntEngine(configuration);
+			}
+	
+		}).in(Singleton.class);
+	}
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/natures/AddEasyAntNatureAction.java b/org.apache.easyant4e/src/org/apache/easyant4e/natures/AddEasyAntNatureAction.java
new file mode 100644
index 0000000..c9c812a
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/natures/AddEasyAntNatureAction.java
@@ -0,0 +1,79 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.natures;
+
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.services.EasyantProjectService;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+import com.google.inject.Inject;
+
+//import com.google.inject.Inject;
+
+/**
+ * Add the EasyAnt nature to the project.
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class AddEasyAntNatureAction implements IObjectActionDelegate {
+	
+	// The selected project
+	private IProject selectedProject;
+	private EasyantProjectService easyantProjectService;
+
+	public AddEasyAntNatureAction(){
+		Activator.getEasyAntPlugin().injectMembers(this);
+	}
+	
+	@Inject
+	public void setEasyantProjectService(EasyantProjectService easyantProjectService) {
+		this.easyantProjectService = easyantProjectService;
+	}
+
+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+	}
+
+	public void run(IAction action) {
+		if (selectedProject != null) {
+			// Add the nature on the selected project
+			easyantProjectService.addNature(selectedProject);
+		}
+	}
+
+	public void selectionChanged(IAction action, ISelection selection) {
+		if (selection instanceof StructuredSelection) {
+			StructuredSelection structuredSelection = (StructuredSelection) selection;
+			if (!structuredSelection.isEmpty() && structuredSelection.getFirstElement() instanceof IProject) {
+				IProject project = (IProject) structuredSelection.getFirstElement();
+				if (project.isAccessible()) {
+					this.selectedProject = project;
+					if (action != null) {
+						action.setEnabled(!easyantProjectService.hasEasyAntNature(project));
+					}
+				}
+
+			}
+		}
+	}
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/natures/AddEasyAntNatureOperation.java b/org.apache.easyant4e/src/org/apache/easyant4e/natures/AddEasyAntNatureOperation.java
new file mode 100644
index 0000000..66a7af1
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/natures/AddEasyAntNatureOperation.java
@@ -0,0 +1,65 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.natures;
+
+import java.lang.reflect.InvocationTargetException;
+
+import org.apache.easyant4e.Activator;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+
+/**
+ * Add the EasyAnt nature to the project.
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class AddEasyAntNatureOperation implements IRunnableWithProgress {
+
+	private IProject project;
+
+	public AddEasyAntNatureOperation(IProject project) {
+		this.project = project;
+	}
+
+	public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+		if (project != null) {
+			try {
+				if (!project.hasNature(EasyAntNature.NATURE_ID)) {
+					monitor.subTask("Add the EasyAnt nature to the project " + project.getName());
+					IProjectDescription description = project.getDescription();
+					String[] oldNatures = description.getNatureIds();
+					String[] newNatures = new String[oldNatures.length + 1];
+					System.arraycopy(oldNatures, 0, newNatures, 1, oldNatures.length);
+					newNatures[0] = EasyAntNature.NATURE_ID;
+					description.setNatureIds(newNatures);
+					project.setDescription(description, new SubProgressMonitor(monitor, 1));
+				}
+			} catch (CoreException e) {
+				Activator.getEasyAntPlugin().log(e);
+			}
+			monitor.done();
+		}
+
+	}
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/natures/EasyAntNature.java b/org.apache.easyant4e/src/org/apache/easyant4e/natures/EasyAntNature.java
new file mode 100644
index 0000000..60e07c1
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/natures/EasyAntNature.java
@@ -0,0 +1,323 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.natures;
+
+import java.io.File;
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.easyant.core.descriptor.PropertyDescriptor;
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.services.EasyantProjectService;
+import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathContainer;
+import org.apache.ivyde.eclipse.cpcontainer.IvyClasspathUtil;
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFolder;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IProjectNature;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.launching.JavaRuntime;
+
+import com.google.inject.Inject;
+
+/**
+ * The EastAnt nature.
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyAntNature implements IProjectNature {
+
+	public static final String NATURE_ID = "org.apache.easyant4e.EasyAntNature";
+
+	public static final String BUILDER_ID = "org.apache.easyant4e.EasyAntBuilder";
+
+	public EasyAntNature(){
+		Activator.getEasyAntPlugin().injectMembers(this);
+	}
+	
+	/**
+	 * The project to which this project nature applies.
+	 */
+	private IProject project = null;
+	
+	private EasyantProjectService easyantProjectService;
+	
+	@Inject
+	public void setEasyantProjectService(EasyantProjectService easyantProjectService){
+		this.easyantProjectService = easyantProjectService;
+	}
+	
+
+	public void configure() throws CoreException {
+		//TODO maybe add an extension point to delegate this step for java, scala, ...
+		//Configurer.configure(IProject, EasyAntModuleDescriptor);		
+		//Add Java Nature
+		//TODO add checkbox or list of configurer (reuse by skeleton) in import and new project wizard to add JavaNature, ScalaNature, GroovyNature ...
+		//or use a dedicated eclipse plugin ?
+		if (!project.hasNature(JavaCore.NATURE_ID)) {			
+			IProjectDescription desc = project.getDescription();
+			List<String> natures = new ArrayList<String>();
+			natures.addAll(Arrays.asList(desc.getNatureIds()));
+			natures.add(JavaCore.NATURE_ID);			
+			desc.setNatureIds(natures.toArray(new String[natures.size()]));
+			project.setDescription(desc, null);
+		}
+		
+		if (project.hasNature(JavaCore.NATURE_ID)) {	
+			IJavaProject javaProject = (IJavaProject)project.getNature(JavaCore.NATURE_ID);
+			//flush classpath
+			javaProject.setRawClasspath(new IClasspathEntry[0], null);						
+			addSourceFolders(javaProject);
+			addDefaultJREContainer(javaProject);
+			addIvyClasspathContainer();
+			addBuilder(BUILDER_ID);
+		}
+	}
+	
+	private void addIvyClasspathContainer() {
+		/*
+		IPath projectRelativePath = new Path("module.ivy");
+		IJavaProject javaProject = JavaCore.create(project);
+		IClasspathEntry newEntry = JavaCore.newContainerEntry(new Path(
+        IvyClasspathContainer.CONTAINER_ID).append(projectRelativePath).append(confs));
+		*/
+		IJavaProject javaProject = JavaCore.create(project);    
+	    //Configure project preferences
+	    StringBuffer projectConf = new StringBuffer();
+	    //TODO search *.ivy file
+	    projectConf.append("?ivyXmlPath=module.ivy");
+	    try {
+	    	appendConfProp(projectConf, "confs", "*");
+			appendConfProp(projectConf, "resolveInWorkspace", Boolean.TRUE.toString());
+			String projectIvySettings = easyantProjectService.getProperty(javaProject.getProject(), "project.ivy.settings.url").getValue();
+		    if(projectIvySettings==null){
+		    	projectIvySettings = easyantProjectService.getProperty(javaProject.getProject(), "project.ivy.settings.file").getValue();
+		    	if(projectIvySettings!=null){
+		    		projectIvySettings = "file://"+resolveRelativePath(projectIvySettings);
+		    	}
+		    }
+		    if(projectIvySettings!=null){
+		    	appendConfProp(projectConf, "ivySettingsPath", projectIvySettings);
+		    }
+		} catch (UnsupportedEncodingException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}
+	    
+	    // add the classpath entry
+		IPath path = new Path(IvyClasspathContainer.CONTAINER_ID).append(projectConf.toString());
+	    IClasspathEntry newEntry = JavaCore.newContainerEntry(path);
+	    addClassPathEntry(javaProject, newEntry);
+	}
+	
+	private String resolveRelativePath(String path){
+		if(path!=null && path.startsWith(".")){
+			String projectPath = project.getLocation().toPortableString();
+			path= new File(projectPath+"/"+path).getAbsolutePath();
+		}
+		return path;
+	}
+	
+	private void appendConfProp(StringBuffer path, String name, String value) throws UnsupportedEncodingException {
+		 path.append('&');
+		 path.append(name);
+		 path.append('=');
+		 path.append(URLEncoder.encode(value, "UTF-8"));
+	}
+
+	//FIXME with scala project or others
+	private void addSourceFolders(IJavaProject javaProject)throws CoreException {		
+		PropertyDescriptor srcMainJavaProp = easyantProjectService.getProperty(project, "src.main.java");
+		String srcMainJava = removeBaseDirVar(srcMainJavaProp.getValue());
+		PropertyDescriptor srcMainResourcesProp = easyantProjectService.getProperty(project, "src.main.resources");
+		String srcMainResources = removeBaseDirVar(srcMainResourcesProp.getValue());
+		PropertyDescriptor srcTestJavaProp = easyantProjectService.getProperty(project, "src.test.java");
+		String srcTestJava = removeBaseDirVar(srcTestJavaProp.getValue());
+		PropertyDescriptor srcTestResourcesProp = easyantProjectService.getProperty(project, "src.test.resources");
+		String srcTestResources = removeBaseDirVar(srcTestResourcesProp.getValue());
+		addSourceFolders(javaProject, srcMainJava,srcMainResources, srcTestJava, srcTestResources);
+	}
+	
+	private String removeBaseDirVar(String s){
+		String baseDirVar = "${basedir}";
+		if(s!=null && s.contains(baseDirVar)){
+			return s.substring(s.indexOf(baseDirVar)+baseDirVar.length()+1);
+		}else{
+			return s;
+		}
+	}
+	
+	public void deconfigure() throws CoreException {
+		if (project.hasNature(JavaCore.NATURE_ID)) {	
+			removeBuilder(BUILDER_ID);
+			removeIvyClasspathContainer();
+		}
+	}
+
+	public IProject getProject() {
+		return project;
+	}
+
+	public void setProject(IProject project) {
+		this.project = project;
+
+	}
+	
+	private void addDefaultJREContainer(IJavaProject javaProject) throws JavaModelException{		
+		List<IClasspathEntry> entries = new ArrayList<IClasspathEntry>();
+		entries.addAll(Arrays.asList(javaProject.getRawClasspath()));
+		entries.add(JavaRuntime.getDefaultJREContainerEntry());
+		javaProject.setRawClasspath(entries.toArray(new IClasspathEntry[entries.size()]), null);
+
+	}
+	
+	private void addSourceFolders(IJavaProject javaProject, String...path) throws JavaModelException{		
+		List<IClasspathEntry> entries = new ArrayList<IClasspathEntry>();
+		entries.addAll(Arrays.asList(javaProject.getRawClasspath()));
+		IResource outputLocation = javaProject.getProject().findMember("target");
+		if(outputLocation==null){
+			outputLocation = createSourceFolder(javaProject.getProject(), "target");
+		}
+		javaProject.setOutputLocation(outputLocation.getFullPath(), null);
+		for(String p : path){	
+			IResource sourceFolder = javaProject.getProject().findMember(p);
+			if(sourceFolder==null){
+				sourceFolder = createSourceFolder(javaProject.getProject(), p);
+			}
+			if(sourceFolder!=null){
+				IPath[] exclusionPatterns = new IPath[] { outputLocation.getFullPath() };
+				IClasspathEntry srcEntry = JavaCore.newSourceEntry(sourceFolder.getFullPath(),exclusionPatterns, outputLocation.getFullPath());				
+				entries.add(srcEntry);
+			}
+		}
+		javaProject.setRawClasspath(entries.toArray(new IClasspathEntry[entries.size()]), null);
+	}
+	
+	 private IResource createSourceFolder( IProject project, String sourcefolder ){
+	        IPath path = new Path(sourcefolder);
+	        IContainer container = project;
+	        try {
+	            for (int i = 1; i <= path.segmentCount(); i++) {
+	                IFolder newSourceFolder = project.getFolder( path.uptoSegment( i ) );
+	                if (!newSourceFolder.exists()) {
+	                	newSourceFolder.create( true, true, null );
+	                }
+	                container = newSourceFolder;
+	            }
+	            return container;
+	        } catch (CoreException e) {
+	            Activator.getEasyAntPlugin().log(e);
+	            return null;
+	        }
+	    }
+	
+	private void addClassPathEntry(IJavaProject javaProject, IClasspathEntry newEntry){
+		try {
+        	IClasspathEntry[] entries = javaProject.getRawClasspath();
+            List newEntries = new ArrayList(Arrays.asList(entries));
+            newEntries.add(newEntry);
+            entries = (IClasspathEntry[]) newEntries.toArray(new IClasspathEntry[newEntries.size()]);
+
+            javaProject.setRawClasspath(entries, javaProject.getOutputLocation(), null);
+        } catch (CoreException e) {
+            // unless there are issues with the JDT, this should never happen
+            Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot add ClassPath entry", e);
+        }
+	}
+	
+	private void removeIvyClasspathContainer() {
+		IJavaProject javaProject = JavaCore.create(project);
+		ArrayList<IClasspathEntry> newEntries = new ArrayList<IClasspathEntry>();
+		//FIXME call IvyDE command
+		try {
+			IClasspathEntry[] entries = javaProject.getRawClasspath();
+			for (int i = 0; i < entries.length; i++) {
+				IClasspathEntry entry = entries[i];
+				if (entry != null && entry.getEntryKind() == IClasspathEntry.CPE_CONTAINER) {
+					IPath path = entry.getPath();
+					if (IvyClasspathUtil.isIvyClasspathContainer(path)) {
+						continue;
+					}
+				}
+				newEntries.add(entry);
+			}
+			// TODO add progress monitor
+			IClasspathEntry[] newClasspathEntries = newEntries.toArray(new IClasspathEntry[newEntries.size()]);
+			javaProject.setRawClasspath(newClasspathEntries, null);
+		} catch (JavaModelException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot remove Ivy ClassPath container", e);
+		}
+	}
+
+	private void addBuilder(String builderID) throws CoreException {
+		if (!isBuilderApplied(builderID)) {
+			IProjectDescription description = getProject().getDescription();
+			ICommand[] commands = description.getBuildSpec();
+			ICommand command = description.newCommand();
+			command.setBuilderName(builderID);
+			ICommand[] newCommands = new ICommand[commands.length + 1];
+			System.arraycopy(commands, 0, newCommands, 0, commands.length);
+			newCommands[commands.length] = command;
+			description.setBuildSpec(newCommands);
+			getProject().setDescription(description, null);
+		}
+	}
+
+	private void removeBuilder(String builderID) throws CoreException {
+		if (isBuilderApplied(builderID)) {
+			IProjectDescription description = getProject().getDescription();
+			ICommand[] commands = description.getBuildSpec();
+			ICommand[] newCommands = new ICommand[commands.length - 1];
+			int i = 0;
+			for (ICommand command : commands) {
+				if (command.getBuilderName().equals(builderID)) {
+					// Remove the given builder
+				} else {
+					newCommands[i] = command;
+					i++;
+				}
+			}
+			description.setBuildSpec(newCommands);
+			getProject().setDescription(description, null);
+		}
+	}
+
+	private boolean isBuilderApplied(String builderID) throws CoreException {
+		IProjectDescription description = getProject().getDescription();
+		for (ICommand cmd : description.getBuildSpec()) {
+			if (cmd.getBuilderName().equals(builderID)) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/natures/RemoveEasyAntNatureAction.java b/org.apache.easyant4e/src/org/apache/easyant4e/natures/RemoveEasyAntNatureAction.java
new file mode 100644
index 0000000..3eda15b
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/natures/RemoveEasyAntNatureAction.java
@@ -0,0 +1,80 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.natures;
+
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.services.EasyantProjectService;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IObjectActionDelegate;
+import org.eclipse.ui.IWorkbenchPart;
+
+import com.google.inject.Inject;
+
+//import com.google.inject.Inject;
+
+/**
+ * Remove the EasyAnt nature to the project.
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class RemoveEasyAntNatureAction implements IObjectActionDelegate {
+
+	// The selected project
+	private IProject selectedProject;
+	private EasyantProjectService easyantProjectService;
+
+	public RemoveEasyAntNatureAction(){
+		Activator.getEasyAntPlugin().injectMembers(this);
+	}
+	
+	@Inject
+	public void setEasyantProjectService(EasyantProjectService easyantProjectService) {
+		this.easyantProjectService = easyantProjectService;
+	}
+
+	public void setActivePart(IAction action, IWorkbenchPart targetPart) {
+	}
+
+	public void run(IAction action) {
+		if (selectedProject != null) {
+			// Remove the nature on the selected project
+			easyantProjectService.removeNature(selectedProject);
+		}
+	}
+
+	public void selectionChanged(IAction action, ISelection selection) {
+		if (selection instanceof StructuredSelection) {
+			StructuredSelection structuredSelection = (StructuredSelection) selection;
+			if (!structuredSelection.isEmpty() && structuredSelection.getFirstElement() instanceof IProject) {
+				IProject project = (IProject) structuredSelection.getFirstElement();
+				if (project.isAccessible()) {
+					this.selectedProject = project;
+					if (action != null) {
+						action.setEnabled(easyantProjectService.hasEasyAntNature(project));
+					}
+				}
+
+			}
+		}
+	}
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/natures/RemoveEasyAntNatureOperation.java b/org.apache.easyant4e/src/org/apache/easyant4e/natures/RemoveEasyAntNatureOperation.java
new file mode 100644
index 0000000..751dece
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/natures/RemoveEasyAntNatureOperation.java
@@ -0,0 +1,70 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.natures;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+
+import org.apache.easyant4e.Activator;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+
+/**
+ * Remove the EasyAnt nature to the project.
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class RemoveEasyAntNatureOperation implements IRunnableWithProgress {
+
+	private IProject project;
+
+	public RemoveEasyAntNatureOperation(IProject project) {
+		this.project = project;
+	}
+
+	@SuppressWarnings("unchecked")
+	public void run(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+		if (project != null) {
+			try {
+				if (project.getNature(EasyAntNature.NATURE_ID) != null) {
+					monitor.subTask("Remove the EasyAnt nature to the project " + project.getName());
+					IProjectDescription description = project.getDescription();
+					String[] oldNatures = description.getNatureIds();
+					ArrayList newNatures = new ArrayList();
+					for (int i = 0; i < oldNatures.length; i++) {
+						if (!oldNatures[i].equals(EasyAntNature.NATURE_ID)) {
+							newNatures.add(oldNatures[i]);
+						}
+					}
+					description.setNatureIds((String[]) newNatures.toArray(new String[newNatures.size()]));
+					project.setDescription(description, new SubProgressMonitor(monitor, 1));
+				}
+			} catch (CoreException e) {
+				Activator.getEasyAntPlugin().log(e);
+			}
+			monitor.done();
+		}
+
+	}
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/providers/ImageProvider.java b/org.apache.easyant4e/src/org/apache/easyant4e/providers/ImageProvider.java
new file mode 100644
index 0000000..b0f9aa6
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/providers/ImageProvider.java
@@ -0,0 +1,46 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.providers;
+
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.swt.graphics.Image;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public interface ImageProvider {
+
+	ImageDescriptor getConsoleImageDescriptor();
+
+	ImageDescriptor getLogoImageDescriptor();
+	
+	Image getPhaseImage();
+	
+	Image getTargetImage();
+	
+	Image getFormBackgroundImage();
+	
+	Image getBuildImage();
+	
+	ImageDescriptor getInfoLogLevelImage();
+	
+	ImageDescriptor getDebugLogLevelImage();
+	
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/providers/ImageProviderImpl.java b/org.apache.easyant4e/src/org/apache/easyant4e/providers/ImageProviderImpl.java
new file mode 100644
index 0000000..4430164
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/providers/ImageProviderImpl.java
@@ -0,0 +1,133 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.providers;
+
+import java.net.URL;
+
+import org.apache.easyant4e.Activator;
+import org.eclipse.core.runtime.FileLocator;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.jface.resource.ImageDescriptor;
+import org.eclipse.jface.resource.ImageRegistry;
+import org.eclipse.swt.graphics.Image;
+import org.osgi.framework.Bundle;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class ImageProviderImpl implements ImageProvider {
+
+	public static final String IMG_HORIZONTAL = "horizontal";
+
+	public static final String IMG_FORM_BG = "formBg";
+
+	public static final String IMG_PHASE = "phase";
+
+	public static final String IMG_TARGET = "target";
+
+	public static final String IMG_CONSOLE = "console";
+
+	public static final String IMG_BUILD = "build";
+
+	public static final String IMG_EASYANT_LOGO = "easyant-logo";
+	
+	public static final String IMG_INFO_LOG_LEVEL = "info-log-level";
+	
+	public static final String IMG_DEBUG_LOG_LEVEL = "debug-log-level";
+
+	public ImageProviderImpl() {		
+		initializeImageRegistry(getImageRegistry());
+	}
+
+	public ImageDescriptor getConsoleImageDescriptor() {
+		return getImageDescriptor(IMG_CONSOLE);
+	}
+	public ImageDescriptor getLogoImageDescriptor() {
+		return getImageDescriptor(IMG_EASYANT_LOGO);
+	}
+
+	public Image getPhaseImage(){
+		return getImage(IMG_PHASE);
+	}
+	
+	public Image getTargetImage(){
+		return getImage(IMG_TARGET);
+	}
+	
+	public Image getFormBackgroundImage(){
+		return getImage(IMG_FORM_BG);
+	}
+	
+	public Image getBuildImage(){
+		return getImage(IMG_BUILD);
+	}
+	
+	public ImageDescriptor getInfoLogLevelImage(){
+		return getImageDescriptor(IMG_INFO_LOG_LEVEL);
+	}
+	
+	public ImageDescriptor getDebugLogLevelImage(){
+		return getImageDescriptor(IMG_DEBUG_LOG_LEVEL);
+	}
+	
+	private void initializeImageRegistry(ImageRegistry registry) {
+		registerImage(registry, IMG_FORM_BG, "form_banner.gif");
+		registerImage(registry, IMG_PHASE, "phase.gif");
+		registerImage(registry, IMG_TARGET, "target.gif");
+		registerImage(registry, IMG_CONSOLE, "console.png");
+		registerImage(registry, IMG_BUILD, "build.gif");
+		registerImage(registry, IMG_EASYANT_LOGO, "EasyAnt-logo.gif");
+		registerImage(registry, IMG_INFO_LOG_LEVEL, "info_loglevel.gif");
+		registerImage(registry, IMG_DEBUG_LOG_LEVEL, "debug_loglevel.gif");	
+	}
+
+	private void registerImage(ImageRegistry registry, String key, String fileName) {
+		try {
+			Bundle bundle = Platform.getBundle(Activator.PLUGIN_ID);
+			IPath path = new Path("icons/" + fileName);
+			URL url = FileLocator.find(bundle, path, null);
+			if (url != null) {
+				ImageDescriptor desc = ImageDescriptor.createFromURL(url);
+				registry.put(key, desc);
+			}
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}
+	}
+
+	private Image getImage(String key) {
+		return getImageRegistry().get(key);
+	}
+	
+	private ImageDescriptor getImageDescriptor(String key) {
+		 return getImageRegistry().getDescriptor(key);
+	}
+	
+	private ImageRegistry getImageRegistry() {
+		return Activator.getDefault().getImageRegistry();
+	}
+
+
+	
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantCoreService.java b/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantCoreService.java
new file mode 100644
index 0000000..10f8676
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantCoreService.java
@@ -0,0 +1,47 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.services;
+
+import java.util.List;
+
+import org.apache.easyant.core.descriptor.PropertyDescriptor;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public interface EasyantCoreService {
+	
+	String getPluginsRepositoryPath();
+	
+	/**
+	 * Install the local plugins repository
+	 */
+	void installPluginsRepository();
+	
+	String[] getAllCoreBuildTypes();
+	
+	String[] getAllCorePlugins();
+	
+	List<PropertyDescriptor> getPropertiesForBuildType(String buildTypeName);
+
+	String getBuildTypeDescription(String buildTypeName);
+
+	String getPluginDescription(String pluginName);
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantCoreServiceImpl.java b/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantCoreServiceImpl.java
new file mode 100644
index 0000000..227badc
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantCoreServiceImpl.java
@@ -0,0 +1,210 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.services;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URL;
+import java.text.ParseException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.apache.easyant.core.EasyAntConfiguration;
+import org.apache.easyant.core.EasyAntEngine;
+import org.apache.easyant.core.descriptor.PropertyDescriptor;
+import org.apache.easyant.core.factory.EasyantConfigurationFactory;
+import org.apache.easyant.core.report.EasyAntReport;
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.ivyde.extension.RepositoryInstaller;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.IStatus;
+
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_BUILD_TYPES_ORG;
+import static org.apache.easyant4e.EasyAntConstants.EASYANT_BUILD_PLUGINS_ORG;
+import static org.apache.easyant4e.EasyAntConstants.PLUGINS_SETTINGS;
+
+import com.google.inject.Inject;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyantCoreServiceImpl implements EasyantCoreService {
+
+	//TODO a déplacer dans pluginService
+	//TODO et ne pas recharger les settings à chaque fois ... faire un push du contexte
+	//TODO read workspace preference and project preference to Get the good Ivy instance for the EasyAnt Core
+	//IvySettings ivySettings = createIvySettingsForEACore(project);
+	//Ivy ivy = Ivy.newInstance(ivySettings);
+	//ivySettings.addRepositoryCacheManager(getRepositoryCacheManager());
+	//ivySettings.setBaseDir(getBaseDir(project));
+	
+/*
+	public Ivy getIvyInstance() {	
+		URL url = Activator.getDefault().getBundle().getResource(PLUGINS_SETTINGS);		
+		Ivy ivy = IvyContext.getContext().getIvy();
+		try{
+			ivy.configure(url);
+		} catch (ParseException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot parse EasyAnt Ivy settings file: " + url, e);
+		} catch (IOException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot read EasyAnt Ivy settings file: " + url, e);
+		}
+		IvySettings ivySettings = ivy.getSettings();
+		IvyContext ivyContext = IvyContext.pushNewContext();
+		ivyContext.setIvy(ivy);
+		return ivy;
+	}
+	*/
+	
+/*
+	private IvySettings createIvySettingsForEACore(IProject project) {
+		// Ivy ivy = IvyContext.pushNewCopyContext().getIvy();
+		// IvySettings ivySettings = ivy.getSettings();
+		IvySettings ivySettings = new IvySettings();
+
+		URL url = Activator.getDefault().getBundle().getResource(PLUGINS_SETTINGS);
+		try {
+			ivySettings.load(url);
+		} catch (ParseException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot parse EasyAnt Ivy settings file: " + url, e);
+		} catch (IOException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot read EasyAnt Ivy settings file: " + url, e);
+		}
+		//ivySettings.addRepositoryCacheManager(getRepositoryCacheManager());
+		ivySettings.setBaseDir(getBaseDir(project));
+		
+		return ivySettings;
+	}
+*/
+
+	public static final String CACHE_FILE = "easyant4e-cache-manager";
+	public static final String CACHE_NAME = "__easyant4e-cache-manager";
+
+/*	
+	// FIXME connect this on project instance
+	private static RepositoryCacheManager getRepositoryCacheManager() {
+		DefaultRepositoryCacheManager cacheManager = new DefaultRepositoryCacheManager();
+		BundleContext bundleContext = IvyPlugin.getDefault().getBundleContext();
+		cacheManager.setBasedir(bundleContext.getDataFile(CACHE_FILE));
+		cacheManager.setCheckmodified(true);
+		cacheManager.setUseOrigin(true);
+		cacheManager.setName(WorkspaceResolver.CACHE_NAME);
+		return cacheManager;
+	}
+*/
+	private EasyAntEngine easyAntEngine;
+	
+	@Inject
+	public void setEasyAntEngine(EasyAntEngine easyAntEngine){
+		this.easyAntEngine = easyAntEngine;
+	}
+	
+	//private static File getBaseDir(IProject project) {
+	//	return project.getLocation().toFile();
+	//}
+
+	public String getPluginsRepositoryPath() {
+		return pluginsRepository.getPath();
+	}
+
+	private File pluginsRepository;
+
+	public void installPluginsRepository() {
+		String userHome = System.getProperty("user.home");
+		File easyAntHome = new File(userHome, ".easyant");
+		if (!easyAntHome.exists()) {
+			boolean created = easyAntHome.mkdir();
+			if (!created) {
+				Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot create directory: " + easyAntHome);
+			}
+		}
+		this.pluginsRepository = new File(easyAntHome, "easyant-repository");
+		installLocalRepository();
+	}
+
+	private void installLocalRepository() {
+		if (!pluginsRepository.exists()) {
+			boolean created = pluginsRepository.mkdir();
+			if (!created) {
+				Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot create directory: " + pluginsRepository);
+			} else {
+				// populate the repository from the plugin
+				// TODO read preference to override default ivysettings.xml use
+				// to
+				// resolve build plugins
+				RepositoryInstaller repositoryInstaller = new RepositoryInstaller();
+				repositoryInstaller.install(pluginsRepository);
+			}
+		}
+		// HashMap<String, String> variables = new HashMap<String, String>();
+		// variables.put("easyant.repo.dir", pluginsRepository.getPath());
+		// ivySettings.addAllVariables(variables);
+	}
+
+	public String[] getAllCoreBuildTypes() {
+		try {
+			//getIvyInstance(null);
+			return easyAntEngine.getPluginService().searchModule(EASYANT_BUILD_TYPES_ORG, "*");
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}
+		return null;
+	}
+
+	public String[] getAllCorePlugins() {
+		try {
+			//getIvyInstance(null);
+			return easyAntEngine.getPluginService().searchModule(EASYANT_BUILD_PLUGINS_ORG, "*");
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}
+		return null;
+	}
+	
+	public List<PropertyDescriptor> getPropertiesForBuildType(String buildTypeName){
+		//getIvyInstance(null);
+		ArrayList<PropertyDescriptor> propertyDescriptors = new ArrayList<PropertyDescriptor>();
+		EasyAntReport eaReport = null;
+		try {
+			eaReport = easyAntEngine.getPluginService().getBuildTypeInfo(buildTypeName);
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}
+		if (eaReport != null) {
+			Map<String, PropertyDescriptor> properties = eaReport.getAvailableProperties();
+			for (Entry<String, PropertyDescriptor> entry : properties.entrySet()) {
+				PropertyDescriptor prop = entry.getValue();
+				propertyDescriptors.add(prop);
+			}
+		}
+		return propertyDescriptors;
+	}
+
+	public String getBuildTypeDescription(String buildTypeName) {
+		return easyAntEngine.getPluginService().getBuildTypeDescription(buildTypeName);
+	}
+
+	public String getPluginDescription(String pluginName) {
+		return easyAntEngine.getPluginService().getPluginDescription(pluginName);
+	}
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectService.java b/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectService.java
new file mode 100644
index 0000000..65333d7
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectService.java
@@ -0,0 +1,79 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.services;
+
+import java.io.File;
+import java.util.List;
+import java.util.Map;
+
+import org.apache.easyant.core.descriptor.EasyAntModuleDescriptor;
+import org.apache.easyant.core.descriptor.PropertyDescriptor;
+import org.apache.easyant.core.report.PhaseReport;
+import org.apache.easyant.core.report.TargetReport;
+import org.apache.easyant4e.EasyAntConstants;
+//import org.apache.ivy.Ivy;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.swt.widgets.Shell;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public interface EasyantProjectService {
+
+	//Ivy getIvyInstance(IProject project);
+	
+	IProject importProject(IProjectDescription projectDescription, Shell messageShell, IProgressMonitor monitor);
+	
+	boolean hasEasyAntNature(IProject project);
+	
+	boolean hasEasyAntBuilder(IProject project);
+	
+	void addNature(IProject project);
+	
+	void removeNature(IProject project);
+	
+	/**
+	 * @param project
+	 * @param buildTaskName
+	 * @param logLevel @see {@link EasyAntConstants#ANT_LOGLEVEL_DEBUG}, ...
+	 * @param monitor
+	 */
+	void runBuild(IProject project, String buildTaskName, int logLevel, IProgressMonitor monitor);
+	
+	/**
+	 * @return a list of available phases
+	 */
+	List<PhaseReport> getPhases(IFile ivyFile);
+	
+	/**
+	 * @return a list of available targets
+	 */
+	List<TargetReport> getTargets(IFile ivyFile);
+	
+	EasyAntModuleDescriptor getEasyAntModuleDescriptor(File file);
+	
+	Map<String, PropertyDescriptor> getProperties(IProject project);
+	
+	PropertyDescriptor getProperty(IProject project, String name);
+	
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectServiceImpl.java b/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectServiceImpl.java
new file mode 100644
index 0000000..14d826c
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/services/EasyantProjectServiceImpl.java
@@ -0,0 +1,378 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.services;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PrintStream;
+import java.lang.reflect.InvocationTargetException;
+import java.net.URL;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+import java.util.Vector;
+
+import org.apache.easyant.core.EasyAntConfiguration;
+import org.apache.easyant.core.EasyAntEngine;
+import org.apache.easyant.core.EasyAntMagicNames;
+import org.apache.easyant.core.descriptor.EasyAntModuleDescriptor;
+import org.apache.easyant.core.descriptor.PropertyDescriptor;
+import org.apache.easyant.core.factory.EasyantConfigurationFactory;
+import org.apache.easyant.core.report.EasyAntReport;
+import org.apache.easyant.core.report.PhaseReport;
+import org.apache.easyant.core.report.TargetReport;
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.EasyAntConstants;
+import org.apache.easyant4e.EasyAntPlugin;
+import org.apache.easyant4e.console.EasyAntConsole;
+import org.apache.easyant4e.natures.AddEasyAntNatureOperation;
+import org.apache.easyant4e.natures.EasyAntNature;
+import org.apache.easyant4e.natures.RemoveEasyAntNatureOperation;
+import org.eclipse.core.resources.ICommand;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.ui.PlatformUI;
+import org.eclipse.ui.dialogs.IOverwriteQuery;
+import org.eclipse.ui.wizards.datatransfer.FileSystemStructureProvider;
+import org.eclipse.ui.wizards.datatransfer.ImportOperation;
+
+import com.google.inject.Inject;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyantProjectServiceImpl implements EasyantProjectService{
+
+	private EasyAntConsole console;
+	
+	private EasyantCoreService easyantCoreService;
+	
+	private EasyAntEngine easyAntEngine;
+	
+	@Inject
+	public void setEasyAntEngine(EasyAntEngine easyAntEngine){
+		this.easyAntEngine = easyAntEngine;
+	}
+
+	@Inject
+	public void setEasyantCoreService(EasyantCoreService easyantCoreService) {
+		this.easyantCoreService = easyantCoreService;
+	}
+
+	@Inject 
+	public void setEasyAntConsole(EasyAntConsole console) {
+		this.console = console;
+	}
+
+/*	
+	public Ivy getIvyInstance(IProject project) {
+		//TODO read workspace and project preference to load good Ivy instance must be used by the given project
+		return easyantCoreService.getIvyInstance(project);// by default return the ivy instance used by Easyant core
+	}
+*/
+	public void runBuild(IProject project, String buildTaskName, int logLevel, IProgressMonitor monitor) {
+		console.show();
+		console.info("\n");
+		console.info(project.getName() + "$ easyant " + buildTaskName+"\n");
+		
+		IFile ivyFile = project.getFile("module.ivy");
+		String ivyFilePath = ivyFile.getLocation().toOSString();
+		File buildModule = new File(ivyFilePath);
+		
+		URL easyantIvySettingsUrl = Activator.getDefault().getBundle().getResource(EasyAntConstants.PLUGINS_SETTINGS);
+		
+		Properties properties = new Properties();
+		properties.put("basedir",project.getLocation().toOSString());
+		properties.put("build.compiler", "org.eclipse.jdt.core.JDTCompilerAdapter");
+		properties.put("easyant.modules.dir", easyantCoreService.getPluginsRepositoryPath());
+				
+		//junit plugin under eclipse
+		//if property is true : Forked Java VM exited abnormally. Please note the time in the report does not reflect the time until the VM exit.
+		properties.put("test.run.fork", "false");
+		
+		EasyAntConfiguration configuration = EasyantConfigurationFactory.getInstance().createDefaultConfiguration();
+		configuration.setShowMemoryDetails(true);
+		//configuration.setBuildFile(buildFile); //TODO manage module.ant file
+		configuration.setBuildModule(buildModule);
+		configuration.setDefinedProps(properties);
+		configuration.setMsgOutputLevel(logLevel);
+		Vector<String> targets = new Vector<String>();
+		targets.add(buildTaskName);
+		configuration.setTargets(targets);
+		configuration.setEasyantIvySettingsUrl(easyantIvySettingsUrl.toString());
+		
+		PrintStream outStream = getConsoleOutStream();
+		configuration.setOut(outStream);
+		
+		PrintStream errStream = getConsoleErrStream();
+		configuration.setErr(errStream);
+		
+		//TODO lancer cela dans une WorkspaceModifyOperation
+		try{
+			EasyAntEngine.runBuild(configuration);
+		}catch (Exception be) {
+			Activator.getEasyAntPlugin().log(IStatus.WARNING, be.getMessage());
+		}
+		
+		outStream.close();
+		errStream.close();
+		
+	}
+
+	private PrintStream getConsoleOutStream(){		
+		console.show(true);
+		return new PrintStream(new OutputStream(){
+			private StringBuffer sb = new StringBuffer();
+			@Override
+			public void write(int b) throws IOException {
+				if(b!=10){
+					sb.append((char)b);
+				}else{
+					String message = sb.toString();
+					console.info(message);
+					sb = new StringBuffer();
+				}				
+			}
+			
+		});
+	}
+
+	private PrintStream getConsoleErrStream(){		
+		console.show(true);
+		return new PrintStream(new OutputStream(){
+			private StringBuffer sb = new StringBuffer();
+			@Override
+			public void write(int b) throws IOException {
+				if(b!=10){
+					sb.append((char)b);
+				}else{
+					String message = sb.toString();
+					console.error(message);
+					sb = new StringBuffer();
+				}				
+			}
+			
+		});
+	}
+
+	public boolean hasEasyAntNature(IProject project){
+		try {
+			return project.hasNature(EasyAntNature.NATURE_ID);
+		} catch (CoreException e) {
+			Activator.getEasyAntPlugin().log(e);
+		}
+		return false;
+	}
+	
+	public boolean hasEasyAntBuilder(IProject project){
+		ICommand[] commands=null;
+		try {
+			commands = project.getProject().getDescription().getBuildSpec();
+		} catch (CoreException e) {
+			Activator.getEasyAntPlugin().log(e);
+		}		
+		boolean found = false;
+		if(commands!=null){		
+			for (int i = 0; i < commands.length; ++i) {
+				if (commands[i].getBuilderName().equals(EasyAntNature.BUILDER_ID)){
+					found = true;
+				}
+			}	
+		}	
+		return found;
+	}
+	
+
+	public void addNature(IProject project) {
+		addNature(project, null, null);	
+	}
+	
+	private void addNature(IProject project, Shell shell, IProgressMonitor monitor) {
+
+		AddEasyAntNatureOperation addNature = new AddEasyAntNatureOperation(project);
+		try {
+			if(shell==null && monitor==null){
+				PlatformUI.getWorkbench().getProgressService().run(false, false, addNature);
+			}else{
+				addNature.run(monitor);
+			}
+		} catch (InvocationTargetException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot add EasyAnt nature.", e);
+		} catch (InterruptedException e) {
+			Activator.getEasyAntPlugin().log(IStatus.CANCEL, "Add EasyAnt nature operation aborted!", e);
+		}
+		// TODO launch resolve (ask to user)
+		// TODO initialize IvyDE classpath container
+		// TODO maybe launch the first build ??	
+	}
+	
+	public void removeNature(IProject project) {
+		// Remove the nature on the given project
+		RemoveEasyAntNatureOperation removeNature = new RemoveEasyAntNatureOperation(project);
+		try {
+			PlatformUI.getWorkbench().getProgressService().run(false, false, removeNature);
+		} catch (InvocationTargetException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot remove EasyAnt nature.", e);
+		} catch (InterruptedException e) {
+			Activator.getEasyAntPlugin().log(IStatus.CANCEL, "Remove EasyAnt nature operation aborted!", e);
+		}
+		// TODO remove IvyDE classpath container
+		
+	}
+
+	public IProject importProject(IProjectDescription projectDescription,  Shell messageShell, IProgressMonitor monitor) {
+		//String projectName = importProjectDescriptor.getProjectName();
+		//IProjectDescription projectDescription = importProjectDescriptor.getDescription();
+		String projectName = projectDescription.getName();
+		final IWorkspace workspace = ResourcesPlugin.getWorkspace();
+		final IProject project = workspace.getRoot().getProject(projectName);
+//		if (projectDescription == null) {
+//			// error case
+//			projectDescription = workspace.newProjectDescription(projectName);
+//			IPath locationPath = new Path(importProjectDescriptor.getProjectSystemFile().getAbsolutePath());
+//
+//			// If it is under the root use the default location
+//			if (Platform.getLocation().isPrefixOf(locationPath)) {
+//				projectDescription.setLocation(null);
+//			} else {
+//				projectDescription.setLocation(locationPath);
+//			}
+//		} else {
+//			projectDescription.setName(projectName);
+//		}
+
+//		if (importProjectDescriptor.isFromIvyDescription()) {
+			// import form Ivy description
+			File importSource = new File(projectDescription.getLocationURI());
+			IWorkspaceRoot rootWorkspace = workspace.getRoot();
+			ImportOperation importOperation = new ImportOperation(rootWorkspace.getFullPath(),importSource,FileSystemStructureProvider.INSTANCE, new IOverwriteQuery(){
+					public String queryOverwrite(String pathString) { return ALL; }
+			});
+			importOperation.setContext(messageShell);
+			try {
+				//PlatformUI.getWorkbench().getProgressService().run(false, false, importOperation);
+				importOperation.run(monitor);
+			} catch (InvocationTargetException e) {
+				Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot import project.", e);
+			} catch (InterruptedException e) {
+				Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot import project.", e);
+			}			
+//		}
+
+		try {
+			monitor.beginTask("Creating project ...", 100);
+			project.create(projectDescription, new SubProgressMonitor(monitor, 30));
+			project.open(IResource.BACKGROUND_REFRESH, new SubProgressMonitor(monitor, 70));
+			// configure project, apply EasyAnt nature
+//			if (importProjectDescriptor.isFromIvyDescription()) {
+				addNature(project, messageShell, monitor);
+//			}
+		} catch (CoreException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, "Cannot configure imported project.", e);
+			return null;
+		} finally {
+			monitor.done();		
+		}
+		return project;
+		
+	}
+	
+	public List<PhaseReport> getPhases(IFile ivyFile) {
+		EasyAntReport easyAntReport = null;
+		try {
+			//loadEasyAntIvySettings(ivyFile.getProject());
+			File f = new File(ivyFile.getLocation().toPortableString());
+			easyAntReport = easyAntEngine.getPluginService().generateEasyAntReport(f);
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}
+		if (easyAntReport != null) {
+			return easyAntReport.getAvailablePhases();
+		}
+		return Collections.emptyList();
+	}
+
+	//private File getBaseDir(IProject project) {
+	//	return project.getLocation().toFile();
+	//}
+	
+	public List<TargetReport> getTargets(IFile ivyFile) {
+		EasyAntReport easyAntReport = null;
+		try {
+			File f = new File(ivyFile.getLocation().toPortableString());
+			easyAntReport = easyAntEngine.getPluginService().generateEasyAntReport(f);
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}
+		if (easyAntReport != null) {
+			return easyAntReport.getUnboundTargets();
+		}
+		return Collections.emptyList();
+	}
+
+	public EasyAntModuleDescriptor getEasyAntModuleDescriptor(File file) {
+		EasyAntModuleDescriptor moduleDescriptor=null;
+		try {
+			moduleDescriptor = easyAntEngine.getPluginService().getEasyAntModuleDescriptor(file);
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}
+		return moduleDescriptor;
+	}
+	
+	public Map<String, PropertyDescriptor> getProperties(IProject project){
+		IFile ivyFile = project.getFile("module.ivy");
+		String ivyFilePath = ivyFile.getLocation().toOSString();
+		File moduleDescriptor = new File(ivyFilePath);
+		EasyAntReport easyAntReport=null;
+		try {
+			easyAntReport = easyAntEngine.getPluginService().generateEasyAntReport(moduleDescriptor);			
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}				
+		if(easyAntReport!=null){
+			return easyAntReport.getAvailableProperties();
+		}
+		return Collections.emptyMap();
+	}
+	
+	public PropertyDescriptor getProperty(IProject project, String name){
+		Map<String, PropertyDescriptor> properties = getProperties(project);
+		if(properties.containsKey(name)){
+			PropertyDescriptor propertyDescriptor = properties.get(name);			
+			return propertyDescriptor;
+		}else{
+			return null;
+		}
+	}
+	
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizard.java b/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizard.java
new file mode 100644
index 0000000..2e676a5
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizard.java
@@ -0,0 +1,70 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.wizards;
+
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.providers.ImageProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.wizard.Wizard;
+import org.eclipse.ui.IImportWizard;
+import org.eclipse.ui.IWorkbench;
+
+import com.google.inject.Inject;
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyAntImportWizard extends Wizard implements IImportWizard {
+
+	private EasyAntImportWizardPage importPage;
+	
+	private ImageProvider imageProvider;
+	
+	public EasyAntImportWizard(){
+		Activator.getEasyAntPlugin().injectMembers(this);
+	}
+		
+	@Inject
+	public void setImageProvider(ImageProvider imageProvider) {
+		this.imageProvider = imageProvider;
+	}
+
+	@Inject 
+	void setEasyAntImportWizardPage(EasyAntImportWizardPage importPage){
+		this.importPage=importPage;
+	}
+	
+	public void addPages() {
+		//importPage = new EasyAntImportWizardPage();
+		super.addPage(importPage);
+	}
+
+	@Override
+	public boolean performFinish() {
+		return importPage.createProjects();
+	}
+
+	public void init(IWorkbench workbench, IStructuredSelection selection) {
+		setNeedsProgressMonitor(true);
+		setWindowTitle("Import EasyAnt Projects");		
+		setDefaultPageImageDescriptor(imageProvider.getLogoImageDescriptor());
+	}
+
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizardPage.java b/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizardPage.java
new file mode 100644
index 0000000..240c7b3
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/wizards/EasyAntImportWizardPage.java
@@ -0,0 +1,649 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.wizards;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.natures.AddEasyAntNatureOperation;
+import org.apache.easyant4e.services.EasyantProjectService;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspace;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.OperationCanceledException;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.core.runtime.SubProgressMonitor;
+import org.eclipse.jface.dialogs.Dialog;
+import org.eclipse.jface.dialogs.ErrorDialog;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.operation.IRunnableWithProgress;
+import org.eclipse.jface.viewers.CheckStateChangedEvent;
+import org.eclipse.jface.viewers.CheckboxTreeViewer;
+import org.eclipse.jface.viewers.ICheckStateListener;
+import org.eclipse.jface.viewers.ITreeContentProvider;
+import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.Viewer;
+import org.eclipse.jface.viewers.ViewerComparator;
+import org.eclipse.jface.wizard.WizardPage;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.FocusAdapter;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.TraverseEvent;
+import org.eclipse.swt.events.TraverseListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.DirectoryDialog;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.ui.actions.WorkspaceModifyOperation;
+import org.eclipse.ui.dialogs.IOverwriteQuery;
+import org.eclipse.ui.wizards.datatransfer.FileSystemStructureProvider;
+import org.eclipse.ui.wizards.datatransfer.ImportOperation;
+
+import com.google.inject.Inject;
+
+//import com.google.inject.Inject;
+
+/**
+ * This wizard is used to import existing EasyAnt Projects
+ * 
+ * Inspired from WizardProjectsImportPage
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class EasyAntImportWizardPage extends WizardPage {
+	
+	private EasyantProjectService easyantProjectService;
+	
+	@Inject
+	public void setEasyantProjectService(EasyantProjectService easyantProjectService) {
+		this.easyantProjectService = easyantProjectService;
+	}
+
+	public EasyAntImportWizardPage() {
+		super("Import EasyAnt projects");
+		setPageComplete(false);
+		setTitle("Import EasyAnt projects");
+		setDescription("Select a directory to search for existing EasyAnt projects.");
+	}
+
+	/**
+	 * The name of the folder containing metadata information for the workspace.
+	 */
+	public static final String METADATA_FOLDER = ".metadata"; //$NON-NLS-1$
+	//FIXME hard coded the folder name ?
+	public static final String TARGET_FOLDER = "target"; //$NON-NLS-1$
+	
+	
+	private Text directoryPathField;
+
+	private CheckboxTreeViewer projectsList;
+
+	private ProjectRecord[] selectedProjects = new ProjectRecord[0];
+
+	// Keep track of the directory that we browsed to last time
+	// the wizard was invoked.
+	private static String previouslyBrowsedDirectory = ""; //$NON-NLS-1$
+
+	private Button browseDirectoriesButton;
+
+	private IProject[] wsProjects;
+
+	// The last selected path to minimize searches
+	private String lastPath;
+	// The last time that the file or folder at the selected path was modified
+	// to mimize searches
+	private long lastModified;
+
+	/*
+	 * (non-Javadoc)
+	 * 
+	 * @see
+	 * org.eclipse.jface.dialogs.IDialogPage#createControl(org.eclipse.swt.widgets
+	 * .Composite)
+	 */
+	public void createControl(Composite parent) {
+
+		initializeDialogUnits(parent);
+
+		Composite workArea = new Composite(parent, SWT.NONE);
+		setControl(workArea);
+
+		workArea.setLayout(new GridLayout());
+		workArea.setLayoutData(new GridData(GridData.FILL_BOTH | GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL));
+
+		createProjectsRoot(workArea);
+		createProjectsList(workArea);
+		createOptionsArea(workArea);
+		Dialog.applyDialogFont(workArea);
+
+	}
+
+	/**
+	 * Create the area with the extra options.
+	 * 
+	 * @param workArea
+	 */
+	private void createOptionsArea(Composite workArea) {
+		Composite optionsGroup = new Composite(workArea, SWT.NONE);
+		optionsGroup.setLayout(new GridLayout());
+		optionsGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+	}
+
+	/**
+	 * Create the checkbox list for the found projects.
+	 * 
+	 * @param workArea
+	 */
+	private void createProjectsList(Composite workArea) {
+
+		Label title = new Label(workArea, SWT.NONE);		
+		title.setText("EasyAnt Projects:");
+
+		Composite listComposite = new Composite(workArea, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 2;
+		layout.marginWidth = 0;
+		layout.makeColumnsEqualWidth = false;
+		listComposite.setLayout(layout);
+
+		listComposite
+				.setLayoutData(new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH));
+
+		projectsList = new CheckboxTreeViewer(listComposite, SWT.BORDER);
+		GridData listData = new GridData(GridData.GRAB_HORIZONTAL | GridData.GRAB_VERTICAL | GridData.FILL_BOTH);
+		projectsList.getControl().setLayoutData(listData);
+
+		projectsList.setContentProvider(new ITreeContentProvider() {
+			public Object[] getChildren(Object parentElement) {
+				return null;
+			}
+
+			public Object[] getElements(Object inputElement) {
+				return getValidProjects();
+			}
+
+			public boolean hasChildren(Object element) {
+				return false;
+			}
+
+			public Object getParent(Object element) {
+				return null;
+			}
+
+			public void dispose() {
+
+			}
+
+			public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
+			}
+
+		});
+
+		projectsList.setLabelProvider(new LabelProvider() {
+			public String getText(Object element) {
+				return ((ProjectRecord) element).getProjectLabel();
+			}
+		});
+
+		projectsList.addCheckStateListener(new ICheckStateListener() {
+			public void checkStateChanged(CheckStateChangedEvent event) {
+				setPageComplete(projectsList.getCheckedElements().length > 0);
+			}
+		});
+		projectsList.setInput(this);
+		projectsList.setComparator(new ViewerComparator());
+		createSelectionButtons(listComposite);
+	}
+
+	/**
+	 * Create the selection buttons in the listComposite.
+	 * 
+	 * @param listComposite
+	 */
+	private void createSelectionButtons(Composite listComposite) {
+		Composite buttonsComposite = new Composite(listComposite, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.marginWidth = 0;
+		layout.marginHeight = 0;
+		buttonsComposite.setLayout(layout);
+
+		buttonsComposite.setLayoutData(new GridData(GridData.VERTICAL_ALIGN_BEGINNING));
+
+		Button selectAll = new Button(buttonsComposite, SWT.PUSH);
+		selectAll.setText("Select All");
+		selectAll.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				projectsList.setCheckedElements(selectedProjects);
+				setPageComplete(projectsList.getCheckedElements().length > 0);
+			}
+		});
+		Dialog.applyDialogFont(selectAll);
+		setButtonLayoutData(selectAll);
+
+		Button deselectAll = new Button(buttonsComposite, SWT.PUSH);
+		deselectAll.setText("Deselect All");
+		deselectAll.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+
+				projectsList.setCheckedElements(new Object[0]);
+				setPageComplete(false);
+			}
+		});
+		Dialog.applyDialogFont(deselectAll);
+		setButtonLayoutData(deselectAll);
+
+		Button refresh = new Button(buttonsComposite, SWT.PUSH);
+		refresh.setText("Refresh");
+		refresh.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				updateProjectsList(directoryPathField.getText().trim());
+			}
+		});
+		Dialog.applyDialogFont(refresh);
+		setButtonLayoutData(refresh);
+	}
+
+	/**
+	 * Create the area where you select the root directory for the projects.
+	 * 
+	 * @param workArea
+	 *            Composite
+	 */
+	private void createProjectsRoot(Composite workArea) {
+		// project specification group
+		Composite projectGroup = new Composite(workArea, SWT.NONE);
+		GridLayout layout = new GridLayout();
+		layout.numColumns = 3;
+		layout.makeColumnsEqualWidth = false;
+		layout.marginWidth = 0;
+		projectGroup.setLayout(layout);
+		projectGroup.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+
+		// project location entry field
+		this.directoryPathField = new Text(projectGroup, SWT.BORDER);
+
+		this.directoryPathField.setLayoutData(new GridData(GridData.FILL_HORIZONTAL | GridData.GRAB_HORIZONTAL));
+
+		// browse button
+		browseDirectoriesButton = new Button(projectGroup, SWT.PUSH);
+		browseDirectoriesButton.setText("Browse");
+		setButtonLayoutData(browseDirectoriesButton);
+
+		browseDirectoriesButton.addSelectionListener(new SelectionAdapter() {
+			public void widgetSelected(SelectionEvent e) {
+				handleLocationDirectoryButtonPressed();
+			}
+
+		});
+
+		directoryPathField.addTraverseListener(new TraverseListener() {
+			public void keyTraversed(TraverseEvent e) {
+				if (e.detail == SWT.TRAVERSE_RETURN) {
+					e.doit = false;
+					updateProjectsList(directoryPathField.getText().trim());
+				}
+			}
+
+		});
+
+		directoryPathField.addFocusListener(new FocusAdapter() {
+			public void focusLost(org.eclipse.swt.events.FocusEvent e) {
+				updateProjectsList(directoryPathField.getText().trim());
+			}
+
+		});
+	}
+
+	/*
+	 * (non-Javadoc) Method declared on IDialogPage. Set the focus on path
+	 * fields when page becomes visible.
+	 */
+	public void setVisible(boolean visible) {
+		super.setVisible(visible);
+		if (visible) {
+			this.directoryPathField.setFocus();
+		}
+	}
+
+	/**
+	 * Update the list of projects based on path. Method declared public only
+	 * for test suite.
+	 * 
+	 * @param path
+	 */
+	public void updateProjectsList(final String path) {
+		// on an empty path empty selectedProjects
+		if (path == null || path.length() == 0) {
+			setMessage("Import Projects Description");
+			selectedProjects = new ProjectRecord[0];
+			projectsList.refresh(true);
+			projectsList.setCheckedElements(selectedProjects);
+			setPageComplete(projectsList.getCheckedElements().length > 0);
+			lastPath = path;
+			return;
+		}
+
+		final File directory = new File(path);
+		long modified = directory.lastModified();
+		if (path.equals(lastPath) && lastModified == modified) {
+			// since the file/folder was not modified and the path did not
+			// change, no refreshing is required
+			return;
+		}
+
+		lastPath = path;
+		lastModified = modified;
+
+		// We can't access the radio button from the inner class so get the
+		// status beforehand
+		// final boolean dirSelected =
+		// this.projectFromDirectoryRadio.getSelection();
+		try {
+			getContainer().run(true, true, new IRunnableWithProgress() {
+
+				public void run(IProgressMonitor monitor) {
+					monitor.beginTask("Searching", 100);
+					selectedProjects = new ProjectRecord[0];
+					Collection files = new ArrayList();
+					monitor.worked(10);
+					if (directory.isDirectory()) {
+
+						if (!collectProjectFilesFromDirectory(files, directory, null, monitor)) {
+							return;
+						}
+						Iterator filesIterator = files.iterator();
+						selectedProjects = new ProjectRecord[files.size()];
+						int index = 0;
+						monitor.worked(50);
+						monitor.subTask("Processing");
+						while (filesIterator.hasNext()) {
+							File file = (File) filesIterator.next();
+							ProjectRecord projectRecord = new ProjectRecord(file, lastPath);							
+							selectedProjects[index] = projectRecord;
+							index++;
+						}
+					} else {
+						monitor.worked(60);
+					}
+					monitor.done();
+				}
+
+			});
+		} catch (InvocationTargetException e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage());
+		} catch (InterruptedException e) {
+			// Nothing to do if the user interrupts.
+		}
+
+		projectsList.refresh(true);
+		projectsList.setCheckedElements(getValidProjects());
+		if (getValidProjects().length < selectedProjects.length) {
+			setMessage("Projects in workspace", WARNING);
+		} else {
+			setMessage("Import projects description");
+		}
+		setPageComplete(projectsList.getCheckedElements().length > 0);
+	}
+
+	/**
+	 * Display an error dialog with the specified message.
+	 * 
+	 * @param message
+	 *            the error message
+	 */
+	protected void displayErrorDialog(String message) {
+		MessageDialog.openError(getContainer().getShell(), getErrorDialogTitle(), message);
+	}
+
+	/**
+	 * Get the title for an error dialog. Subclasses should override.
+	 */
+	protected String getErrorDialogTitle() {
+		// FIXME
+		return "internalErrorTitle";
+	}
+
+	/**
+	 * Collect the list of .project files that are under directory into files.
+	 * 
+	 * @param files
+	 * @param directory
+	 * @param directoriesVisited
+	 *            Set of canonical paths of directories, used as recursion guard
+	 * @param monitor
+	 *            The monitor to report to
+	 * @return boolean <code>true</code> if the operation was completed.
+	 */
+	private boolean collectProjectFilesFromDirectory(Collection files, File directory, Set directoriesVisited,
+			IProgressMonitor monitor) {
+
+		if (monitor.isCanceled()) {
+			return false;
+		}
+		monitor.subTask("Collect project files from "+ directory.getPath());
+		File[] contents = directory.listFiles();
+		if (contents == null){
+			return false;
+		}
+
+		// Initialize recursion guard for recursive symbolic links
+		if (directoriesVisited == null) {
+			directoriesVisited = new HashSet();
+			try {
+				directoriesVisited.add(directory.getCanonicalPath());
+			} catch (IOException exception) {
+				Activator.getEasyAntPlugin().log(IStatus.ERROR, exception.getMessage(), exception);
+			}
+		}
+		// first look for EasyAnt description files
+		for (int i = 0; i < contents.length; i++) {
+			File file = contents[i];
+			if (file.isFile() && file.getName().endsWith("ivy")) {
+				files.add(file);				
+			}else if (contents[i].isDirectory()) {
+				if (!contents[i].getName().equals(METADATA_FOLDER) && !contents[i].getName().equals(TARGET_FOLDER)) {
+					try {
+						String canonicalPath = contents[i].getCanonicalPath();
+						if (!directoriesVisited.add(canonicalPath)) {
+							// already been here --> do not recurse
+							continue;
+						}
+					} catch (IOException exception) {
+						Activator.getEasyAntPlugin().log(IStatus.ERROR, exception.getMessage(), exception);
+
+					}
+					collectProjectFilesFromDirectory(files, contents[i], directoriesVisited, monitor);
+				}
+			}
+		}
+		return true;
+	}
+	/**
+	 * The browse button has been selected. Select the location.
+	 */
+	protected void handleLocationDirectoryButtonPressed() {
+		DirectoryDialog dialog = new DirectoryDialog(directoryPathField.getShell());
+		dialog.setMessage("Select directory to scan");
+
+		String dirName = directoryPathField.getText().trim();
+		if (dirName.length() == 0) {
+			dirName = previouslyBrowsedDirectory;
+		}
+
+		if (dirName.length() == 0) {
+			dialog.setFilterPath(Activator.getEasyAntPlugin().getPluginWorkspace().getRoot().getLocation().toOSString());
+		} else {
+			File path = new File(dirName);
+			if (path.exists()) {
+				dialog.setFilterPath(new Path(dirName).toOSString());
+			}
+		}
+
+		String selectedDirectory = dialog.open();
+		if (selectedDirectory != null) {
+			previouslyBrowsedDirectory = selectedDirectory;
+			directoryPathField.setText(previouslyBrowsedDirectory);
+			updateProjectsList(selectedDirectory);
+		}
+
+	}
+
+
+	/**
+	 * Create the selected projects
+	 * 
+	 * @return boolean <code>true</code> if all project creations were
+	 *         successful.
+	 */
+	public boolean createProjects() {		
+		final Object[] selected = projectsList.getCheckedElements();
+		WorkspaceModifyOperation op = new WorkspaceModifyOperation() {
+			protected void execute(IProgressMonitor monitor) throws InvocationTargetException, InterruptedException {
+				try {
+					monitor.beginTask("", selected.length); //$NON-NLS-1$
+					if (monitor.isCanceled()) {
+						throw new OperationCanceledException();
+					}
+					for (int i = 0; i < selected.length; i++) {
+						createExistingProject((ProjectRecord) selected[i], new SubProgressMonitor(monitor, 1));
+					}
+				} finally {
+					monitor.done();
+				}
+			}
+		};
+		// run the new project creation operation
+		try {
+			getContainer().run(true, true, op);
+		} catch (InterruptedException e) {
+			return false;
+		} catch (InvocationTargetException e) {
+			// one of the steps resulted in a core exception
+			Throwable t = e.getTargetException();
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, t.getMessage(), t);
+			String message = "Cannot import project";
+			IStatus status;
+			if (t instanceof CoreException) {
+				status = ((CoreException) t).getStatus();
+			} else {
+				status = new Status(IStatus.ERROR, Activator.PLUGIN_ID, 1, message, t);
+			}
+			ErrorDialog.openError(getShell(), message, null, status);
+			return false;
+		}
+		return true;
+	}
+
+	/**
+	 * Create the project described in record. If it is successful return true.
+	 * 
+	 * @param record
+	 * @return boolean <code>true</code> if successful
+	 * @throws InterruptedException
+	 */
+	private IProject createExistingProject(final ProjectRecord record, IProgressMonitor monitor)
+			throws InvocationTargetException, InterruptedException {		
+		return easyantProjectService.importProject(record.getDescription(), getShell(), monitor);
+	}
+
+	/**
+	 * Method used for test suite.
+	 * 
+	 * @return CheckboxTreeViewer the viewer containing all the projects found
+	 */
+	public CheckboxTreeViewer getProjectsList() {
+		return projectsList;
+	}
+
+	/**
+	 * Retrieve all the projects in the current workspace.
+	 * 
+	 * @return IProject[] array of IProject in the current workspace
+	 */
+	private IProject[] getProjectsInWorkspace() {
+		if (wsProjects == null) {
+			wsProjects = Activator.getEasyAntPlugin().getPluginWorkspace().getRoot().getProjects();
+		}
+		return wsProjects;
+	}
+
+	/**
+	 * Get the array of valid project records that can be imported from the
+	 * source workspace or archive, selected by the user. If a project with the
+	 * same name exists in both the source workspace and the current workspace,
+	 * it will not appear in the list of projects to import and thus cannot be
+	 * selected for import.
+	 * 
+	 * Method declared public for test suite.
+	 * 
+	 * @return ProjectRecord[] array of projects that can be imported into the
+	 *         workspace
+	 */
+	public ProjectRecord[] getValidProjects() {
+		List validProjects = new ArrayList();
+		for (int i = 0; i < selectedProjects.length; i++) {
+			if (!isProjectInWorkspace(selectedProjects[i].getProjectName())) {
+				validProjects.add(selectedProjects[i]);
+			}
+		}
+		return (ProjectRecord[]) validProjects.toArray(new ProjectRecord[validProjects.size()]);
+	}
+
+	/**
+	 * Determine if the project with the given name is in the current workspace.
+	 * 
+	 * @param projectName
+	 *            String the project name to check
+	 * @return boolean true if the project with the given name is in this
+	 *         workspace
+	 */
+	private boolean isProjectInWorkspace(String projectName) {
+		if (projectName == null) {
+			return false;
+		}
+		IProject[] workspaceProjects = getProjectsInWorkspace();
+		for (int i = 0; i < workspaceProjects.length; i++) {
+			if (projectName.equals(workspaceProjects[i].getName())) {
+				return true;
+			}
+		}
+		return false;
+	}
+	
+}
diff --git a/org.apache.easyant4e/src/org/apache/easyant4e/wizards/ProjectRecord.java b/org.apache.easyant4e/src/org/apache/easyant4e/wizards/ProjectRecord.java
new file mode 100644
index 0000000..cb945be
--- /dev/null
+++ b/org.apache.easyant4e/src/org/apache/easyant4e/wizards/ProjectRecord.java
@@ -0,0 +1,155 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
+package org.apache.easyant4e.wizards;
+
+import java.io.File;
+
+import org.apache.easyant.core.descriptor.EasyAntModuleDescriptor;
+import org.apache.easyant4e.Activator;
+import org.apache.easyant4e.services.EasyantProjectService;
+import org.eclipse.core.resources.IProjectDescription;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.Platform;
+
+import com.google.inject.Inject;
+
+
+/**
+ * 
+ * @author <a href="mailto:jerome@benois.fr">Jerome Benois</a>
+ */
+public class ProjectRecord {
+	
+	private EasyantProjectService easyantProjectService;
+	
+	private String lastPath;
+	
+	private File projectSystemFile;
+
+	public File getProjectSystemFile() {
+		return projectSystemFile;
+	}
+
+	private String projectName;
+
+	private boolean fromIvyDescription = false;
+
+	private IProjectDescription description;
+
+	public IProjectDescription getDescription() {
+		return description;
+	}
+
+	@Inject
+	public void setEasyantProjectService(EasyantProjectService easyantProjectService){
+		this.easyantProjectService = easyantProjectService;
+	}
+
+	/**
+	 * Create a record for a project based on the info in the file.
+	 * 
+	 * @param file
+	 */
+	ProjectRecord(File file, String lastPath) {
+		Activator.getEasyAntPlugin().injectMembers(this);
+		this.projectSystemFile = file;
+		this.lastPath = lastPath;
+		setProjectName();
+	}
+
+	/**
+	 * Set the name of the project based on the projectFile.
+	 */
+	private void setProjectName() {
+		try {
+			// If we don't have the project name try again
+			IPath path = new Path(projectSystemFile.getPath());
+			if (projectName == null && !path.toOSString().endsWith("ivy")) {
+				// if the file is in the default location, use the directory
+				// name as the project name
+				if (isDefaultLocation(path)) {
+					projectName = path.segment(path.segmentCount() - 2);
+					description = Activator.getEasyAntPlugin().getPluginWorkspace().newProjectDescription(projectName);
+				} else {
+					description = Activator.getEasyAntPlugin().getPluginWorkspace().loadProjectDescription(path);
+					projectName = description.getName();
+				}
+
+			} else if (path.toOSString().endsWith("ivy")) {
+				fromIvyDescription = true;
+				// Load EasyantFile
+				File f = new File(path.toPortableString());
+				EasyAntModuleDescriptor moduleDescriptor = easyantProjectService.getEasyAntModuleDescriptor(f);
+				projectName = moduleDescriptor.getName();
+				description = Activator.getEasyAntPlugin().getPluginWorkspace().newProjectDescription(projectName);					
+				if(lastPath.endsWith(projectName)){
+					description.setLocation(new Path(lastPath));
+				}else{
+					description.setLocation(new Path(lastPath+"/"+ projectName));
+				}
+				description.setComment(moduleDescriptor.getDescription());
+				String[] newNatures= {};
+				description.setNatureIds(newNatures);					
+			}
+		} catch (Exception e) {
+			Activator.getEasyAntPlugin().log(IStatus.ERROR, e.getMessage(), e);
+		}
+	}
+
+	/**
+	 * Returns whether the given project description file path is in the
+	 * default location for a project
+	 * 
+	 * @param path
+	 *            The path to examine
+	 * @return Whether the given path is the default location for a project
+	 */
+	private boolean isDefaultLocation(IPath path) {
+		// The project description file must at least be within the project,
+		// which is within the workspace location
+		if (path.segmentCount() < 2)
+			return false;
+		return path.removeLastSegments(2).toFile().equals(Platform.getLocation().toFile());
+	}
+
+	/**
+	 * Get the name of the project
+	 * 
+	 * @return String
+	 */
+	public String getProjectName() {
+		return projectName;
+	}
+
+	/**
+	 * Gets the label to be used when rendering this project record in the
+	 * UI.
+	 * 
+	 * @return String the label
+	 */
+	public String getProjectLabel() {
+		return projectName;
+	}
+
+	public boolean isFromIvyDescription() {
+		return fromIvyDescription;
+	}
+}
\ No newline at end of file
diff --git a/org.apache.easyant4e/src/repository.zip b/org.apache.easyant4e/src/repository.zip
new file mode 100644
index 0000000..26ce2a3
--- /dev/null
+++ b/org.apache.easyant4e/src/repository.zip
Binary files differ
diff --git a/quality/.project b/quality/.project
new file mode 100644
index 0000000..24ddee1
--- /dev/null
+++ b/quality/.project
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>quality</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+	</buildSpec>
+	<natures>
+	</natures>
+</projectDescription>
diff --git a/quality/EasyAnt4E-Formatter b/quality/EasyAnt4E-Formatter
new file mode 100644
index 0000000..d2ebf9e
--- /dev/null
+++ b/quality/EasyAnt4E-Formatter
@@ -0,0 +1,267 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<profiles version="11">
+<profile kind="CodeFormatterProfile" name="EasyAnt4E" version="11">
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_constant" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.align_type_members_on_columns" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_line_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_body" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_member" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_assignment" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_member_type" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_conditional_expression" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_parameter_description" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_html" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_source_code" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indentation.size" value="4"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.lineSplit" value="120"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_array_initializer" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_header" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_multiple_fields" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_binary_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_method_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_field" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_javadoc_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.format_block_comments" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_binary_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.wrap_before_binary_operator" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_package" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode" value="enabled"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_between_import_groups" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_ellipsis" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_after_imports" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.compiler.problem.assertIdentifier" value="error"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block_in_case" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_empty_lines" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block" value="insert"/>
+<setting id="org.eclipse.jdt.core.compiler.source" value="1.5"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.line_length" value="80"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.compiler.compliance" value="1.5"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.compact_else_if" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_switch" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.compiler.problem.enumIdentifier" value="error"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.compiler.codegen.targetPlatform" value="1.5"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_compact_if" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_ellipsis" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_statements_compare_to_block" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_unary_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer" value="2"/>
+<setting id="org.eclipse.jdt.core.formatter.comment.indent_root_tags" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_enum_constants" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation" value="16"/>
+<setting id="org.eclipse.jdt.core.formatter.tabulation.char" value="tab"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_package" value="0"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line" value="true"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.blank_lines_before_method" value="1"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column" value="false"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.brace_position_for_block" value="end_of_line"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer" value="insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression" value="do not insert"/>
+<setting id="org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter" value="insert"/>
+</profile>
+</profiles>
diff --git a/quality/checkstyle/RequiredHeader.txt b/quality/checkstyle/RequiredHeader.txt
new file mode 100644
index 0000000..7076f7a
--- /dev/null
+++ b/quality/checkstyle/RequiredHeader.txt
@@ -0,0 +1,18 @@
+/* 
+ *  Copyright 2008-2009 the EasyAnt project
+ * 
+ *  See the NOTICE file distributed with this work for additional information
+ *  regarding copyright ownership. 
+ * 
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ * 
+ *  http://www.apache.org/licenses/LICENSE-2.0
+ * 
+ *  Unless required by applicable law or agreed to in writing, software 
+ *  distributed under the License is distributed on an "AS IS" BASIS, 
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and 
+ *  limitations under the License.
+ */
diff --git a/quality/checkstyle/checkstyle-config b/quality/checkstyle/checkstyle-config
new file mode 100644
index 0000000..6c29aa5
--- /dev/null
+++ b/quality/checkstyle/checkstyle-config
@@ -0,0 +1,95 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+    This configuration file was written by the eclipse-cs plugin configuration editor
+-->
+<!--
+    Checkstyle-Configuration: EasyAnt4E
+    Description: none
+-->
+<!DOCTYPE module PUBLIC "-//Puppy Crawl//DTD Check Configuration 1.2//EN" "http://www.puppycrawl.com/dtds/configuration_1_2.dtd">
+<module name="Checker">
+    <property name="severity" value="warning"/>
+    <module name="TreeWalker">
+        <module name="FileContentsHolder"/>
+        <module name="PackageName"/>
+        <module name="TypeName"/>
+        <module name="ConstantName"/>
+        <module name="LocalFinalVariableName"/>
+        <module name="LocalVariableName"/>
+        <module name="MemberName"/>
+        <module name="MethodName"/>
+        <module name="ParameterName"/>
+        <module name="StaticVariableName"/>
+        <module name="Header">
+            <property name="headerFile" value="${checkstyle.src.dir}/RequiredHeader.txt"/>
+            <property name="ignoreLines" value="2"/>
+        </module>
+        <module name="AvoidStarImport"/>
+        <module name="RedundantImport"/>
+        <module name="UnusedImports"/>
+        <module name="FileLength"/>
+        <module name="LineLength">
+            <property name="ignorePattern" value="^ *\* *[^ ]+$"/>
+            <property name="max" value="120"/>
+            <property name="tabWidth" value="4"/>
+        </module>
+        <module name="MethodLength"/>
+        <module name="ParameterNumber"/>
+        <module name="EmptyForIteratorPad"/>
+        <module name="NoWhitespaceAfter">
+            <property name="severity" value="ignore"/>
+        </module>
+        <module name="NoWhitespaceBefore">
+            <property name="severity" value="ignore"/>
+        </module>
+        <module name="OperatorWrap"/>
+        <module name="ParenPad"/>
+        <module name="TabCharacter">
+            <property name="severity" value="ignore"/>
+        </module>
+        <module name="WhitespaceAfter">
+            <property name="severity" value="ignore"/>
+        </module>
+        <module name="WhitespaceAround">
+            <property name="severity" value="ignore"/>
+        </module>
+        <module name="ModifierOrder"/>
+        <module name="AvoidNestedBlocks"/>
+        <module name="EmptyBlock">
+            <property name="option" value="text"/>
+        </module>
+        <module name="LeftCurly"/>
+        <module name="NeedBraces"/>
+        <module name="RightCurly"/>
+        <module name="DoubleCheckedLocking"/>
+        <module name="EmptyStatement"/>
+        <module name="EqualsHashCode"/>
+        <module name="IllegalInstantiation">
+            <property name="classes" value="java.lang.Boolean"/>
+        </module>
+        <module name="InnerAssignment"/>
+        <module name="MagicNumber"/>
+        <module name="MissingSwitchDefault"/>
+        <module name="RedundantThrows">
+            <property name="allowUnchecked" value="true"/>
+        </module>
+        <module name="SimplifyBooleanExpression"/>
+        <module name="SimplifyBooleanReturn"/>
+        <module name="FinalClass"/>
+        <module name="HideUtilityClassConstructor"/>
+        <module name="InterfaceIsType">
+            <property name="severity" value="ignore"/>
+        </module>
+        <module name="VisibilityModifier"/>
+        <module name="ArrayTypeStyle"/>
+        <module name="UpperEll"/>
+    </module>
+    <module name="SuppressionCommentFilter">
+        <property name="offCommentFormat" value="CheckStyle\:([\w\|]+) *OFF"/>
+        <property name="onCommentFormat" value="CheckStyle\:([\w\|]+) *ON"/>
+        <property name="checkFormat" value="$1"/>
+    </module>
+    <module name="SuppressionFilter">
+        <property name="file" value="${checkstyle.src.dir}/checkstyle-suppress.xml"/>
+    </module>
+</module>
diff --git a/quality/checkstyle/checkstyle-frames.xsl b/quality/checkstyle/checkstyle-frames.xsl
new file mode 100644
index 0000000..7fe4954
--- /dev/null
+++ b/quality/checkstyle/checkstyle-frames.xsl
@@ -0,0 +1,293 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+    xmlns:lxslt="http://xml.apache.org/xslt"
+    xmlns:redirect="org.apache.xalan.lib.Redirect"
+    extension-element-prefixes="redirect">
+
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+
+    <xsl:output method="html" indent="yes" encoding="US-ASCII"/>
+    <xsl:decimal-format decimal-separator="." grouping-separator="," />
+
+    <xsl:param name="output.dir" select="'.'"/>
+    <xsl:param name="basedir" select="'.'"/>
+
+    <xsl:template match="checkstyle">
+        <!-- create the index.html -->
+        <redirect:write file="{$output.dir}/index.html">
+            <xsl:call-template name="index.html"/>
+        </redirect:write>
+
+        <!-- create the stylesheet.css -->
+        <redirect:write file="{$output.dir}/stylesheet.css">
+            <xsl:call-template name="stylesheet.css"/>
+        </redirect:write>
+
+        <!-- create the overview-summary.html at the root -->
+        <redirect:write file="{$output.dir}/overview-frame.html">
+            <xsl:apply-templates select="." mode="overview"/>
+        </redirect:write>
+
+        <!-- create the all-classes.html at the root -->
+        <redirect:write file="{$output.dir}/allclasses-frame.html">
+            <xsl:apply-templates select="." mode="all.classes"/>
+        </redirect:write>
+
+        <!-- process all files -->
+        <xsl:apply-templates select="file[count(error) != 0]"/>
+    </xsl:template>
+
+    <xsl:template name="index.html">
+        <html>
+            <head>
+                <title>CheckStyle Audit</title>
+            </head>
+            <frameset cols="20%,80%">
+                <frame src="allclasses-frame.html" name="fileListFrame"/>
+                <frame src="overview-frame.html" name="fileFrame"/>
+            </frameset>
+            <noframes>
+                <h2>Frame Alert</h2>
+                <p>
+                    This document is designed to be viewed using the frames feature.
+                    If you see this message, you are using a non-frame-capable web client.
+                </p>
+            </noframes>
+        </html>
+    </xsl:template>
+
+    <xsl:template name="pageHeader">
+        <table border="0" cellpadding="0" cellspacing="0" width="100%">
+            <tr>
+                <td class="text-align:right"><h2>CheckStyle Audit</h2></td>
+            </tr>
+            <tr>
+                <td class="text-align:right">Designed for use with
+                  <a href='http://checkstyle.sourceforge.net/'>CheckStyle</a> and
+                  <a href='http://ant.apache.org/'>Ant</a>.</td>
+            </tr>
+        </table>
+        <hr size="1"/>
+    </xsl:template>
+
+    <xsl:template match="checkstyle" mode="overview">
+        <html>
+            <head>
+                <link rel="stylesheet" type="text/css" href="stylesheet.css"/>
+            </head>
+            <body>
+                <!-- page header -->
+                <xsl:call-template name="pageHeader"/>
+
+                <!-- Summary part -->
+                <xsl:apply-templates select="." mode="summary"/>
+                <hr size="1" width="100%" align="left"/>
+
+                <!-- File list part -->
+                <xsl:apply-templates select="." mode="filelist"/>
+            </body>
+        </html>
+    </xsl:template>
+
+    <xsl:template name="stylesheet.css">
+        .bannercell {
+        border: 0px;
+        padding: 0px;
+        }
+        body {
+        margin-left: 10;
+        margin-right: 10;
+        font:normal 80% arial,helvetica,sanserif;
+        background-color:#FFFFFF;
+        color:#000000;
+        }
+        .oddrow td {
+        background: #efefef;
+        }
+        .evenrow td {
+        background: #fff;
+        }
+        th, td {
+        text-align: left;
+        vertical-align: top;
+        }
+        th {
+        font-weight:bold;
+        background: #ccc;
+        color: black;
+        }
+        table, th, td {
+        font-size:100%;
+        border: none
+        }
+        table.log tr td, tr th {
+
+        }
+        h2 {
+        font-weight:bold;
+        font-size:140%;
+        margin-bottom: 5;
+        }
+        h3 {
+        font-size:100%;
+        font-weight:bold;
+        background: #525D76;
+        color: white;
+        text-decoration: none;
+        padding: 5px;
+        margin-right: 2px;
+        margin-left: 2px;
+        margin-bottom: 0;
+        }
+    </xsl:template>
+
+    <!--
+    Creates an all-classes.html file that contains a link to all files.
+    -->
+    <xsl:template match="checkstyle" mode="all.classes">
+        <html>
+            <head>
+                <link rel="stylesheet" type="text/css" href="stylesheet.css"/>
+            </head>
+            <body>
+                <h2>Files</h2>
+                <p>
+                    <table width="100%">
+                        <!-- For each file create its part -->
+                        <xsl:apply-templates select="file[count(error) != 0]" mode="all.classes">
+                            <xsl:sort select="substring-after(@name, $basedir)"/>
+                        </xsl:apply-templates>
+                    </table>
+                </p>
+            </body>
+        </html>
+    </xsl:template>
+
+    <xsl:template match="checkstyle" mode="filelist">
+        <h3>Files</h3>
+        <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
+            <tr>
+                <th>Name</th>
+                <th>Errors</th>
+            </tr>
+            <xsl:apply-templates select="file[count(error) != 0]" mode="filelist">
+                <xsl:sort select="count(error)" order="descending" data-type="number"/>
+            </xsl:apply-templates>
+        </table>
+    </xsl:template>
+
+    <xsl:template match="file" mode="filelist">
+        <tr>
+            <xsl:call-template name="alternated-row"/>
+            <td nowrap="nowrap">
+                <a>
+                    <xsl:attribute name="href">
+                        <xsl:text>files/</xsl:text><xsl:value-of select="substring-after(@name, $basedir)"/><xsl:text>.html</xsl:text>
+                    </xsl:attribute>
+                    <xsl:value-of select="substring-after(@name, $basedir)"/>
+                </a>
+            </td>
+            <td><xsl:value-of select="count(error)"/></td>
+        </tr>
+    </xsl:template>
+
+    <xsl:template match="file" mode="all.classes">
+        <tr>
+            <td nowrap="nowrap">
+                <a target="fileFrame">
+                    <xsl:attribute name="href">
+                        <xsl:text>files/</xsl:text><xsl:value-of select="substring-after(@name, $basedir)"/><xsl:text>.html</xsl:text>
+                    </xsl:attribute>
+                    <xsl:value-of select="substring-after(@name, $basedir)"/>
+                </a>
+            </td>
+        </tr>
+    </xsl:template>
+
+    <!--
+    transform string like a/b/c to ../../../
+    @param path the path to transform into a descending directory path
+    -->
+    <xsl:template name="path">
+        <xsl:param name="path"/>
+        <xsl:if test="contains($path,'/')">
+            <xsl:text>../</xsl:text>
+            <xsl:call-template name="path">
+                <xsl:with-param name="path"><xsl:value-of select="substring-after($path,'/')"/></xsl:with-param>
+            </xsl:call-template>
+        </xsl:if>
+        <xsl:if test="not(contains($path,'/')) and not($path = '')">
+            <xsl:text>../</xsl:text>
+        </xsl:if>
+    </xsl:template>
+
+    <xsl:template match="file">
+        <redirect:write file="{$output.dir}/files/{substring-after(@name, $basedir)}.html">
+            <html>
+                <head>
+                    <link rel="stylesheet" type="text/css">
+                        <xsl:attribute name="href"><xsl:call-template name="path"><xsl:with-param name="path" select="substring-after(@name, $basedir)"/></xsl:call-template><xsl:text>stylesheet.css</xsl:text></xsl:attribute>
+                    </link>
+                </head>
+                <body>
+                    <xsl:call-template name="pageHeader"/>
+                    <h3>File <xsl:value-of select="substring-after(@name, $basedir)"/></h3>
+                    <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
+                        <tr>
+                            <th>Error Description</th>
+                            <th>Line:Column</th>
+                        </tr>
+                        <xsl:for-each select="error">
+                            <tr>
+                                <xsl:call-template name="alternated-row"/>
+                                <td><a title="{@source}"><xsl:value-of select="@message"/></a></td>
+                                <td align="center"><xsl:value-of select="@line"/><xsl:if test="@column">:<xsl:value-of select="@column"/></xsl:if></td>
+                            </tr>
+                        </xsl:for-each>
+                    </table>
+                </body>
+            </html>
+        </redirect:write>
+    </xsl:template>
+
+    <xsl:template match="checkstyle" mode="summary">
+        <h3>Summary</h3>
+        <xsl:variable name="fileCount" select="count(file)"/>
+        <xsl:variable name="errorCount" select="count(file/error)"/>
+        <xsl:variable name="fileErrorCount" select="count(file[count(error) != 0])"/>
+        <table class="log" border="0" cellpadding="5" cellspacing="2" width="100%">
+            <tr>
+                <th>Total Files</th>
+                <th>Files With Errors</th>
+                <th>Errors</th>
+            </tr>
+            <tr>
+                <xsl:call-template name="alternated-row"/>
+                <td><xsl:value-of select="$fileCount"/></td>
+                <td><xsl:value-of select="$fileErrorCount"/></td>
+                <td><xsl:value-of select="$errorCount"/></td>
+            </tr>
+        </table>
+    </xsl:template>
+
+    <xsl:template name="alternated-row">
+        <xsl:attribute name="class">
+            <xsl:if test="position() mod 2 = 1">oddrow</xsl:if>
+            <xsl:if test="position() mod 2 = 0">evenrow</xsl:if>
+        </xsl:attribute>
+    </xsl:template>
+</xsl:stylesheet>
diff --git a/quality/checkstyle/checkstyle-suppress.xml b/quality/checkstyle/checkstyle-suppress.xml
new file mode 100644
index 0000000..2565f28
--- /dev/null
+++ b/quality/checkstyle/checkstyle-suppress.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE suppressions PUBLIC
+    "-//Puppy Crawl//DTD Suppressions 1.0//EN"
+    "http://www.puppycrawl.com/dtds/suppressions_1_0.dtd">
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one
+   or more contributor license agreements.  See the NOTICE file
+   distributed with this work for additional information
+   regarding copyright ownership.  The ASF licenses this file
+   to you under the Apache License, Version 2.0 (the
+   "License"); you may not use this file except in compliance
+   with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing,
+   software distributed under the License is distributed on an
+   "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+   KIND, either express or implied.  See the License for the
+   specific language governing permissions and limitations
+   under the License.    
+-->
+<suppressions>
+	<suppress checks="MagicNumber" files=".*[\\/]test[\\/]java[\\/].*"/>
+</suppressions>
\ No newline at end of file
diff --git a/quality/checkstyle/checkstyle-text.xsl b/quality/checkstyle/checkstyle-text.xsl
new file mode 100644
index 0000000..333aecf
--- /dev/null
+++ b/quality/checkstyle/checkstyle-text.xsl
@@ -0,0 +1,33 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
+
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+
+    <xsl:strip-space elements="checkstyle"/>
+    <xsl:preserve-space elements="file"/>
+    <xsl:output method="text"/>
+    <xsl:template match="checkstyle/file/error">
+        <xsl:value-of select="../@name"/>
+        <xsl:text>:</xsl:text>
+        <xsl:value-of select="@line"/>
+        <xsl:text>:</xsl:text>
+        <xsl:value-of select="@column"/>
+        <xsl:text> </xsl:text>
+        <xsl:value-of select="@message"/>
+    </xsl:template>
+</xsl:stylesheet>
+
diff --git a/quality/checkstyle/checkstyle-xdoc.xsl b/quality/checkstyle/checkstyle-xdoc.xsl
new file mode 100644
index 0000000..4d7ab86
--- /dev/null
+++ b/quality/checkstyle/checkstyle-xdoc.xsl
@@ -0,0 +1,129 @@
+<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"
+    xmlns:lxslt="http://xml.apache.org/xslt"
+    xmlns:redirect="org.apache.xalan.lib.Redirect"
+    extension-element-prefixes="redirect">
+
+<!--
+   Licensed to the Apache Software Foundation (ASF) under one or more
+   contributor license agreements.  See the NOTICE file distributed with
+   this work for additional information regarding copyright ownership.
+   The ASF licenses this file to You under the Apache License, Version 2.0
+   (the "License"); you may not use this file except in compliance with
+   the License.  You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
+-->
+
+    <xsl:output method="xml" indent="yes"/>
+    <xsl:decimal-format decimal-separator="." grouping-separator="," />
+
+    <xsl:param name="output.dir" select="'.'"/>
+    <xsl:param name="basedir" select="'.'"/>
+
+    <xsl:template match="checkstyle">
+      <document>
+        <properties>
+          <title>Checkstyle Audit</title>
+        </properties>
+
+        <body>
+          <xsl:apply-templates select="." mode="summary"/>
+          <!-- File list part -->
+          <xsl:apply-templates select="." mode="filelist"/>
+          <xsl:apply-templates select="file[count(error) != 0]"/>
+        </body>
+      </document>
+    </xsl:template>
+
+    <xsl:template match="checkstyle" mode="filelist">
+      <section name="Files">
+        <table>
+            <tr>
+                <th>Name</th>
+                <th>Errors</th>
+            </tr>
+            <xsl:apply-templates select="file[count(error) != 0]" mode="filelist">
+                <xsl:sort select="count(error)" order="descending" data-type="number"/>
+            </xsl:apply-templates>
+        </table>
+      </section>
+    </xsl:template>
+
+    <xsl:template match="file" mode="filelist">
+        <tr>
+            <xsl:call-template name="alternated-row"/>
+            <td nowrap="nowrap">
+                <a>
+                    <xsl:attribute name="href">
+                        <xsl:text>files</xsl:text><xsl:value-of select="substring-after(@name, $basedir)"/><xsl:text>.html</xsl:text>
+                    </xsl:attribute>
+                    <xsl:value-of select="substring-after(@name, $basedir)"/>
+                </a>
+            </td>
+            <td><xsl:value-of select="count(error)"/></td>
+        </tr>
+    </xsl:template>
+
+    <xsl:template match="file">
+      <redirect:write file="{$output.dir}/files{substring-after(@name, $basedir)}.xml">
+        <document>
+          <properties>
+            <title>Checkstyle Audit</title>
+          </properties>
+
+          <body>
+            <section name="Details for {substring-after(@name, $basedir)}">
+              <table>
+                  <tr>
+                      <th>Error Description</th>
+                      <th>Line</th>
+                  </tr>
+                  <xsl:for-each select="error">
+                      <tr>
+                          <xsl:call-template name="alternated-row"/>
+                          <td><a title="{@source}"><xsl:value-of select="@message"/></a></td>
+                          <td><xsl:value-of select="@line"/></td>
+                      </tr>
+                  </xsl:for-each>
+              </table>
+            </section>
+          </body>
+        </document>
+      </redirect:write>
+    </xsl:template>
+
+    <xsl:template match="checkstyle" mode="summary">
+      <section name="Summary">
+        <xsl:variable name="fileCount" select="count(file)"/>
+        <xsl:variable name="errorCount" select="count(file/error)"/>
+        <xsl:variable name="fileErrorCount" select="count(file[count(error) != 0])"/>
+        <table>
+            <tr>
+                <th>Files</th>
+                <th>Files With Errors</th>
+                <th>Errors</th>
+            </tr>
+            <tr>
+                <xsl:call-template name="alternated-row"/>
+                <td><xsl:value-of select="$fileCount"/></td>
+                <td><xsl:value-of select="$fileErrorCount"/></td>
+                <td><xsl:value-of select="$errorCount"/></td>
+            </tr>
+        </table>
+      </section>
+    </xsl:template>
+
+    <xsl:template name="alternated-row">
+        <xsl:attribute name="class">
+            <xsl:if test="position() mod 2 = 1">oddrow</xsl:if>
+            <xsl:if test="position() mod 2 = 0">evenrow</xsl:if>
+        </xsl:attribute>
+    </xsl:template>
+</xsl:stylesheet>
+
