All tests passing.
diff --git a/src/main/java/org/testng/TestRunner.java b/src/main/java/org/testng/TestRunner.java
index 2a82e6a..5a3fa39 100644
--- a/src/main/java/org/testng/TestRunner.java
+++ b/src/main/java/org/testng/TestRunner.java
@@ -1131,7 +1131,7 @@
   private List<MethodInstance> methodsToMultipleMethodInstances(ITestNGMethod... sl) {
     List<MethodInstance> vResult = Lists.newArrayList();
     for (ITestNGMethod m : sl) {
-      Object[] instances = m.getTestClass().getInstances(true);
+      Object[] instances = m.getInstances();
       for (Object instance : instances) {
         vResult.add(new MethodInstance(m, new Object[] { instance }));
       }
@@ -1143,7 +1143,7 @@
   private MethodInstance[] methodsToMethodInstances(List<ITestNGMethod> sl) {
     MethodInstance[] result = new MethodInstance[sl.size()];
     for (int i = 0; i < result.length; i++) {
-      result[i] = new MethodInstance(sl.get(i), sl.get(i).getTestClass().getInstances(true));
+      result[i] = new MethodInstance(sl.get(i), sl.get(i).getInstances());
     }
 
     return result;
diff --git a/src/main/java/org/testng/internal/BaseTestMethod.java b/src/main/java/org/testng/internal/BaseTestMethod.java
index bdb33ec..1039bc7 100755
--- a/src/main/java/org/testng/internal/BaseTestMethod.java
+++ b/src/main/java/org/testng/internal/BaseTestMethod.java
@@ -409,7 +409,8 @@
 

     boolean isEqual = m_testClass == null ? other.m_testClass == null

         : other.m_testClass != null &&

-          m_testClass.getRealClass().equals(other.m_testClass.getRealClass());

+          m_testClass.getRealClass().equals(other.m_testClass.getRealClass())

+          && m_instance == other.getInstance();

 

     return isEqual && getConstructorOrMethod().equals(other.getConstructorOrMethod());

   }

diff --git a/src/main/java/org/testng/internal/TestMethodWorker.java b/src/main/java/org/testng/internal/TestMethodWorker.java
index 5d1e7c2..deca897 100644
--- a/src/main/java/org/testng/internal/TestMethodWorker.java
+++ b/src/main/java/org/testng/internal/TestMethodWorker.java
@@ -222,14 +222,12 @@
       }
 
       for(Object inst: invokeInstances) {
-        System.out.println("Invoking after classes for instance " + inst);
         m_invoker.invokeConfigurations(testClass,
                                        afterClassMethods,
                                        m_suite,
                                        m_parameters,
                                        null, /* no parameter values */
                                        inst);
-        System.out.println("Done invoking after classes for instance " + inst);
       }
     }
   }
diff --git a/src/test/java/test/dependent/GroupByInstancesSampleTest.java b/src/test/java/test/dependent/GroupByInstancesSampleTest.java
index 00b274d..2d18501 100644
--- a/src/test/java/test/dependent/GroupByInstancesSampleTest.java
+++ b/src/test/java/test/dependent/GroupByInstancesSampleTest.java
@@ -3,12 +3,13 @@
 import org.testng.annotations.DataProvider;
 import org.testng.annotations.Factory;
 import org.testng.annotations.Test;
+import org.testng.collections.Lists;
 
 import java.util.List;
 
 public class GroupByInstancesSampleTest {
   private String m_country;
-  public static List<String> m_log;
+  public static List<String> m_log = Lists.newArrayList();
 
   private static void log(String method, String country) {
     m_log.add(method + "#" + country);
@@ -36,4 +37,9 @@
   public void signOut() {
     log("signOut", m_country);
   }
+
+  @Override
+  public String toString() {
+    return "[GroupByInstancesSampleTest: " + m_country + "]";
+  }
 }
diff --git a/src/test/java/test/factory/BaseFactory.java b/src/test/java/test/factory/BaseFactory.java
index 8d8fe3d..6ad2e0c 100644
--- a/src/test/java/test/factory/BaseFactory.java
+++ b/src/test/java/test/factory/BaseFactory.java
@@ -17,4 +17,13 @@
   @Test
   public void f() {
   }
+
+  /**
+   * @@@ for some reason, the test results get added in the wrong order if
+   * I don't define a toString() method. Need to investigate.
+   */
+  @Override
+  public String toString() {
+    return "[" + getClass().getName() + " " + getN() + "]";
+  }
 }
