Index: test/java/org/apache/ivy/plugins/version/LatestVersionMatcherTest.java
===================================================================
--- test/java/org/apache/ivy/plugins/version/LatestVersionMatcherTest.java	(revision 1449249)
+++ test/java/org/apache/ivy/plugins/version/LatestVersionMatcherTest.java	(working copy)
@@ -20,17 +20,18 @@
 import junit.framework.TestCase;
 
 import org.apache.ivy.core.IvyContext;
+import org.apache.ivy.core.module.descriptor.DefaultModuleDescriptor;
 import org.apache.ivy.core.module.id.ModuleRevisionId;
 import org.apache.ivy.core.module.status.Status;
 import org.apache.ivy.core.module.status.StatusManager;
 
 public class LatestVersionMatcherTest extends TestCase {
     private LatestVersionMatcher vm = new LatestVersionMatcher();
-    
+
     protected void setUp() {
         IvyContext.pushNewContext();
     }
-    
+
     protected void tearDown() {
         IvyContext.popContext();
     }
@@ -40,7 +41,14 @@
         assertNeed("latest.milestone", true);
         assertNeed("latest.integration", false);
     }
-    
+
+    public void testNeedModuleDescriptorForBranches() throws Exception {
+        assertNeed("latest.release", "trunk", true);
+        assertNeed("latest.milestone", "trunk", true);
+        // different branches will have different latest.integration artifacts
+        assertNeed("latest.integration", "trunk", true);
+    }
+
     public void testNeedModuleDescriptorCustomStatus() throws Exception {
         StatusManager.getCurrent().addStatus(new Status("release", false));
         StatusManager.getCurrent().addStatus(new Status("snapshot", true));
@@ -49,8 +57,53 @@
         assertNeed("latest.snapshot", false);
     }
 
+    public void testAcceptForStandardStatus() throws Exception {
+        assertAccept("latest.release", "release", true);
+        assertAccept("latest.release", "milestone", false);
+        assertAccept("latest.release", "integration", false);
+    }
+
+    public void testAcceptForSameBranches() throws Exception {
+        assertAccept("latest.release", "trunk", "release", "trunk", true);
+        assertAccept("latest.release", "trunk", "milestone", "trunk", false);
+        assertAccept("latest.release", "trunk", "integration", "trunk", false);
+    }
+
+    public void testAcceptForDifferentBranches() throws Exception {
+        assertAccept("latest.release", "trunk", "release", "feature", false);
+        assertAccept("latest.release", "trunk", "milestone", "feature", false);
+        assertAccept("latest.release", "trunk", "integration", "feature", false);
+    }
+
     // assertion helper methods
     private void assertNeed(String askedVersion, boolean b) {
-        assertEquals(b, vm.needModuleDescriptor(ModuleRevisionId.newInstance("org", "name", askedVersion), null));
+        assertEquals(b, vm.needModuleDescriptor(
+            ModuleRevisionId.newInstance("org", "name", askedVersion), null));
     }
+
+    private void assertNeed(String askedVersion, String askedBranch, boolean b) {
+        assertEquals(
+            b,
+            vm.needModuleDescriptor(
+                ModuleRevisionId.newInstance("org", "name", askedBranch, askedVersion), null));
+    }
+
+    private void assertAccept(String askedVersion, String foundStatus, boolean b) {
+        ModuleRevisionId askedMrid = ModuleRevisionId.newInstance("org", "name", askedVersion);
+        DefaultModuleDescriptor foundMD = DefaultModuleDescriptor
+                .newDefaultInstance(ModuleRevisionId.newInstance("org", "name", null));
+        foundMD.setStatus(foundStatus);
+        assertEquals(b, vm.accept(askedMrid, foundMD));
+    }
+
+    private void assertAccept(String askedVersion, String askedBranch, String foundStatus,
+            String foundBranch, boolean b) {
+        ModuleRevisionId askedMrid = ModuleRevisionId.newInstance("org", "name", askedBranch,
+            askedVersion);
+        DefaultModuleDescriptor foundMD = DefaultModuleDescriptor
+                .newDefaultInstance(ModuleRevisionId.newInstance("org", "name", foundBranch,
+                    (String) null));
+        foundMD.setStatus(foundStatus);
+        assertEquals(b, vm.accept(askedMrid, foundMD));
+    }
 }
Index: src/java/org/apache/ivy/plugins/version/LatestVersionMatcher.java
===================================================================
--- src/java/org/apache/ivy/plugins/version/LatestVersionMatcher.java	(revision 1449249)
+++ src/java/org/apache/ivy/plugins/version/LatestVersionMatcher.java	(working copy)
@@ -39,6 +39,12 @@
     }
 
     public boolean needModuleDescriptor(ModuleRevisionId askedMrid, ModuleRevisionId foundMrid) {
+        // if asking for a branch, foundMrid will likely have an invalid value that doesn't
+        // come from the module descriptor itself. return true so accept is given the real
+        // module descriptor with the correct branch.
+        if (askedMrid.getBranch() != null) {
+            return true;
+        }
         List statuses = StatusManager.getCurrent().getStatuses();
         Status lowest = (Status) statuses.get(statuses.size() - 1);
         String latestLowest = "latest." + lowest.getName();
@@ -46,6 +52,12 @@
     }
 
     public boolean accept(ModuleRevisionId askedMrid, ModuleDescriptor foundMD) {
+        String askedBranch = askedMrid.getBranch();
+        String foundBranch = foundMD.getModuleRevisionId().getBranch();
+        boolean sameBranch = (askedBranch == null) ? foundBranch == null : askedBranch.equals(foundBranch);
+        if (!sameBranch) {
+            return false;
+        }
         String askedStatus = askedMrid.getRevision().substring("latest.".length());
         return StatusManager.getCurrent().getPriority(askedStatus) >= StatusManager.getCurrent()
                 .getPriority(foundMD.getStatus());
