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 16690)
+++ /release-kits/shared/ant/src/main/org/apache/tools/ant/Task.java	(revision 16691)
@@ -359,11 +359,13 @@
 
         //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 ) {
+        boolean execute =
+            project.getProperty("execute") == null ||
+				!project.getProperty("execute").equals( "false" ) ||
+            getOwningTarget() == null ||
+				getOwningTarget().getName().equals("") ||
+            getTaskName().equals("antcall");
+
+
+        if ( !execute ) {
             return;
         }
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 16690)
+++ /release-kits/shared/ant/src/main/org/apache/tools/ant/taskdefs/CallTarget.java	(revision 16691)
@@ -131,4 +131,6 @@
 			//check that all are true
 			boolean execute = shouldExecOnFrom && shouldExecuteOnDescend && shouldExecOnTo;
+			//log( "oran: address: " + address );
+			//log( "oran: execute: " + execute);
 
 			if ( !execute ) {
@@ -286,4 +288,25 @@
 		}
 
+
+		//everything is after root
+		if ( y.equals("root") ) {
+			return true;
+		}
+
+		//root is after nothing
+		//(except itself, but that's already caught)
+		if ( x.equals("root") ) {
+			return false;
+		}
+
+		//infinity is after everything
+		if ( x.equals("infinity") )
+			return true;
+
+		//nothing is after infinity
+		// (except itself, but that's already caught)
+		if ( y.equals("infinity") )
+			return false;
+
 		//check that both are in the form int.int.int
 
@@ -327,4 +350,34 @@
 		}
 
+
+		//everything decends from root
+		if ( y.equals("root") )
+			return true;
+
+		//root descends from nothing
+		//(except itself but that's already caught)
+		if ( x.equals("root") )
+			return false;
+
+		//infinity descends from itself
+		if ( x.equals("infinity") && y.equals("infinity") ) {
+			return true;
+		}
+
+		//nothing descends from infinity
+		//(except itself but that's already caught)
+		if ( y.equals("infinity") ) {
+			return false;
+		}
+
+		//infinity descends only from nothing
+		//(except root and itself, but that's already caught)
+		if ( x.equals("infinity") ) {
+			return false;
+		}
+
+
+
+
 		//check that both are in the form int.int.int
 
@@ -359,45 +412,3 @@
     }
 
-    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;
-    }
-
-
 }
