diff --git a/src/test/java/org/apache/sling/launchpad/testing/LoggingSuite.java b/src/test/java/org/apache/sling/launchpad/testing/LoggingSuite.java
index ef01bde..581a28b 100644
--- a/src/test/java/org/apache/sling/launchpad/testing/LoggingSuite.java
+++ b/src/test/java/org/apache/sling/launchpad/testing/LoggingSuite.java
@@ -16,10 +16,7 @@
  */
 package org.apache.sling.launchpad.testing;
 
-import java.util.Set;
-
 import junit.framework.Test;
-import junit.framework.TestCase;
 import junit.framework.TestResult;
 import junit.framework.TestSuite;
 
@@ -38,8 +35,8 @@
 
     private int lastFailures;
 
-    LoggingSuite(Set<Class<TestCase>> classSet, String name, Logger logger) {
-        super(classSet.toArray(new Class[classSet.size()]), name);
+    LoggingSuite(String name, Logger logger) {
+        super(name);
         this.logger = logger;
     }
 
@@ -51,9 +48,7 @@
 
     @Override
     public void runTest(Test test, TestResult result) {
-        final String name = (test instanceof TestSuite)
-                ? ((TestSuite) test).getName()
-                : test.getClass().getName();
+        final String name = getName(test); 
         final String startMessage = String.format("Running %s", name);
         System.out.println(startMessage);
         logger.info(startMessage);
@@ -72,5 +67,9 @@
         lastFailures = result.failureCount();
         lastErrors = result.errorCount();
     }
+    
+    private String getName(Test t) {
+        return (t instanceof TestSuite) ? ((TestSuite) t).getName() : t.toString();
+    }
 
 }
diff --git a/src/test/java/org/apache/sling/launchpad/testing/TestAll.java b/src/test/java/org/apache/sling/launchpad/testing/TestAll.java
index e03abef..17f38ed 100644
--- a/src/test/java/org/apache/sling/launchpad/testing/TestAll.java
+++ b/src/test/java/org/apache/sling/launchpad/testing/TestAll.java
@@ -16,13 +16,6 @@
  */
 package org.apache.sling.launchpad.testing;
 
-import junit.framework.Test;
-import junit.framework.TestCase;
-import junit.framework.TestSuite;
-
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
 import java.io.File;
 import java.io.IOException;
 import java.lang.reflect.Modifier;
@@ -31,21 +24,28 @@
 import java.net.URLClassLoader;
 import java.util.ArrayList;
 import java.util.Enumeration;
-import java.util.HashSet;
 import java.util.List;
-import java.util.Set;
 import java.util.jar.JarEntry;
 import java.util.jar.JarFile;
 import java.util.regex.Pattern;
 
-/**
- *
- */
-public class TestAll extends TestCase {
+import junit.framework.JUnit4TestAdapter;
+import junit.framework.TestCase;
+import junit.framework.TestSuite;
+
+import static org.junit.Assert.fail;
+import org.junit.runner.RunWith;
+import org.junit.runners.AllTests;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/** Collect our tests and run them with our LoggingSuite */
+ @RunWith(AllTests.class)
+public class TestAll {
     private static final Logger LOGGER = LoggerFactory.getLogger(TestAll.class);
 
     @SuppressWarnings("unchecked")
-    public static Test suite() {
+    public static TestSuite suite() {
         final ClassLoader sysClassLoader = TestAll.class.getClassLoader();
         final List<String> matchingClasses = new ArrayList<String>();
         // Get the URLs
@@ -63,24 +63,27 @@
                 e.printStackTrace();
             }
         }
-        final Set<Class<TestCase>> classSet = new HashSet<Class<TestCase>>();
+        
+        final TestSuite suite = new LoggingSuite("Sling Integration Tests matching " + testPattern, LOGGER);
+        int counter=0;
         for (String classFile : matchingClasses) {
             String className = classFileToName(classFile);
             try {
                 final Class<TestCase> c = (Class<TestCase>) sysClassLoader.loadClass(className);
                 if (!c.isInterface() && !Modifier.isAbstract(c.getModifiers())) {
+                    suite.addTest(new JUnit4TestAdapter(c));
+                    counter++;
                     LOGGER.info("Added " + className);
-                    classSet.add(c);
                 }
             } catch (ClassNotFoundException e) {
                 e.printStackTrace();
             }
         }
-        LOGGER.info(classSet.size() + " test classes found using Pattern "
-            + testRegex);
-        TestSuite suite = new LoggingSuite(classSet,
-            "Sling Integration Tests matching " + testPattern, LOGGER);
-
+        
+        if(counter==0) {
+            fail("No test classes found in classpath using Pattern " + testRegex);
+        }
+        LOGGER.info("{} test classes found using Pattern {}", counter, testRegex);
         return suite;
     }
 
