A factory method may not be public
diff --git a/src/main/java/org/testng/internal/ClassHelper.java b/src/main/java/org/testng/internal/ClassHelper.java
index ac10ec0..5b854a0 100644
--- a/src/main/java/org/testng/internal/ClassHelper.java
+++ b/src/main/java/org/testng/internal/ClassHelper.java
@@ -132,14 +132,12 @@
    * @param finder The finder (JDK 1.4 or JDK 5.0+) use to search for the annotation.
    *
    * @return the @Factory <CODE>method</CODE> or null
-   *
-   * FIXME: @Factory method must be public!
    */
   public static ConstructorOrMethod findDeclaredFactoryMethod(Class<?> cls,
       IAnnotationFinder finder) {
     ConstructorOrMethod result = null;
 
-    for (Method method : cls.getMethods()) {
+    for (Method method : getAvailableMethods(cls)) {
       IFactoryAnnotation f = finder.findAnnotation(method, IFactoryAnnotation.class);
 
       if (null != f) {
@@ -183,7 +181,7 @@
     methods.addAll(Arrays.asList(clazz.getDeclaredMethods()));
 
     Class<?> parent = clazz.getSuperclass();
-    while (Object.class != parent) {
+    while (null != parent) {
       methods.addAll(extractMethods(clazz, parent, methods));
       parent = parent.getSuperclass();
     }
diff --git a/src/main/java/org/testng/internal/TestNGClassFinder.java b/src/main/java/org/testng/internal/TestNGClassFinder.java
index 8ccbe42..8920c7d 100644
--- a/src/main/java/org/testng/internal/TestNGClassFinder.java
+++ b/src/main/java/org/testng/internal/TestNGClassFinder.java
@@ -20,6 +20,8 @@
 import org.testng.xml.XmlClass;
 import org.testng.xml.XmlTest;
 
+import static org.testng.internal.ClassHelper.getAvailableMethods;
+
 /**
  * This class creates an ITestClass from a test class.
  *
@@ -218,16 +220,16 @@
    * @return true if this class contains TestNG annotations (either on itself
    * or on a superclass).
    */
-  public static boolean isTestNGClass(Class c, IAnnotationFinder annotationFinder) {
+  public static boolean isTestNGClass(Class<?> c, IAnnotationFinder annotationFinder) {
     Class[] allAnnotations= AnnotationHelper.getAllAnnotations();
-    Class cls = c;
+    Class<?> cls = c;
 
     try {
       for(Class annotation : allAnnotations) {
 
         for (cls = c; cls != null; cls = cls.getSuperclass()) {
           // Try on the methods
-          for (Method m : cls.getMethods()) {
+          for (Method m : getAvailableMethods(cls)) {
             IAnnotation ma= annotationFinder.findAnnotation(m, annotation);
             if(null != ma) {
               return true;
diff --git a/src/test/java/test/factory/FactoryIntegrationTest.java b/src/test/java/test/factory/FactoryIntegrationTest.java
index 169bdf0..a729f4c 100644
--- a/src/test/java/test/factory/FactoryIntegrationTest.java
+++ b/src/test/java/test/factory/FactoryIntegrationTest.java
@@ -1,5 +1,6 @@
 package test.factory;
 
+import org.testng.Assert;
 import org.testng.TestListenerAdapter;
 import org.testng.TestNG;
 import org.testng.TestNGException;
@@ -24,4 +25,15 @@
             assertThat(e).hasMessage("\nCan't invoke public java.lang.Object[] test.factory.GitHub876Sample.createInstances(): either make it static or add a no-args constructor to your class");
         }
     }
+
+    @Test
+    public void testNonPublicFactoryMethodShouldWork() {
+        TestNG tng = create(NonPublicFactoryMethodSample.class);
+        TestListenerAdapter tla = new TestListenerAdapter();
+        tng.addListener(tla);
+
+        tng.run();
+
+        Assert.assertEquals(tla.getPassedTests().size(), 2);
+    }
 }
diff --git a/src/test/java/test/factory/NonPublicFactoryMethodSample.java b/src/test/java/test/factory/NonPublicFactoryMethodSample.java
new file mode 100644
index 0000000..7feb6ef
--- /dev/null
+++ b/src/test/java/test/factory/NonPublicFactoryMethodSample.java
@@ -0,0 +1,14 @@
+package test.factory;
+
+import org.testng.annotations.Factory;
+
+public class NonPublicFactoryMethodSample {
+
+    @Factory
+    private Object[] createInstances() {
+        return new Object[] {
+                new BaseFactory(42),
+                new BaseFactory(43)
+        };
+    }
+}