Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/Runner.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/Runner.java	(revision 68)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/Runner.java	(revision 69)
@@ -45,5 +45,5 @@
     public static void main(String[] args) {
         new TextConsole(Level.FINE);
-        final int concurrentThreads = Runtime.getRuntime().availableProcessors() - 2;
+        final int concurrentThreads = Runtime.getRuntime().availableProcessors();
         final ExecutorService threadPool = Executors.newFixedThreadPool(concurrentThreads);
         for (String arg : args) {
@@ -89,5 +89,5 @@
 
         if (config != null) {
-            Console.trace(Level.FINE, config.toString());
+            Console.trace(Level.FINEST, config.toString());
             // Instantiate the class like it was given as parameter in the config file and cast it
             // to the interface
Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/IResultStorage.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/IResultStorage.java	(revision 68)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/IResultStorage.java	(revision 69)
@@ -4,3 +4,5 @@
 
     public void addResult(ExperimentResult result);
+    
+    public boolean 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 68)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/eval/MySQLResultStorage.java	(revision 69)
@@ -4,4 +4,5 @@
 import java.sql.Connection;
 import java.sql.DriverManager;
+import java.sql.ResultSet;
 import java.sql.SQLException;
 import java.sql.Statement;
@@ -34,15 +35,4 @@
 
     public void addResult(ExperimentResult result) {
-        Statement stmt;
-        try {
-            stmt = con.createStatement();
-        }
-        catch (SQLException e) {
-            Console.printerr("Problem with MySQL connection: ");
-            Console.printerr("SQLException: " + e.getMessage());
-            Console.printerr("SQLState: " + e.getSQLState());
-            Console.printerr("VendorError: " + e.getErrorCode());
-            return;
-        }
         StringBuilder sql = new StringBuilder();
         sql.append("INSERT INTO crosspare.results VALUES (NULL,");
@@ -72,5 +62,8 @@
         sql.append(result.getTn()+",");
         sql.append(result.getFp()+");");
+        
+        Statement stmt;
         try {
+            stmt = con.createStatement();
             stmt.executeUpdate(sql.toString().replace("NaN", "NULL"));
         }
@@ -84,4 +77,23 @@
     }
     
-    //public boolean containsResult(String configurationName, String productName, String classifier);
+    @Override
+    public boolean 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 = con.createStatement();
+            ResultSet results = stmt.executeQuery(sql);
+            results.next();
+            int count = results.getInt("cnt");
+            contained = count>0;
+        }
+        catch (SQLException e) {
+            Console.printerr("Problem with MySQL connection: \n");
+            Console.printerr("SQLException: " + e.getMessage() + "\n");
+            Console.printerr("SQLState: " + e.getSQLState() + "\n");
+            Console.printerr("VendorError: " + e.getErrorCode() + "\n");
+        }
+        return contained;
+    }
 }
Index: trunk/CrossPare/src/de/ugoe/cs/cpdp/execution/AbstractCrossProjectExperiment.java
===================================================================
--- trunk/CrossPare/src/de/ugoe/cs/cpdp/execution/AbstractCrossProjectExperiment.java	(revision 68)
+++ trunk/CrossPare/src/de/ugoe/cs/cpdp/execution/AbstractCrossProjectExperiment.java	(revision 69)
@@ -29,4 +29,5 @@
 import de.ugoe.cs.cpdp.dataselection.ISetWiseDataselectionStrategy;
 import de.ugoe.cs.cpdp.eval.IEvaluationStrategy;
+import de.ugoe.cs.cpdp.eval.IResultStorage;
 import de.ugoe.cs.cpdp.loader.IVersionLoader;
 import de.ugoe.cs.cpdp.training.ISetWiseTestdataAwareTrainingStrategy;
@@ -163,4 +164,13 @@
                                               config.getExperimentName(), versionCount,
                                               testVersionCount, testVersion.getVersion()));
+                if (resultsAvailable(testVersion)) {
+                    Console.traceln(Level.INFO,
+                                    String.format(
+                                                  "[%s] [%02d/%02d] %s: results already available; skipped",
+                                                  config.getExperimentName(), versionCount,
+                                                  testVersionCount, testVersion.getVersion()));
+                    versionCount++;
+                    continue;
+                }
 
                 // Setup testdata and training data
@@ -299,5 +309,6 @@
                             config.getExperimentName() + ".csv");
                     }
-                    evaluator.apply(testdata, traindata, allTrainers, writeHeader, config.getResultStorages());
+                    evaluator.apply(testdata, traindata, allTrainers, writeHeader,
+                                    config.getResultStorages());
                     writeHeader = false;
                 }
@@ -327,3 +338,14 @@
         return result;
     }
+
+    private boolean resultsAvailable(SoftwareVersion version) {
+        if (config.getResultStorages().isEmpty()) {
+            return false;
+        }
+        boolean available = true;
+        for (IResultStorage storage : config.getResultStorages()) {
+            available &= storage.containsResult(config.getExperimentName(), version.getVersion());
+        }
+        return available;
+    }
 }