diff --git a/src/test/java/test/factory/FactoryDataProviderSampleTest.java b/src/test/java/test/factory/FactoryDataProviderSampleTest.java
index 822c4d5..3ce8db6 100644
--- a/src/test/java/test/factory/FactoryDataProviderSampleTest.java
+++ b/src/test/java/test/factory/FactoryDataProviderSampleTest.java
@@ -19,4 +19,13 @@
     };
   }
 
+  @Override
+  public String toString() {
+    return "[FactoryDataProviderSampleTest " + getN() + "]";
+  }
+
+  @Test
+  public void f() {
+//    System.out.println("Test:" + getN());
+  }
 }
diff --git a/src/test/java/test/factory/FactoryDataProviderTest.java b/src/test/java/test/factory/FactoryDataProviderTest.java
index e5cfeb7..b8f91de 100644
--- a/src/test/java/test/factory/FactoryDataProviderTest.java
+++ b/src/test/java/test/factory/FactoryDataProviderTest.java
@@ -43,8 +43,11 @@
     Assert.assertEquals(tla.getPassedTests().size(), 2);
     Iterator<ITestResult> iterator = tla.getPassedTests().iterator();
     BaseFactory t1 = (BaseFactory) iterator.next().getInstance();
-    Assert.assertEquals(t1.getN(), n1);
     BaseFactory t2 = (BaseFactory) iterator.next().getInstance();
+//    Assert.assertTrue(t1.getN() == n1 || t1.getN() == n2);
+//    Assert.assertTrue(t2.getN() == n1 || t2.getN() == n2);
+//    System.out.println("Results:" + t1.getN() + " " + t2.getN());
+    Assert.assertEquals(t1.getN(), n1);
     Assert.assertEquals(t2.getN(), n2);
   }
 }
diff --git a/src/test/java/test/factory/FactoryDataProviderWithNoArgCtorSampleErrorTest.java b/src/test/java/test/factory/FactoryDataProviderWithNoArgCtorSampleErrorTest.java
index 8ba6c59..e8ac513 100644
--- a/src/test/java/test/factory/FactoryDataProviderWithNoArgCtorSampleErrorTest.java
+++ b/src/test/java/test/factory/FactoryDataProviderWithNoArgCtorSampleErrorTest.java
@@ -21,4 +21,8 @@
       new Object[] { 46 },
     };
   }
+  @Override
+  public String toString() {
+    return "[FactoryDataProviderWithNoArgCtorSampleErrorTest " + getN() + "]";
+  }
 }
diff --git a/src/test/java/test/factory/FactoryInterleavingTest.java b/src/test/java/test/factory/FactoryInterleavingTest.java
index e800fc3..89e8d66 100644
--- a/src/test/java/test/factory/FactoryInterleavingTest.java
+++ b/src/test/java/test/factory/FactoryInterleavingTest.java
@@ -28,6 +28,11 @@
         10, 11, 12, 13,
     };
     Integer[] logArray = LOG.toArray(new Integer[LOG.size()]);
-    Assert.assertTrue(Arrays.equals(logArray, valid1) || Arrays.equals(logArray, valid2));
+    if (! logArray.equals(valid1)) {
+      Assert.assertEquals(logArray, valid1);
+    } else if (! logArray.equals(valid2)) {
+      System.err.println(logArray + " " + valid2);
+      Assert.assertEquals(logArray, valid2);
+    }
   }
 }