Index: src/java/org/apache/ivy/ant/IvyBuildNumber.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyBuildNumber.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyBuildNumber.java	(kopia robocza)
@@ -91,7 +91,7 @@
 		_prefix = prefix;
 	}
 
-	public void execute() throws BuildException {
+	public void doExecute() throws BuildException {
         if (_organisation == null) {
             throw new BuildException("no organisation provided for ivy findmodules");
         }
Index: src/java/org/apache/ivy/ant/IvyPostResolveTask.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyPostResolveTask.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyPostResolveTask.java	(kopia robocza)
@@ -26,7 +26,6 @@
 import org.apache.ivy.core.module.id.ModuleId;
 import org.apache.ivy.core.module.id.ModuleRevisionId;
 import org.apache.ivy.core.report.ResolveReport;
-import org.apache.ivy.core.resolve.ResolveOptions;
 import org.apache.ivy.core.settings.IvySettings;
 import org.apache.ivy.util.Message;
 import org.apache.ivy.util.StringUtils;
Index: src/java/org/apache/ivy/ant/AntCallTrigger.java
===================================================================
--- src/java/org/apache/ivy/ant/AntCallTrigger.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/AntCallTrigger.java	(kopia robocza)
@@ -57,7 +57,7 @@
 	private String _prefix;
 
 	public void progress(IvyEvent event) {
-		Project project = (Project)IvyContext.getContext().get(IvyTask.ANT_PROJECT_CONTEXT_KEY);
+		Project project = (Project)IvyContext.getContext().top(IvyTask.ANT_PROJECT_CONTEXT_KEY);
 		if (project == null) {
 			Message.info("ant call trigger can only be used from an ant build. Ignoring.");
 			return;
Index: src/java/org/apache/ivy/ant/IvyReport.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyReport.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyReport.java	(kopia robocza)
@@ -119,7 +119,7 @@
     	_resolveId = resolveId;
     }
 
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
         Ivy ivy = getIvyInstance();
         IvySettings settings = ivy.getSettings();
         
Index: src/java/org/apache/ivy/ant/IvyRepositoryReport.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyRepositoryReport.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyRepositoryReport.java	(kopia robocza)
@@ -64,7 +64,7 @@
     private String _xslext = "html";
     private List _params = new ArrayList();
     
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
         Ivy ivy = getIvyInstance();
         IvySettings settings = ivy.getSettings();
         if (_cache == null) {
Index: src/java/org/apache/ivy/ant/IvyCheck.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyCheck.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyCheck.java	(kopia robocza)
@@ -64,7 +64,7 @@
     }
     
 
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
         try {
         Ivy ivy = getIvyInstance();
         if (_file != null) {
Index: src/java/org/apache/ivy/ant/IvyCacheFileset.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyCacheFileset.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyCacheFileset.java	(kopia robocza)
@@ -49,7 +49,7 @@
     	}
     }
 
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
         prepareAndCheck();
         if (_setid == null) {
             throw new BuildException("setid is required in ivy cachefileset");
Index: src/java/org/apache/ivy/ant/IvyResolve.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyResolve.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyResolve.java	(kopia robocza)
@@ -133,7 +133,7 @@
     	return _failureProperty;
     }
     
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
         Ivy ivy = getIvyInstance();
         IvySettings settings = ivy.getSettings();
         try {
Index: src/java/org/apache/ivy/ant/IvyCachePath.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyCachePath.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyCachePath.java	(kopia robocza)
@@ -50,7 +50,7 @@
         _id = id;
     }
 
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
         prepareAndCheck();
         if (_pathid == null) {
         	if (_id != null) {
Index: src/java/org/apache/ivy/ant/IvyConfigure.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyConfigure.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyConfigure.java	(kopia robocza)
@@ -125,7 +125,7 @@
     	CredentialsStore.INSTANCE.addCredentials(c.getRealm(), c.getHost(), c.getUsername(), c.getPasswd());
     }
 
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
         try {
 	        loadDefaultProperties();
         } catch (Exception ex) {
Index: src/java/org/apache/ivy/ant/IvyRetrieve.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyRetrieve.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyRetrieve.java	(kopia robocza)
@@ -42,7 +42,7 @@
         _pattern = pattern;
     }
     
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
     	prepareAndCheck();
 
         _pattern = getProperty(_pattern, getSettings(), "ivy.retrieve.pattern");
Index: src/java/org/apache/ivy/ant/IvyVar.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyVar.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyVar.java	(kopia robocza)
@@ -92,7 +92,7 @@
         _value = value;
     }
     
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
         Ivy ivy = getIvyInstance();
         IvySettings settings = ivy.getSettings();
         if (getName() != null) {
Index: src/java/org/apache/ivy/ant/IvyArtifactReport.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyArtifactReport.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyArtifactReport.java	(kopia robocza)
@@ -68,7 +68,7 @@
         _pattern = pattern;
     }
 
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
     	prepareAndCheck();
         if (_tofile == null) {
             throw new BuildException("no destination file name: please provide it through parameter 'tofile'");
Index: src/java/org/apache/ivy/ant/IvyDeliver.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyDeliver.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyDeliver.java	(kopia robocza)
@@ -314,7 +314,7 @@
     	_conf = confs;
     }
 
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
     	Ivy ivy = getIvyInstance();
         IvySettings settings = ivy.getSettings();
         
Index: src/java/org/apache/ivy/ant/IvyBuildList.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyBuildList.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyBuildList.java	(kopia robocza)
@@ -116,7 +116,7 @@
 		_delimiter = delimiter;
 	}
 	
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
         if (_reference == null) {
             throw new BuildException("reference should be provided in ivy build list");
         }
Index: src/java/org/apache/ivy/ant/IvyInfo.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyInfo.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyInfo.java	(kopia robocza)
@@ -49,7 +49,7 @@
         _file = file;
     }
 
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
         Ivy ivy = getIvyInstance();
         IvySettings settings = ivy.getSettings();
         if (_file == null) {
Index: src/java/org/apache/ivy/ant/IvyConvertPom.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyConvertPom.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyConvertPom.java	(kopia robocza)
@@ -53,7 +53,7 @@
     }
     
     
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
         try {
             if (_pomFile == null) {
                 throw new BuildException("source pom file is required for convertpom task");
Index: src/java/org/apache/ivy/ant/AntBuildTrigger.java
===================================================================
--- src/java/org/apache/ivy/ant/AntBuildTrigger.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/AntBuildTrigger.java	(kopia robocza)
@@ -64,7 +64,7 @@
 				Message.verbose("target build file already built, skipping: "+f);
 			} else {
 				Ant ant = new Ant();
-				Project project = (Project)IvyContext.getContext().get(IvyTask.ANT_PROJECT_CONTEXT_KEY);
+				Project project = (Project)IvyContext.getContext().top(IvyTask.ANT_PROJECT_CONTEXT_KEY);
 				if (project == null) {
 					project = new Project();
 					project.init();
Index: src/java/org/apache/ivy/ant/IvyFindRevision.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyFindRevision.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyFindRevision.java	(kopia robocza)
@@ -81,7 +81,7 @@
 	}
 
 
-	public void execute() throws BuildException {
+	public void doExecute() throws BuildException {
         if (_organisation == null) {
             throw new BuildException("no organisation provided for ivy findmodules");
         }
Index: src/java/org/apache/ivy/ant/IvyExtractFromSources.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyExtractFromSources.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyExtractFromSources.java	(kopia robocza)
@@ -109,7 +109,7 @@
         _concat.addFileset(fileSet);
     }
     
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
         configureConcat();
         Writer out = new StringWriter();
         _concat.setWriter(out);
Index: src/java/org/apache/ivy/ant/IvyArtifactProperty.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyArtifactProperty.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyArtifactProperty.java	(kopia robocza)
@@ -49,7 +49,7 @@
         _value = value;
     }
 
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
     	prepareAndCheck();
 
         try {
Index: src/java/org/apache/ivy/ant/IvyTask.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyTask.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyTask.java	(kopia robocza)
@@ -41,7 +41,7 @@
  * @author Xavier Hanin
  *
  */
-public class IvyTask extends Task {
+public abstract class IvyTask extends Task {
     public static final String ANT_PROJECT_CONTEXT_KEY = "ant-project";
 	private Boolean _validate = null; 
 
@@ -252,9 +252,29 @@
         return val;
     }
     
-    public void setProject(Project project) {
-    	super.setProject(project);
-    	IvyContext.getContext().set(ANT_PROJECT_CONTEXT_KEY, project);
+    /**
+     * Ant task execute. Puts and retrieves ant project reference into (from) IvyContext
+     * and in the middle calls implementation of doExecute.
+     */
+    public void execute() throws BuildException{
+    	try{
+        	//push current project on the stack in context
+    		IvyContext.getContext().push(ANT_PROJECT_CONTEXT_KEY, getProject());
+    		doExecute();
+    	} finally {
+    		//remove current project from the stack in context
+    		Project p=(Project)IvyContext.getContext().pop(ANT_PROJECT_CONTEXT_KEY);
+    		if(p==null || !p.equals(getProject())){
+    			Message.error("ANT project poped from stack not equals current !. Ignoring");
+    		}
+    	}
     }
+
+    /**
+     * The real logic of task execution after project has been set in the context.
+     * MUST be implemented by subclasses
+     * @throws BuildException
+     */
+    public abstract void doExecute() throws BuildException;
     
 }
Index: src/java/org/apache/ivy/ant/IvyListModules.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyListModules.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyListModules.java	(kopia robocza)
@@ -97,7 +97,7 @@
 		_branch = branch;
 	}
 
-	public void execute() throws BuildException {
+	public void doExecute() throws BuildException {
         if (_organisation == null) {
             throw new BuildException("no organisation provided for ivy findmodules");
         }
Index: src/java/org/apache/ivy/ant/IvyInstall.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyInstall.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyInstall.java	(kopia robocza)
@@ -21,12 +21,11 @@
 
 import org.apache.ivy.Ivy;
 import org.apache.ivy.core.module.id.ModuleRevisionId;
+import org.apache.ivy.core.report.ResolveReport;
 import org.apache.ivy.core.settings.IvySettings;
 import org.apache.ivy.plugins.matcher.PatternMatcher;
 import org.apache.ivy.util.filter.FilterHelper;
 import org.apache.tools.ant.BuildException;
-import org.apache.ivy.core.report.ResolveReport;
-import org.apache.tools.ant.BuildException;
 
 /**
  * Allow to install a module or a set of module from repository to another one.
@@ -48,7 +47,7 @@
     private String _matcher = PatternMatcher.EXACT;
     private boolean _haltOnFailure = true;
     
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
         Ivy ivy = getIvyInstance();
         IvySettings settings = ivy.getSettings();
         if (_cache == null) {
Index: src/java/org/apache/ivy/ant/IvyPublish.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyPublish.java	(wersja 536841)
+++ src/java/org/apache/ivy/ant/IvyPublish.java	(kopia robocza)
@@ -165,7 +165,7 @@
         _replacedynamicrev = replacedynamicrev;
     }
     
-    public void execute() throws BuildException {
+    public void doExecute() throws BuildException {
         Ivy ivy = getIvyInstance();
         IvySettings settings = ivy.getSettings();
 
Index: src/java/org/apache/ivy/core/IvyContext.java
===================================================================
--- src/java/org/apache/ivy/core/IvyContext.java	(wersja 536841)
+++ src/java/org/apache/ivy/core/IvyContext.java	(kopia robocza)
@@ -20,6 +20,8 @@
 import java.io.File;
 import java.lang.ref.WeakReference;
 import java.util.HashMap;
+import java.util.LinkedList;
+import java.util.List;
 import java.util.Map;
 import java.util.Stack;
 
@@ -130,6 +132,66 @@
 		_contextMap.put(key, new WeakReference(value));
 	}
 
+	/**
+	 * Reads the first object from the list saved under given key in the context.
+	 * If value under key represents non List object then a RuntimeException is thrown.
+	 * @param key context key for the string
+	 * @return top object from the list (index 0) or null if no key or list empty
+	 */
+	public Object top(String key){
+		synchronized(_contextMap){
+			Object o=_contextMap.get(key);
+			if(o==null) return null;
+			if(o instanceof List){
+				if(((List)o).size()==0) return null;
+				Object ret=((List)o).get(0);
+				return ret;
+			} else {
+				throw new RuntimeException("Cannot top from non List object "+o);
+			}
+		}
+	}
+	
+	/**
+	 * Removes and returns first object from the list saved under given key in the context.
+	 * If value under key represents non List object then a RuntimeException is thrown.
+	 * @param key context key for the string
+	 * @return top object from the list (index 0) or null if no key or list empty
+	 */
+	public Object pop(String key){
+		synchronized(_contextMap){
+			Object o=_contextMap.get(key);
+			if(o==null) return null;
+			if(o instanceof List){
+				if(((List)o).size()==0) return null;
+				Object ret=((List)o).remove(0);
+				return ret;
+			} else {
+				throw new RuntimeException("Cannot pop from non List object "+o);
+			}
+		}
+	}
+	
+	/**
+	 * Puts a new object at the start of the list saved under given key in the context.
+	 * If value under key represents non List object then a RuntimeException is thrown.
+	 * If no list exists under given key a new LinkedList is created. This is kept
+	 * without WeakReference in opposite to the put() results.
+	 * @param key key context key for the string
+	 * @param value value to be saved under the key
+	 */
+	public void push(String key, Object value){
+		synchronized(_contextMap){
+			if(!_contextMap.containsKey(key)) _contextMap.put(key, new LinkedList());
+			Object o=_contextMap.get(key);
+			if(o instanceof List){
+				((List)o).add(0,value);
+			} else {
+				throw new RuntimeException("Cannot push to non List object "+o);
+			}
+		}
+	}
+	
 	public Thread getOperatingThread() {
 		return _operatingThread;
 	}
Index: test/java/org/apache/ivy/ant/IvyPostResolveTaskTest.java
===================================================================
--- test/java/org/apache/ivy/ant/IvyPostResolveTaskTest.java	(wersja 536841)
+++ test/java/org/apache/ivy/ant/IvyPostResolveTaskTest.java	(kopia robocza)
@@ -42,7 +42,7 @@
         _project.setProperty("ivy.settings.file", "test/repositories/ivysettings.xml");
 
         _task = new IvyPostResolveTask() {
-        	public void execute() throws BuildException {
+        	public void doExecute() throws BuildException {
         		prepareAndCheck();
         	}
         };
