Index: src/java/org/apache/ivy/ant/IvyBuildList.java
===================================================================
--- src/java/org/apache/ivy/ant/IvyBuildList.java	(revision 534336)
+++ src/java/org/apache/ivy/ant/IvyBuildList.java	(working copy)
@@ -171,6 +171,7 @@
                         ModuleDescriptor md = ModuleDescriptorParserRegistry.getInstance().parseDescriptor(settings, ivyFile.toURL(), doValidate(settings));
                         buildFiles.put(md, buildFile);
                         mdsMap.put(md.getModuleRevisionId().getModuleId().getName(), md);
+                        Message.debug("Add " + md.getModuleRevisionId().getModuleId());
                     } catch (Exception ex) {
                         if (_haltOnError) {
                             throw new BuildException("impossible to parse ivy file for "+buildFile+": ivyfile="+ivyFile+" exception="+ex, ex);
Index: src/java/org/apache/ivy/core/module/descriptor/ModuleDescriptor.java
===================================================================
--- src/java/org/apache/ivy/core/module/descriptor/ModuleDescriptor.java	(revision 534336)
+++ src/java/org/apache/ivy/core/module/descriptor/ModuleDescriptor.java	(working copy)
@@ -90,6 +90,8 @@
     String[] getPublicConfigurationsNames();
     Artifact[] getArtifacts(String conf);
 	Artifact[] getAllArtifacts();
+	
+	/** @retun The dependencies of the module.  If there is no dependencies return an empty array (non null) */
     DependencyDescriptor[] getDependencies();
     
     /**
Index: src/java/org/apache/ivy/core/sort/ModuleDescriptorSorter.java
===================================================================
--- src/java/org/apache/ivy/core/sort/ModuleDescriptorSorter.java	(revision 534336)
+++ src/java/org/apache/ivy/core/sort/ModuleDescriptorSorter.java	(working copy)
@@ -23,6 +23,7 @@
 import java.util.List;
 import java.util.Stack;
 
+import org.apache.ivy.Ivy;
 import org.apache.ivy.core.module.descriptor.DependencyDescriptor;
 import org.apache.ivy.core.module.descriptor.ModuleDescriptor;
 import org.apache.ivy.plugins.circular.CircularDependencyException;
@@ -55,6 +56,7 @@
      * @throws CircularDependencyException
      */
     public List sortModuleDescriptors(VersionMatcher matcher) throws CircularDependencyException {
+    	Message.debug("Nbr of module to sort : " + moduleDescriptors.size());
         while (moduleDescriptorsIterator.hasNext()) {
             sortModuleDescriptorsHelp(matcher, (ModuleDescriptor)moduleDescriptorsIterator.next(), new Stack());
         }
@@ -72,6 +74,7 @@
     private void sortModuleDescriptorsHelp(VersionMatcher matcher, ModuleDescriptor current, Stack callStack) throws CircularDependencyException {
         //if already sorted return
         if (sorted.contains(current)) {
+        	Message.debug("Module descriptor already sorted : " + current.getModuleRevisionId().toString());
             return;
         }
         if (callStack.contains(current)) {
@@ -80,16 +83,17 @@
             return;
         }
         DependencyDescriptor [] descriptors = current.getDependencies();
-        ModuleDescriptor moduleDescriptorDependency = null;
-        for (int i = 0; descriptors!=null && i < descriptors.length; i++) {
-            moduleDescriptorDependency = getModuleDescriptorDependency(matcher, descriptors[i]);
+        Message.debug("Sort first dependencies of : " + current.getModuleRevisionId().toString() + " / Number of dependencies = " + descriptors.length);
+        callStack.push(current);
+        for (int i = 0; i < descriptors.length; i++) {
+        	ModuleDescriptor moduleDescriptorDependency = getModuleDescriptorDependency(matcher, descriptors[i]);
             
             if (moduleDescriptorDependency != null) {
-                callStack.push(current);
                 sortModuleDescriptorsHelp(matcher, moduleDescriptorDependency, callStack);
-                callStack.pop();
             }
         }
+        callStack.pop();
+        Message.debug("Sort done for : " + current.getModuleRevisionId().toString());
         sorted.add(current);
     }
 
@@ -100,11 +104,12 @@
      */
     private ModuleDescriptor getModuleDescriptorDependency(VersionMatcher matcher, DependencyDescriptor descriptor) {
         Iterator i = moduleDescriptors.iterator();
-        ModuleDescriptor md = null;
         while (i.hasNext()) {
-            md = (ModuleDescriptor) i.next();
+        	ModuleDescriptor md = (ModuleDescriptor) i.next();
             if (descriptor.getDependencyId().equals(md.getModuleRevisionId().getModuleId())) {
-                if (md.getResolvedModuleRevisionId().getRevision() == null) {
+                if (md.getResolvedModuleRevisionId().getRevision() == null || md.getResolvedModuleRevisionId().getRevision().equals(Ivy.getWorkingRevision())) {
+                	//Checking md.getResolvedModuleRevisionId().getRevision().equals(Ivy.getWorkingRevision() allow to consider any local non resolved ivy.xml
+                	//as a valid module.
                     return md;
                 } else if (matcher.accept(descriptor.getDependencyRevisionId(), md)) {
                     return md;
Index: test/java/org/apache/ivy/core/sort/SortTest.java
===================================================================
--- test/java/org/apache/ivy/core/sort/SortTest.java	(revision 534336)
+++ test/java/org/apache/ivy/core/sort/SortTest.java	(working copy)
@@ -20,6 +20,8 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Date;
+import java.util.HashSet;
+import java.util.Iterator;
 import java.util.List;
 
 import junit.framework.TestCase;
@@ -40,6 +42,10 @@
     private ModuleRevisionId mrid3;
     private ModuleRevisionId mrid4;
     private DefaultModuleDescriptor[] md;
+    private DefaultModuleDescriptor md1;
+    private DefaultModuleDescriptor md2;
+    private DefaultModuleDescriptor md3;
+    private DefaultModuleDescriptor md4;
     List toSort;
     
     
@@ -49,46 +55,51 @@
      */
     protected void setUp() throws Exception {
         super.setUp();
-        mrid1 = ModuleRevisionId.newInstance("org", "md1", "rev1");
-        mrid2 = ModuleRevisionId.newInstance("org", "md2", "rev2");
+        mrid1 = ModuleRevisionId.newInstance("org", "md1", null);
+        mrid2 = ModuleRevisionId.newInstance("org", "md2", null);
         mrid3 = ModuleRevisionId.newInstance("org", "md3", "rev3");
         mrid4 = ModuleRevisionId.newInstance("org", "md4", "rev4");
-        md = new DefaultModuleDescriptor[] {
-            new DefaultModuleDescriptor(mrid1, "integration", new Date()),
-            new DefaultModuleDescriptor(mrid2, "integration", new Date()),
-            new DefaultModuleDescriptor(mrid3, "integration", new Date()),
-            new DefaultModuleDescriptor(mrid4, "integration", new Date())
-        };
-        md[1].addDependency(new DefaultDependencyDescriptor(mrid1, false));
-        md[2].addDependency(new DefaultDependencyDescriptor(mrid2, false));
-        md[3].addDependency(new DefaultDependencyDescriptor(mrid3, false));
-        
+        md1 = new DefaultModuleDescriptor(mrid1, "integration", new Date());
+        md2 = new DefaultModuleDescriptor(mrid2, "integration", new Date());
+        md3 = new DefaultModuleDescriptor(mrid3, "integration", new Date());
+        md4 = new DefaultModuleDescriptor(mrid4, "integration", new Date());
+        md = new DefaultModuleDescriptor[] {md1, md2, md3};
+        md2.addDependency(new DefaultDependencyDescriptor(ModuleRevisionId.newInstance("org", "md1", "latest.integration"), false));
+        md3.addDependency(new DefaultDependencyDescriptor(ModuleRevisionId.newInstance("org", "md2", "aSpecialVersion"), false));
+        md4.addDependency(new DefaultDependencyDescriptor(ModuleRevisionId.newInstance("org", "md3", "rev2"), false));
+        //NB: I'm not sure about what we want in the case of a dependency having a aSpecialVersion
     }
 
     public void testSort() throws Exception {
         Ivy ivy = new Ivy();
         ivy.configureDefault();
-        toSort = new ArrayList(Arrays.asList(new Object[] {md[0], md[2], md[1], md[3]}));
+        toSort = new ArrayList(Arrays.asList(new Object[] {md1, md3, md2, md4}));
         assertSorted(md, ivy.sortModuleDescriptors(toSort));
-        toSort = new ArrayList(Arrays.asList(new Object[] {md[0], md[1], md[2], md[3]}));
+        toSort = new ArrayList(Arrays.asList(new Object[] {md1, md2, md3, md4}));
         assertSorted(md, ivy.sortModuleDescriptors(toSort));
-        toSort = new ArrayList(Arrays.asList(new Object[] {md[1], md[0], md[2], md[3]}));
+        toSort = new ArrayList(Arrays.asList(new Object[] {md2, md1, md3, md4}));
         assertSorted(md, ivy.sortModuleDescriptors(toSort));
-        toSort = new ArrayList(Arrays.asList(new Object[] {md[1], md[2], md[0], md[3]}));
+        toSort = new ArrayList(Arrays.asList(new Object[] {md2, md3, md1, md4}));
         assertSorted(md, ivy.sortModuleDescriptors(toSort));
-        toSort = new ArrayList(Arrays.asList(new Object[] {md[2], md[1], md[0], md[3]}));
+        toSort = new ArrayList(Arrays.asList(new Object[] {md3, md2, md1, md4}));
         assertSorted(md, ivy.sortModuleDescriptors(toSort));
-        toSort = new ArrayList(Arrays.asList(new Object[] {md[2], md[0], md[1], md[3]}));
+        toSort = new ArrayList(Arrays.asList(new Object[] {md3, md1, md2, md4}));
         assertSorted(md, ivy.sortModuleDescriptors(toSort));
-        toSort = new ArrayList(Arrays.asList(new Object[] {md[1], md[3], md[2], md[0]}));
+        toSort = new ArrayList(Arrays.asList(new Object[] {md2, md4, md3, md1}));
         assertSorted(md, ivy.sortModuleDescriptors(toSort));
     }
 
     private void assertSorted(DefaultModuleDescriptor[] md, List sorted) {
-        assertEquals(md.length, sorted.size());
-        for (int i = 0; i < md.length; i++) {
-            assertEquals(md[i], sorted.get(i));
-        }
+        assertEquals(md.length+1, sorted.size());
+        //The order is mrid1 , mrid2 , mrid4.  mrid3 can be at any place
+        int expectedPos = 0;
+        for (Iterator iter = sorted.iterator(); iter.hasNext();) {
+			DefaultModuleDescriptor element = (DefaultModuleDescriptor) iter.next();
+			if (!element.equals(md4)) {
+				assertEquals(md[expectedPos], element);
+				expectedPos++;
+			}
+		}
     }
     
     // sorter does not throw circular dependency, circular dependencies are handled at resolve time only
@@ -97,22 +108,17 @@
     public void testCircularDependency() throws Exception {
         Ivy ivy = new Ivy();
         ivy.configureDefault();
-        md[0].addDependency(new DefaultDependencyDescriptor(mrid4, false));
-        toSort = new ArrayList(Arrays.asList(new Object[] {md[0], md[2], md[1], md[3]}));
+        md1.addDependency(new DefaultDependencyDescriptor(mrid3, false));
+        toSort = new ArrayList(Arrays.asList(new Object[] {md1, md3, md2, md4}));
         // the sorted array may begin by any of the modules since there is a circular dependency
-        // in this case, the result is the following
-        DefaultModuleDescriptor[] sorted = new DefaultModuleDescriptor[] {
-                md[1], md[2], md[3], md[0]
-            };
-
-        assertSorted(sorted, ivy.sortModuleDescriptors(toSort));
+        assertEquals(4, new HashSet(ivy.sortModuleDescriptors(toSort)).size());
     }
     
     public void testCircularDependency2() throws Exception {
         Ivy ivy = new Ivy();
         ivy.configureDefault();
-        md[1].addDependency(new DefaultDependencyDescriptor(mrid3, false));
-        toSort = new ArrayList(Arrays.asList(new Object[] {md[0], md[2], md[1], md[3]}));
-        assertSorted(md, ivy.sortModuleDescriptors(toSort));
+        md[1].addDependency(new DefaultDependencyDescriptor(mrid2, false));
+        toSort = new ArrayList(Arrays.asList(new Object[] {md1, md3, md2, md4}));
+        assertEquals(4, new HashSet(ivy.sortModuleDescriptors(toSort)).size());
     }
 }
\ No newline at end of file
