Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/ExperimentConfiguration.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/ExperimentConfiguration.java	(revision 97)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/ExperimentConfiguration.java	(revision 98)
@@ -161,4 +161,9 @@
      */
     private Boolean saveClassifier = null;
+    
+    /**
+     * number of repetitions of an experiment (to account for randomness)
+     */
+    private int repetitions = 1;
 
     /**
@@ -421,4 +426,13 @@
         return saveClassifier;
     }
+    
+    /**
+     * number of repetitions of an experiment
+     *
+     * @return number of repetitions
+     */
+    public int getRepetitions() {
+        return repetitions;
+    }
 
     /**
@@ -564,4 +578,7 @@
             else if (qName.equals("saveClassifier")) {
                 saveClassifier = true;
+            }
+            else if( qName.equals("repetitions")) {
+                repetitions = Integer.parseInt(attributes.getValue("number"));
             }
             else if (qName.equals("executionStrategy")) {
Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/IResultStorage.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/IResultStorage.java	(revision 97)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/IResultStorage.java	(revision 98)
@@ -43,7 +43,6 @@
      * @param productName
      *            name of the product
-     * @return true of the results ofr the given product and experiment are contained in the result
-     *         storage
+     * @return number of contained resultsfor the given product and experiment
      */
-    public boolean containsResult(String experimentName, String productName);
+    public int containsResult(String experimentName, String productName);
 }
Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/MySQLResultStorage.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/MySQLResultStorage.java	(revision 97)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/MySQLResultStorage.java	(revision 98)
@@ -162,15 +162,13 @@
      */
     @Override
-    public boolean containsResult(String experimentName, String productName) {
+    public int containsResult(String experimentName, String productName) {
         String sql = "SELECT COUNT(*) as cnt FROM crosspare.results WHERE configurationName=\'" +
             experimentName + "\' AND productName=\'" + productName + "\';";
         Statement stmt;
-        boolean contained = false;
         try {
             stmt = connectionPool.getConnection().createStatement();
             ResultSet results = stmt.executeQuery(sql);
             results.next();
-            int count = results.getInt("cnt");
-            contained = count > 0;
+            return results.getInt("cnt");
         }
         catch (SQLException e) {
@@ -179,8 +177,6 @@
             Console.printerr("SQLState: " + e.getSQLState() + "\n");
             Console.printerr("VendorError: " + e.getErrorCode() + "\n");
-            Console.printerr("\nskipping product since we could not check if the results is available");
-            contained = true;
+            return 0;
         }
-        return contained;
     }
 }
Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/execution/AbstractCrossProjectExperiment.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/execution/AbstractCrossProjectExperiment.java	(revision 97)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/execution/AbstractCrossProjectExperiment.java	(revision 98)
@@ -148,4 +148,5 @@
         int versionCount = 1;
         int testVersionCount = 0;
+        int numTrainers = 0;
 
         for (SoftwareVersion testVersion : versions) {
@@ -154,4 +155,9 @@
             }
         }
+        
+        numTrainers += config.getSetWiseTrainers().size();
+        numTrainers += config.getSetWiseTestdataAwareTrainers().size();
+        numTrainers += config.getTrainers().size();
+        numTrainers += config.getTestAwareTrainers().size();
 
         // sort versions
@@ -164,5 +170,6 @@
                                               config.getExperimentName(), versionCount,
                                               testVersionCount, testVersion.getVersion()));
-                if (resultsAvailable(testVersion)) {
+                int numResultsAvailable = resultsAvailable(testVersion);
+                if (numResultsAvailable >= numTrainers*config.getRepetitions()) {
                     Console.traceln(Level.INFO,
                                     String.format(
@@ -339,11 +346,14 @@
     }
 
-    private boolean resultsAvailable(SoftwareVersion version) {
+    private int resultsAvailable(SoftwareVersion version) {
         if (config.getResultStorages().isEmpty()) {
-            return false;
-        }
-        boolean available = true;
+            return 0;
+        }
+        int available = Integer.MAX_VALUE;
         for (IResultStorage storage : config.getResultStorages()) {
-            available &= storage.containsResult(config.getExperimentName(), version.getVersion());
+            int curAvailable = storage.containsResult(config.getExperimentName(), version.getVersion());
+            if( curAvailable<available ) {
+                available = curAvailable;
+            }
         }
         return available;
