Index: release-kits/shared/ant/src/main/org/apache/tools/ant/Task.java
===================================================================
--- release-kits/shared/ant/src/main/org/apache/tools/ant/Task.java	(revision 16682)
+++ release-kits/shared/ant/src/main/org/apache/tools/ant/Task.java	(revision 16685)
@@ -357,4 +357,16 @@
      */
     public final void perform() {
+
+        //if in sim mode, dont execute tasks except antcall and tasks outside of any target
+        boolean dontExecute =
+            project.getProperty("execute") != null && project.getProperty("execute").equals( "false" ) &&
+            getOwningTarget() != null && !getOwningTarget().getName().equals("") &&
+            !getTaskName().equals("antcall");
+
+
+        if ( dontExecute ) {
+            return;
+        }
+
         if (!invalid) {
             getProject().fireTaskStarted(this);
Index: release-kits/shared/ant/src/main/org/apache/tools/ant/taskdefs/CallTarget.java
===================================================================
--- release-kits/shared/ant/src/main/org/apache/tools/ant/taskdefs/CallTarget.java	(revision 16682)
+++ release-kits/shared/ant/src/main/org/apache/tools/ant/taskdefs/CallTarget.java	(revision 16685)
@@ -17,8 +17,8 @@
 
 package org.apache.tools.ant.taskdefs;
-
 import java.io.IOException;
 
 import org.apache.tools.ant.Task;
+import org.apache.tools.ant.Target;
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.types.PropertySet;
@@ -57,4 +57,6 @@
 
     private boolean targetSet = false;
+    private String theTarget = null;
+    private String address = null;
 
     /**
@@ -102,8 +104,45 @@
                  getLocation());
         }
-        callee.setAntfile(getProject().getProperty("ant.file"));
-        callee.setInheritAll(inheritAll);
-        callee.setInheritRefs(inheritRefs);
-        callee.execute();
+
+			/* -- start target addressing code -- */
+
+			//figure out what the address of this instance should be
+			String callingAddress = this.getOwningTarget().getAddress();
+			int subAddress = this.getOwningTarget().getNextSubAddress();
+			this.getOwningTarget().incrementNextSubAddress();
+
+			if ( callingAddress == null ) {
+				address = "" + subAddress;
+			} else {
+				address = callingAddress + "." + subAddress;
+			}
+			
+			
+			//check that the target should be run given address, resume.descend, resume.from and resume.to
+			String resumeFrom = this.getProject().getProperty("resume.from");
+			String resumeDescend = this.getProject().getProperty("resume.descend");
+			String resumeTo = this.getProject().getProperty("resume.to");
+
+			//given resumeFrom, resumeDescend and ResumeTo, might we execute?
+			boolean shouldExecOnFrom = resumeFrom == null || isDescendantOf(resumeFrom,address) || isAfter(address,resumeFrom);
+			boolean shouldExecuteOnDescend = resumeDescend == null || isDescendantOf(resumeDescend,address) || isDescendantOf(address,resumeDescend);
+			boolean shouldExecOnTo = resumeTo == null || !isAfter(address,resumeTo);
+
+			//check that all are true
+			boolean execute = shouldExecOnFrom && shouldExecuteOnDescend && shouldExecOnTo;
+
+			if ( !execute ) {
+				return;
+			}
+
+			/* -- end target addressing code -- */
+
+			callee.setAntfile(getProject().getProperty("ant.file"));
+			callee.setInheritAll(inheritAll);
+			callee.setInheritRefs(inheritRefs);
+			Target calleeTarget = (Target)callee.getProject().getTargets().get(theTarget);
+			calleeTarget.setAddress(address);
+			callee.execute(theTarget,address);
+
     }
 
@@ -153,4 +192,5 @@
         }
         callee.setTarget(target);
+        theTarget = target;
         targetSet = true;
     }
@@ -234,3 +274,130 @@
         }
     }
+
+
+	/* --- node address relations for target addressing --- */
+    public static boolean isAfter(String x, String y) {
+
+		System.out.println( "x: " + x );
+		System.out.println( "y: " + y );
+
+		if ( x.equals("") || y.equals("") ) {
+			throw new BuildException("Error - x or y not specified !!");
+		}
+
+		//check that both are in the form int.int.int
+
+		//break into chambers
+		String[] xs = x.split("\\.");
+		String[] ys = y.split("\\.");
+
+		//figure out n
+		int n = ys.length;
+
+		//step through, making sure x values are higher than or equal to y values
+		for ( int i=0; i<n; i++ ) {
+			int xValue = i<xs.length ? Integer.parseInt( xs[i] ) : 0;
+			int yValue = Integer.parseInt( ys[i] );
+
+			System.out.println( xValue + " " + yValue );
+			if(  xValue < yValue ) {
+				System.out.println("x not after y");
+				return false;
+			}
+
+			if(  xValue > yValue ) {
+				System.out.println("x is after y");
+				return true;
+			}
+		}
+
+		// if execution reaches here, first n places are equal
+		System.out.println("x is after y");
+		return true;
+    }
+
+
+    public static boolean isDescendantOf(String x, String y) {
+
+		System.out.println( "x: " + x );
+		System.out.println( "y: " + y );
+
+		if ( x.equals("") || y.equals("") ) {
+			throw new BuildException("Error - x or y not specified !!");
+		}
+
+		//check that both are in the form int.int.int
+
+		//break into chambers
+		String[] xs = x.split("\\.");
+		String[] ys = y.split("\\.");
+
+		//make sure x is at least as deep as y
+		if ( xs.length < ys.length ) {
+			System.out.println("x not descendant of y");
+			return false;
+		}
+
+		//figure out n
+		int n = ys.length;
+
+		//step through, making sure x values are equal to y values
+		for ( int i=0; i<n; i++ ) {
+			int xValue = Integer.parseInt( xs[i] );
+			int yValue = Integer.parseInt( ys[i] );
+
+			System.out.println( xValue + " " + yValue );
+			if(  xValue != yValue ) {
+				System.out.println("x not descendant of y");
+				return false;
+			}
+		}
+
+		// if execution reaches here, first n places are equal
+		System.out.println("x is descendant of y");
+		return true;
+    }
+
+    public static boolean isEqualTo(String x, String y) {
+
+		System.out.println( "x: " + x );
+		System.out.println( "y: " + y );
+
+		if ( x.equals("") || y.equals("") ) {
+			throw new BuildException("Error - x or y not specified !!");
+		}
+
+		//check that both are in the form int.int.int
+
+		//break into chambers
+		String[] xs = x.split("\\.");
+		String[] ys = y.split("\\.");
+
+		//make sure x is exactly as deep as y
+		if ( xs.length != ys.length ) {
+			System.out.println("x not equal to y");
+			return false;
+		}
+
+		//figure out n
+		int n = xs.length;
+
+		//step through, making sure x values are equal to y values
+		for ( int i=0; i<n; i++ ) {
+			int xValue = Integer.parseInt( xs[i] );
+			int yValue = Integer.parseInt( ys[i] );
+
+			System.out.println( xValue + " " + yValue );
+			if(  xValue != yValue ) {
+				System.out.println("x not equal to y");
+				return false;
+			}
+		}
+
+		// if execution reaches here, first all places
+		System.out.println("x is equal to y");
+		return true;
+    }
+
+
 }
