diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/ThreadParameters.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/ThreadParameters.java
index 2a080ee0d7707b35ea1437085626f701b5650a50..eba8b7f1cbc2a0bbd0320c785c777511916bc782 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/ThreadParameters.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/ThreadParameters.java
@@ -59,7 +59,7 @@ public final class ThreadParameters
      * A path to a script which should be invoked to validate the data set.
      */
     @Private
-    static final String VALIDATION_SCRIPT_KEY = "validation-script";
+    static final String VALIDATION_SCRIPT_KEY = "validation-script-path";
 
     @Private
     static final String GROUP_CODE_KEY = "group-code";
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/DataSetTypeToRegistratorMapper.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/DataSetTypeToRegistratorMapper.java
index f4dc90e03a07644f373713fbe3c6f855f1a5ec5e..672a82bb2441b1a7b49c0caa8ad0de66a4455c27 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/DataSetTypeToRegistratorMapper.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/DataSetTypeToRegistratorMapper.java
@@ -163,9 +163,9 @@ class DataSetTypeToRegistratorMapper
 
             return ETLDaemon.createTopLevelDataSetRegistrator(params.getProperties(),
                     defaultThread, shareId, openBISService, mailClient, dataSetValidator, false,
-                    false, false, firstThread.tryGetPreRegistrationScript(),
-                    firstThread.tryGetPostRegistrationScript(), firstThread.tryValidationScript(),
-                    PutDataSetServerPluginHolder.class);
+                    false, false, defaultThread.tryGetPreRegistrationScript(),
+                    defaultThread.tryGetPostRegistrationScript(),
+                    defaultThread.tryValidationScript(), PutDataSetServerPluginHolder.class);
         }
 
         public HashMap<String, ITopLevelDataSetRegistrator> getHandlerMap()
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java
index 2915d47f77a2332a9103d2686139cfad9c61efd2..40e81371047dea32ea83274d67264211df794fa9 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java
@@ -199,6 +199,11 @@ public class PutDataSetService
      */
     public String getValidationScript(String dataSetTypeOrNull)
     {
+        if (false == isInitialized)
+        {
+            doInitialization();
+        }
+
         ITopLevelDataSetRegistrator registrator =
                 registratorMap.getRegistratorForType(dataSetTypeOrNull);
         TopLevelDataSetRegistratorGlobalState globalState = registrator.getGlobalState();
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/cli/CommandTestValid.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/cli/CommandTestValid.java
index 8a4216d4774914213451ce84e8bfb8d9637e7994..6e673d1ba557122413b8b343a1544618e4e40e1a 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/cli/CommandTestValid.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/cli/CommandTestValid.java
@@ -243,7 +243,7 @@ class CommandTestValid extends AbstractDssCommand<CommandTestValid.CommandTestVa
     @Override
     protected String getRequiredArgumentsString()
     {
-        return "<owner type> <owner> <path> <script>";
+        return "<owner type> <owner> <path> [<script>]";
     }
 
     /**
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClient.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClient.java
index 1e1dfad27f1b0cd68fdf673d287a7a2906524e9d..e84b90853aa9daecb8e58038bd7542c660e15d23 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClient.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/gui/DataSetUploadClient.java
@@ -27,6 +27,7 @@ import java.awt.GridBagLayout;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 import java.util.ArrayList;
+import java.util.Properties;
 
 import javax.swing.Box;
 import javax.swing.BoxLayout;
@@ -45,6 +46,8 @@ import javax.swing.event.ListSelectionListener;
 import javax.swing.table.TableCellRenderer;
 import javax.swing.table.TableColumn;
 
+import org.python.core.PySystemState;
+
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.utilities.ITimeProvider;
@@ -69,8 +72,31 @@ public class DataSetUploadClient extends AbstractSwingGUI
     static
     {
         // Disable any logging output.
+        // System.setProperty("org.apache.commons.logging.Log",
+        // "org.apache.commons.logging.impl.NoOpLog");
+
+        // Provide some logging
         System.setProperty("org.apache.commons.logging.Log",
-                "org.apache.commons.logging.impl.NoOpLog");
+                "org.apache.commons.logging.impl.SimpleLog");
+        System.setProperty("org.apache.commons.logging.simplelog.showdatetime", "true");
+
+        // Properties baseProperties = System.getProperties();
+        // String path =
+        // PySystemState.class.getProtectionDomain().getCodeSource().getLocation().getPath();
+        // System.out.println(path);
+        // baseProperties.setProperty("python.home", path);
+        //
+        // PySystemState.initialize(baseProperties, null, new String[]
+        // { "" });
+
+        Properties baseProperties = System.getProperties();
+        String path = PySystemState.class.getResource("PySystemState.class").getPath();
+        path = path.substring(5, path.indexOf("!"));
+        System.out.println(path);
+        baseProperties.setProperty("python.home", path);
+
+        PySystemState.initialize(baseProperties, null, new String[]
+            { "" });
     }
 
     private static final String TITLE = "Data Set Uploader";
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/DssComponent.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/DssComponent.java
index a572760ad4e461d2125a5e5da4224b38d7704696..f7cb501d317c0122026f5a4cf08d334485c3db60 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/DssComponent.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/DssComponent.java
@@ -24,6 +24,8 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 
+import org.python.core.Py;
+import org.python.core.PyException;
 import org.springframework.remoting.RemoteAccessException;
 import org.springframework.remoting.RemoteConnectFailureException;
 
@@ -319,7 +321,8 @@ class AuthenticatedState extends AbstractDssComponentState
 
     private final IRpcServiceFactory dssServiceFactory;
 
-    private final HashMap<String, String> validationScriptCache = new HashMap<String, String>();
+    private final HashMap<String, ValidationScriptRunner> validationScriptRunnerCache =
+            new HashMap<String, ValidationScriptRunner>();
 
     AuthenticatedState(IGeneralInformationService generalOpenBisService,
             IRpcServiceFactory dssServiceFactory, String sessionToken)
@@ -573,22 +576,50 @@ class AuthenticatedState extends AbstractDssComponentState
         }
 
         String dataSetTypeOrNull = newDataset.tryDataSetType();
-        String validationScript;
+        ValidationScriptRunner runner;
+
         // Check if the script is in the cache
-        if (validationScriptCache.containsKey(dataSetTypeOrNull))
+        if (validationScriptRunnerCache.containsKey(dataSetTypeOrNull))
         {
-            validationScript = validationScriptCache.get(dataSetTypeOrNull);
+            runner = validationScriptRunnerCache.get(dataSetTypeOrNull);
         } else
         {
-            validationScript = dssService.getValidationScript(sessionToken, dataSetTypeOrNull);
-            validationScriptCache.put(dataSetTypeOrNull, validationScript);
+
+            String validationScript =
+                    dssService.getValidationScript(sessionToken, dataSetTypeOrNull);
+            try
+            {
+                runner = ValidationScriptRunner.createValidatorFromScriptString(validationScript);
+                validationScriptRunnerCache.put(dataSetTypeOrNull, runner);
+            } catch (PyException ex)
+            {
+                System.err.println("Could not create validation script ");
+                System.err.println(validationScript);
+                System.err.println(ex);
+                ex.printStackTrace(System.err);
+                System.err.println(Py.getSystemState().modules);
+
+                return new ArrayList<ValidationError>();
+            } catch (Throwable ex)
+            {
+                System.err.println("Could not create validation script ");
+                System.err.println(validationScript);
+                System.err.println(ex);
+                ex.printStackTrace(System.err);
+
+                return new ArrayList<ValidationError>();
+            }
         }
-        if (null == validationScript)
+
+        try
+        {
+            return runner.validate(dataSetFile);
+        } catch (Throwable ex)
         {
+            System.err.println("Could not run validation script: ");
+            System.err.println(runner.getScriptString());
+            ex.printStackTrace(System.err);
             return new ArrayList<ValidationError>();
         }
-        ValidationScriptRunner runner =
-                ValidationScriptRunner.createValidatorFromScriptString(validationScript);
-        return runner.validate(dataSetFile);
     }
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/validation/ValidationScriptRunner.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/validation/ValidationScriptRunner.java
index 73d065f0106f5a30c7289231ea74f770a4875ea1..ff64c5dc1e89ab67d7b655d241afbcf0cb6c45f7 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/validation/ValidationScriptRunner.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/v1/validation/ValidationScriptRunner.java
@@ -61,6 +61,10 @@ public class ValidationScriptRunner
      */
     public static ValidationScriptRunner createValidatorFromScriptString(String scriptString)
     {
+        if (scriptString == null)
+        {
+            return new NullValidationScriptRunner();
+        }
         String theScriptString = getValidationScriptString(scriptString);
         return new ValidationScriptRunner(theScriptString);
     }
@@ -111,6 +115,11 @@ public class ValidationScriptRunner
         return errors;
     }
 
+    public String getScriptString()
+    {
+        return scriptString;
+    }
+
     private PyFunction tryJythonFunction(String functionName)
     {
         try