diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/DynamicTransactionQueryFactory.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DynamicTransactionQueryFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..0f30f274834f7208b70ebf1fed6e0be0f699e70e
--- /dev/null
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DynamicTransactionQueryFactory.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright 2011 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.etlserver;
+
+import javax.sql.DataSource;
+
+import net.lemnik.eodsql.DynamicTransactionQuery;
+import net.lemnik.eodsql.QueryTool;
+import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
+
+/**
+ * A factory class for creating dynamic transaction queries.
+ * 
+ * @author Chandrasekhar Ramakrishnan
+ */
+public class DynamicTransactionQueryFactory
+{
+    /**
+     * Create a DynamicTransactionQuery for the given data source.
+     */
+    public DynamicTransactionQuery createDynamicTransactionQuery(String dataSourceName)
+    {
+        DataSource dataSource =
+                ServiceProvider.getDataSourceProvider().getDataSource(dataSourceName);
+        return QueryTool.getQuery(dataSource, DynamicTransactionQuery.class);
+    }
+}
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java
index 8b0cda24eb3ff8eb83eebf165ff60a0b582f0e03..d48f91516d10f12c1d264f39c585c29fb95da9f9 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java
@@ -331,7 +331,8 @@ public final class ETLDaemon
         TopLevelDataSetRegistratorGlobalState globalState =
                 new TopLevelDataSetRegistratorGlobalState(dssCode, shareId, storeRootDir,
                         openBISService, mailClient, dataSetValidator, dataSourceQueryService,
-                        notifySuccessfulRegistration, threadParameters);
+                        new DynamicTransactionQueryFactory(), notifySuccessfulRegistration,
+                        threadParameters);
 
         ITopLevelDataSetRegistrator registrator =
                 ClassUtils.create(ITopLevelDataSetRegistrator.class, threadParameters
@@ -360,9 +361,10 @@ public final class ETLDaemon
         TopLevelDataSetRegistratorGlobalState globalState =
                 new TopLevelDataSetRegistratorGlobalState(dssCode, shareId, storeRootDir,
                         openBISService, mailClient, dataSetValidator, dataSourceQueryService,
-                        notifySuccessfulRegistration, threadParameters, useIsFinishedMarkerFile,
-                        deleteUnidentified, preRegistrationScriptOrNull,
-                        postRegistrationScriptOrNull, validationScriptsOrNull);
+                        new DynamicTransactionQueryFactory(), notifySuccessfulRegistration,
+                        threadParameters, useIsFinishedMarkerFile, deleteUnidentified,
+                        preRegistrationScriptOrNull, postRegistrationScriptOrNull,
+                        validationScriptsOrNull);
 
         ITopLevelDataSetRegistrator registrator =
                 ClassUtils
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/TopLevelDataSetRegistratorGlobalState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/TopLevelDataSetRegistratorGlobalState.java
index 47c23d72900db8417d652846a3a3cd255da8c5b2..59c86bd84d9c5e5dc00fa031514fcb71c2ebed7c 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/TopLevelDataSetRegistratorGlobalState.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/TopLevelDataSetRegistratorGlobalState.java
@@ -64,6 +64,8 @@ public class TopLevelDataSetRegistratorGlobalState
 
     private final boolean deleteUnidentified;
 
+    private final DynamicTransactionQueryFactory dynamicTransactionQueryFactory;
+
     private final String preRegistrationScriptOrNull;
 
     private final String postRegistrationScriptOrNull;
@@ -85,11 +87,11 @@ public class TopLevelDataSetRegistratorGlobalState
     public TopLevelDataSetRegistratorGlobalState(String dssCode, String shareId, File storeRootDir,
             IEncapsulatedOpenBISService openBisService, IMailClient mailClient,
             IDataSetValidator dataSetValidator, IDataSourceQueryService dataSourceQueryService,
-            boolean notifySuccessfulRegistration,
-            ThreadParameters threadParameters)
+            DynamicTransactionQueryFactory dynamicTransactionQueryFactory,
+            boolean notifySuccessfulRegistration, ThreadParameters threadParameters)
     {
         this(dssCode, shareId, storeRootDir, openBisService, mailClient, dataSetValidator,
-                dataSourceQueryService,
+                dataSourceQueryService, dynamicTransactionQueryFactory,
                 notifySuccessfulRegistration, threadParameters, threadParameters
                         .useIsFinishedMarkerFile(), threadParameters.deleteUnidentified(),
                 threadParameters.tryGetPreRegistrationScript(), threadParameters
@@ -99,8 +101,10 @@ public class TopLevelDataSetRegistratorGlobalState
     public TopLevelDataSetRegistratorGlobalState(String dssCode, String shareId, File storeRootDir,
             IEncapsulatedOpenBISService openBisService, IMailClient mailClient,
             IDataSetValidator dataSetValidator, IDataSourceQueryService dataSourceQueryService,
+            DynamicTransactionQueryFactory dynamicTransactionQueryFactory,
             boolean notifySuccessfulRegistration, ThreadParameters threadParameters,
             boolean useIsFinishedMarkerFile, boolean deleteUnidentified,
+
             String preRegistrationScriptOrNull, String postRegistrationScriptOrNull,
             String[] validationScriptsOrNull)
     {
@@ -111,6 +115,7 @@ public class TopLevelDataSetRegistratorGlobalState
         this.mailClient = mailClient;
         this.dataSetValidator = dataSetValidator;
         this.dataSourceQueryService = dataSourceQueryService;
+        this.dynamicTransactionQueryFactory = dynamicTransactionQueryFactory;
         this.notifySuccessfulRegistration = notifySuccessfulRegistration;
         this.threadParameters = threadParameters;
         this.useIsFinishedMarkerFile = useIsFinishedMarkerFile;
@@ -155,6 +160,11 @@ public class TopLevelDataSetRegistratorGlobalState
         return dataSourceQueryService;
     }
 
+    public DynamicTransactionQueryFactory getDynamicTransactionQueryFactory()
+    {
+        return dynamicTransactionQueryFactory;
+    }
+
     public boolean isNotifySuccessfulRegistration()
     {
         return notifySuccessfulRegistration;
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
index 7b3d1b8ec8977a8f66fa7159d2c6c825f543a744..e79cdb405cac584d0d6bee5d25e2ffd6ac74384f 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
@@ -23,10 +23,9 @@ import java.util.List;
 import java.util.Map;
 
 import net.lemnik.eodsql.DynamicTransactionQuery;
-import net.lemnik.eodsql.QueryTool;
-
 import ch.systemsx.cisd.common.exceptions.NotImplementedException;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
+import ch.systemsx.cisd.etlserver.DynamicTransactionQueryFactory;
 import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationDetails;
 import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationService;
 import ch.systemsx.cisd.etlserver.registrator.DataSetStorageAlgorithm;
@@ -445,7 +444,10 @@ abstract class AbstractTransactionState<T extends DataSetInformation>
             DynamicTransactionQuery query = queriesToCommit.get(dataSourceName);
             if (null == query)
             {
-                query = QueryTool.getQuery(DynamicTransactionQuery.class);
+                DynamicTransactionQueryFactory factory =
+                        registrationService.getRegistratorContext().getGlobalState()
+                                .getDynamicTransactionQueryFactory();
+                query = factory.createDynamicTransactionQuery(dataSourceName);
                 queriesToCommit.put(dataSourceName, query);
             }
             return query;
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java
index 85414ba797adb11fa6466f98a5b8aa421fd71355..826dcb9c39fdbb894cd7c9d55edb0e9c46389596 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java
@@ -288,7 +288,7 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC
                 new TopLevelDataSetRegistratorGlobalState("dss",
                         ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID,
                         workingDirectory, authorizedLimsService, mailClient, dataSetValidator,
-                        null, true, threadParameters);
+                        null, new DynamicTransactionQueryFactory(), true, threadParameters);
 
         context.checking(new Expectations()
             {
@@ -807,7 +807,7 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC
                 new TopLevelDataSetRegistratorGlobalState("dss",
                         ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID,
                         workingDirectory, authorizedLimsService, mailClient, dataSetValidator,
-                        null, true, threadParameters);
+                        null, new DynamicTransactionQueryFactory(), true, threadParameters);
         context.checking(new Expectations()
             {
                 {
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java
index 79c4c14261bf36f1112836efe34fe96236517e4f..89db4e3fc46130f43186d7f84c197e4aadf8f9de 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/AbstractJythonDataSetHandlerTest.java
@@ -22,9 +22,12 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
 
+import net.lemnik.eodsql.DynamicTransactionQuery;
+
 import org.apache.commons.io.FileUtils;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
+import org.python.core.PyFunction;
 import org.python.util.PythonInterpreter;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.AfterTest;
@@ -39,7 +42,10 @@ import ch.systemsx.cisd.common.filesystem.QueueingPathRemoverService;
 import ch.systemsx.cisd.common.mail.IMailClient;
 import ch.systemsx.cisd.common.utilities.ExtendedProperties;
 import ch.systemsx.cisd.common.utilities.IDelegatedActionWithResult;
+import ch.systemsx.cisd.etlserver.DataSetRegistrationAlgorithm;
+import ch.systemsx.cisd.etlserver.DynamicTransactionQueryFactory;
 import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional;
+import ch.systemsx.cisd.etlserver.ITopLevelDataSetRegistratorDelegate;
 import ch.systemsx.cisd.etlserver.ITypeExtractor;
 import ch.systemsx.cisd.etlserver.ThreadParameters;
 import ch.systemsx.cisd.etlserver.TopLevelDataSetRegistratorGlobalState;
@@ -68,7 +74,7 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
      */
     protected abstract String getRegistrationScriptsFolderPath();
 
-    private static final String DATABASE_INSTANCE_UUID = "db-uuid";
+    protected static final String DATABASE_INSTANCE_UUID = "db-uuid";
 
     protected JythonTopLevelDataSetHandler<? extends DataSetInformation> handler;
 
@@ -82,6 +88,8 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
 
     protected IDataSourceQueryService dataSourceQueryService;
 
+    protected DynamicTransactionQuery dynamicTransactionQuery;
+
     protected File stagingDirectory;
 
     protected File incomingDataSetFile;
@@ -92,6 +100,10 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
 
     protected File subDataSet2;
 
+    protected boolean didDataSetRollbackHappen;
+
+    protected boolean didServiceRollbackHappen;
+
     @BeforeTest
     public void init()
     {
@@ -115,6 +127,7 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
         dataSetValidator = context.mock(IDataSetValidator.class);
         mailClient = context.mock(IMailClient.class);
         dataSourceQueryService = context.mock(IDataSourceQueryService.class);
+        dynamicTransactionQuery = context.mock(DynamicTransactionQuery.class);
 
         stagingDirectory = new File(workingDirectory, "staging");
     }
@@ -147,11 +160,20 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
         ThreadParameters threadParameters =
                 new ThreadParameters(threadProperties, "jython-handler-test");
 
+        DynamicTransactionQueryFactory myFactory = new DynamicTransactionQueryFactory()
+            {
+                @Override
+                public DynamicTransactionQuery createDynamicTransactionQuery(String dataSourceName)
+                {
+                    return dynamicTransactionQuery;
+                }
+            };
+
         TopLevelDataSetRegistratorGlobalState globalState =
                 new TopLevelDataSetRegistratorGlobalState("dss",
                         ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID,
                         workingDirectory, openBisService, mailClient, dataSetValidator,
-                        dataSourceQueryService, true, threadParameters);
+                        dataSourceQueryService, myFactory, true, threadParameters);
         return globalState;
     }
 
@@ -168,6 +190,7 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
                 }
             });
     }
+
     /**
      * adds an extension to the Jython Path, so that all libraries in it will be visible to the
      * Jython environment.
@@ -213,7 +236,6 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
         return threadProperties;
     }
 
-
     public static final class MockStorageProcessor implements IStorageProcessorTransactional
     {
         static MockStorageProcessor instance;
@@ -226,9 +248,9 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
 
         String dataSetInfoString;
 
-        private List<File> incomingDirs = new ArrayList<File>();
+        protected List<File> incomingDirs = new ArrayList<File>();
 
-        private List<File> rootDirs = new ArrayList<File>();
+        protected List<File> rootDirs = new ArrayList<File>();
 
         public MockStorageProcessor(ExtendedProperties props)
         {
@@ -309,11 +331,21 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
         }
     }
 
-    private class TestingDataSetHandler extends JythonTopLevelDataSetHandler<DataSetInformation>
+    protected class TestingDataSetHandler extends JythonTopLevelDataSetHandler<DataSetInformation>
     {
-        private final boolean shouldRegistrationFail;
+        protected final boolean shouldRegistrationFail;
+
+        protected final boolean shouldReThrowRollbackException;
+
+        protected boolean didRollbackServiceFunctionRun = false;
+
+        protected boolean didRollbackDataSetRegistrationFunctionRun = false;
+
+        protected boolean didTransactionRollbackHappen = false;
 
-        private final boolean shouldReThrowRollbackException;
+        protected boolean didRollbackTransactionFunctionRunHappen = false;
+
+        protected boolean didCommitTransactionFunctionRunHappen = false;
 
         public TestingDataSetHandler(TopLevelDataSetRegistratorGlobalState globalState,
                 boolean shouldRegistrationFail, boolean shouldReThrowRollbackException)
@@ -341,6 +373,7 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
                 Throwable throwable)
         {
             super.rollback(service, throwable);
+            didServiceRollbackHappen = true;
             if (shouldReThrowRollbackException)
             {
                 throw CheckedExceptionTunnel.wrapIfNecessary(throwable);
@@ -358,6 +391,7 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
         {
             super.didRollbackTransaction(service, transaction, algorithmRunner, throwable);
 
+            didTransactionRollbackHappen = true;
             if (shouldReThrowRollbackException)
             {
                 throw CheckedExceptionTunnel.wrapIfNecessary(throwable);
@@ -367,6 +401,77 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
             }
         }
 
+        @Override
+        protected void invokeRollbackServiceFunction(PyFunction function,
+                DataSetRegistrationService<DataSetInformation> service, Throwable throwable)
+        {
+            super.invokeRollbackServiceFunction(function, service, throwable);
+            PythonInterpreter interpreter =
+                    ((JythonDataSetRegistrationService<DataSetInformation>) service)
+                            .getInterpreter();
+            didRollbackServiceFunctionRun =
+                    interpreter.get("didRollbackServiceFunctionRun", Boolean.class);
+        }
+
+        @Override
+        protected void invokeRollbackDataSetRegistrationFunction(PyFunction function,
+                DataSetRegistrationService<DataSetInformation> service,
+                DataSetRegistrationAlgorithm registrationAlgorithm, Throwable throwable)
+        {
+            super.invokeRollbackDataSetRegistrationFunction(function, service,
+                    registrationAlgorithm, throwable);
+
+            PythonInterpreter interpreter =
+                    ((JythonDataSetRegistrationService<DataSetInformation>) service)
+                            .getInterpreter();
+            didRollbackDataSetRegistrationFunctionRun =
+                    interpreter.get("didRollbackServiceFunctionRun", Boolean.class);
+        }
+
+        @Override
+        protected void invokeRollbackTransactionFunction(PyFunction function,
+                DataSetRegistrationService<DataSetInformation> service,
+                DataSetRegistrationTransaction<DataSetInformation> transaction,
+                DataSetStorageAlgorithmRunner<DataSetInformation> algorithmRunner,
+                Throwable throwable)
+        {
+            super.invokeRollbackTransactionFunction(function, service, transaction,
+                    algorithmRunner, throwable);
+
+            PythonInterpreter interpreter =
+                    ((JythonDataSetRegistrationService<DataSetInformation>) service)
+                            .getInterpreter();
+            didRollbackTransactionFunctionRunHappen =
+                    interpreter.get("didTransactionRollbackHappen", Boolean.class);
+        }
+
+        @Override
+        protected void invokeCommitTransactionFunction(PyFunction function,
+                DataSetRegistrationService<DataSetInformation> service,
+                DataSetRegistrationTransaction<DataSetInformation> transaction)
+        {
+            super.invokeCommitTransactionFunction(function, service, transaction);
+
+            PythonInterpreter interpreter =
+                    ((JythonDataSetRegistrationService<DataSetInformation>) service)
+                            .getInterpreter();
+            didCommitTransactionFunctionRunHappen =
+                    interpreter.get("didTransactionCommitHappen", Boolean.class);
+        }
+
+        @Override
+        protected JythonDataSetRegistrationService<DataSetInformation> createJythonDataSetRegistrationService(
+                File aDataSetFile, DataSetInformation userProvidedDataSetInformationOrNull,
+                IDelegatedActionWithResult<Boolean> cleanAfterwardsAction,
+                ITopLevelDataSetRegistratorDelegate delegate, PythonInterpreter interpreter)
+        {
+            JythonDataSetRegistrationService<DataSetInformation> service =
+                    new TestDataRegistrationService(this, aDataSetFile,
+                            userProvidedDataSetInformationOrNull, cleanAfterwardsAction,
+                            interpreter, shouldRegistrationFail);
+            return service;
+        }
+
     }
 
     protected static class TestDataRegistrationService extends
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageRollbackerTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageRollbackerTest.java
index 095fe884dcd37284cd88f4eb4646db608d3be8ae..f3e1832298bc12d5c00488e8dc91e8cb0345a30f 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageRollbackerTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/DataSetStorageRollbackerTest.java
@@ -30,13 +30,13 @@ import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.common.mail.IMailClient;
+import ch.systemsx.cisd.etlserver.DynamicTransactionQueryFactory;
 import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional;
 import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional.UnstoreDataAction;
 import ch.systemsx.cisd.etlserver.ThreadParameters;
 import ch.systemsx.cisd.etlserver.TopLevelDataSetRegistratorGlobalState;
 import ch.systemsx.cisd.etlserver.registrator.AbstractOmniscientTopLevelDataSetRegistrator.OmniscientTopLevelDataSetRegistratorState;
 import ch.systemsx.cisd.etlserver.registrator.IDataSetOnErrorActionDecision.ErrorType;
-import ch.systemsx.cisd.etlserver.registrator.JythonTopLevelDataSetRegistratorTest.MockStorageProcessor;
 import ch.systemsx.cisd.etlserver.validation.IDataSetValidator;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
@@ -111,8 +111,8 @@ public class DataSetStorageRollbackerTest extends AbstractFileSystemTestCase
         TopLevelDataSetRegistratorGlobalState globalState =
                 new TopLevelDataSetRegistratorGlobalState("dss",
                         ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID,
-                        workingDirectory, openBisService, mailClient, dataSetValidator, null, true,
-                        threadParameters);
+                        workingDirectory, openBisService, mailClient, dataSetValidator, null,
+                        new DynamicTransactionQueryFactory(), true, threadParameters);
         return globalState;
     }
 
@@ -123,8 +123,10 @@ public class DataSetStorageRollbackerTest extends AbstractFileSystemTestCase
         threadProperties.put(ThreadParameters.INCOMING_DATA_COMPLETENESS_CONDITION,
                 ThreadParameters.INCOMING_DATA_COMPLETENESS_CONDITION_MARKER_FILE);
         threadProperties.put(ThreadParameters.DELETE_UNIDENTIFIED_KEY, "false");
-        threadProperties.put(IStorageProcessorTransactional.STORAGE_PROCESSOR_KEY,
-                MockStorageProcessor.class.getName());
+        threadProperties
+                .put(IStorageProcessorTransactional.STORAGE_PROCESSOR_KEY,
+                        ch.systemsx.cisd.etlserver.registrator.AbstractJythonDataSetHandlerTest.MockStorageProcessor.class
+                                .getName());
         return threadProperties;
     }
 
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java
index 13a64e918e23a09acdb0e2fda87e12d4c275f972..919ff6f3dfe3a447be317e9972a59c491afbab5e 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/JythonTopLevelDataSetRegistratorTest.java
@@ -20,55 +20,30 @@ import static ch.systemsx.cisd.common.Constants.IS_FINISHED_PREFIX;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
-import java.util.List;
+import java.util.Map;
 import java.util.Properties;
 
-import org.apache.commons.io.FileUtils;
 import org.hamcrest.core.IsAnything;
 import org.jmock.Expectations;
-import org.jmock.Mockery;
-import org.python.core.PyFunction;
-import org.python.util.PythonInterpreter;
 import org.testng.annotations.AfterMethod;
-import org.testng.annotations.AfterTest;
 import org.testng.annotations.BeforeMethod;
-import org.testng.annotations.BeforeTest;
 import org.testng.annotations.Test;
 
-import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
-import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked;
-import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase;
+import ch.systemsx.cisd.common.eodsql.MockDataSet;
 import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException;
-import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
-import ch.systemsx.cisd.common.filesystem.QueueingPathRemoverService;
 import ch.systemsx.cisd.common.logging.BufferedAppender;
-import ch.systemsx.cisd.common.mail.IMailClient;
 import ch.systemsx.cisd.common.test.RecordingMatcher;
-import ch.systemsx.cisd.common.utilities.ExtendedProperties;
-import ch.systemsx.cisd.common.utilities.IDelegatedActionWithResult;
-import ch.systemsx.cisd.etlserver.DataSetRegistrationAlgorithm;
 import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional;
-import ch.systemsx.cisd.etlserver.ITopLevelDataSetRegistratorDelegate;
-import ch.systemsx.cisd.etlserver.ITypeExtractor;
 import ch.systemsx.cisd.etlserver.ThreadParameters;
-import ch.systemsx.cisd.etlserver.TopLevelDataSetRegistratorGlobalState;
-import ch.systemsx.cisd.etlserver.registrator.JythonTopLevelDataSetHandler.JythonDataSetRegistrationService;
-import ch.systemsx.cisd.etlserver.registrator.api.v1.impl.DataSetRegistrationTransaction;
-import ch.systemsx.cisd.etlserver.validation.IDataSetValidator;
-import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
-import ch.systemsx.cisd.openbis.dss.generic.shared.dto.AtomicEntityOperationDetails;
-import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.dss.generic.shared.utils.DatasetLocationUtil;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
@@ -81,7 +56,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationResult;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty;
-import ch.systemsx.cisd.openbis.generic.shared.dto.StorageFormat;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierFactory;
@@ -89,7 +63,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierF
 /**
  * @author Chandrasekhar Ramakrishnan
  */
-public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTestCase
+public class JythonTopLevelDataSetRegistratorTest extends AbstractJythonDataSetHandlerTest
 {
     private static final String SCRIPTS_FOLDER =
             "sourceTest/java/ch/systemsx/cisd/etlserver/registrator/";
@@ -98,8 +72,6 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
 
     private static final String CONTAINER_DATA_SET_CODE = "container-data-set-code";
 
-    private static final String DATABASE_INSTANCE_UUID = "db-uuid";
-
     private static final DataSetType DATA_SET_TYPE = new DataSetType("O1");
 
     private static final String EXPERIMENT_PERM_ID = "experiment-perm-id";
@@ -108,53 +80,14 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
 
     private static final String SAMPLE_PERM_ID = "sample-perm-id";
 
-    private JythonTopLevelDataSetHandler<DataSetInformation> handler;
-
-    private Mockery context;
-
-    private IEncapsulatedOpenBISService openBisService;
-
-    private IMailClient mailClient;
-
-    private IDataSetValidator dataSetValidator;
-
-    private File incomingDataSetFile;
-
-    private File markerFile;
-
-    private File subDataSet1;
-
-    private File subDataSet2;
-
-    private boolean didDataSetRollbackHappen;
-
-    private boolean didServiceRollbackHappen;
-
     private BufferedAppender logAppender;
 
-    @BeforeTest
-    public void init()
-    {
-        QueueingPathRemoverService.start();
-    }
-
-    @AfterTest
-    public void finish()
-    {
-        QueueingPathRemoverService.stop();
-    }
-
     @BeforeMethod
     @Override
     public void setUp() throws IOException
     {
         super.setUp();
 
-        context = new Mockery();
-        openBisService = context.mock(IEncapsulatedOpenBISService.class);
-        dataSetValidator = context.mock(IDataSetValidator.class);
-        mailClient = context.mock(IMailClient.class);
-
         logAppender = new BufferedAppender();
 
         didDataSetRollbackHappen = false;
@@ -800,7 +733,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
     {
         setUpHomeDataBaseExpectations();
         Properties threadProperties = createThreadPropertiesRelativeToScriptsFolder("search.py");
-        createHandler(threadProperties, false);
+        createHandler(threadProperties, false, true);
 
         createData();
 
@@ -814,8 +747,11 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
         assertTrue(logAppender.getLogContent(), logAppender.getLogContent().length() > 0);
 
         TestingDataSetHandler theHandler = (TestingDataSetHandler) handler;
+        assertFalse(didServiceRollbackHappen);
+        assertFalse(theHandler.didTransactionRollbackHappen);
         assertFalse(theHandler.didRollbackDataSetRegistrationFunctionRun);
         assertFalse(theHandler.didRollbackServiceFunctionRun);
+
         context.assertIsSatisfied();
     }
 
@@ -825,7 +761,7 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
         setUpHomeDataBaseExpectations();
         Properties threadProperties =
                 createThreadPropertiesRelativeToScriptsFolder("query-interface-test.py");
-        createHandler(threadProperties, false);
+        createHandler(threadProperties, false, true);
 
         createData();
 
@@ -837,11 +773,34 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
         assertEquals(0, MockStorageProcessor.instance.calledCommitCount);
 
         TestingDataSetHandler theHandler = (TestingDataSetHandler) handler;
-        assertFalse(theHandler.didRollbackDataSetRegistrationFunctionRun);
-        assertFalse(theHandler.didRollbackServiceFunctionRun);
+        assertFalse(didServiceRollbackHappen);
+        assertFalse(theHandler.didTransactionRollbackHappen);
+        context.assertIsSatisfied();
+    }
+
+    @Test
+    public void testDynamicQueryCommitFail()
+    {
+        setUpHomeDataBaseExpectations();
+        Properties threadProperties =
+                createThreadPropertiesRelativeToScriptsFolder("dynamic-query-failure-test.py");
+        createHandler(threadProperties, false, true);
+
+        createData();
+
+        setUpDynamicQueryExpectations();
+
+        handler.handle(markerFile);
+
+        assertEquals(0, MockStorageProcessor.instance.incomingDirs.size());
+        assertEquals(0, MockStorageProcessor.instance.calledCommitCount);
+
+        TestingDataSetHandler theHandler = (TestingDataSetHandler) handler;
+        assertFalse(didServiceRollbackHappen);
+        assertFalse(theHandler.didTransactionRollbackHappen);
         context.assertIsSatisfied();
     }
-    
+
     private Properties createThreadProperties(String scriptPath)
     {
         Properties threadProperties = new Properties();
@@ -855,9 +814,9 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
         return threadProperties;
     }
 
-    private Properties createThreadPropertiesRelativeToScriptsFolder(String scriptPath)
+    protected String getRegistrationScriptsFolderPath()
     {
-        return createThreadProperties(SCRIPTS_FOLDER + scriptPath);
+        return SCRIPTS_FOLDER;
     }
 
     @Test
@@ -887,55 +846,11 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
         context.assertIsSatisfied();
     }
 
-    private File createDirectory(File parentDir, String directoryName)
-    {
-        final File file = new File(parentDir, directoryName);
-        file.mkdir();
-        return file;
-    }
-
     private void createHandler(Properties threadProperties, final boolean registrationShouldFail)
     {
         createHandler(threadProperties, registrationShouldFail, false);
     }
 
-    private void createHandler(Properties threadProperties, final boolean registrationShouldFail,
-            boolean shouldReThrowException)
-    {
-        TopLevelDataSetRegistratorGlobalState globalState = createGlobalState(threadProperties);
-
-        handler =
-                new TestingDataSetHandler(globalState, registrationShouldFail,
-                        shouldReThrowException);
-    }
-
-    private TopLevelDataSetRegistratorGlobalState createGlobalState(Properties threadProperties)
-    {
-        ThreadParameters threadParameters =
-                new ThreadParameters(threadProperties, "jython-handler-test");
-
-        TopLevelDataSetRegistratorGlobalState globalState =
-                new TopLevelDataSetRegistratorGlobalState("dss",
-                        ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID,
-                        workingDirectory, openBisService, mailClient, dataSetValidator, null, true,
-                        threadParameters);
-        return globalState;
-    }
-
-    private void setUpHomeDataBaseExpectations()
-    {
-        context.checking(new Expectations()
-            {
-                {
-
-                    DatabaseInstance databaseInstance = new DatabaseInstance();
-                    databaseInstance.setUuid(DATABASE_INSTANCE_UUID);
-                    one(openBisService).getHomeDatabaseInstance();
-                    will(returnValue(databaseInstance));
-                }
-            });
-    }
-
     private void setUpSearchExpectations()
     {
         context.checking(new Expectations()
@@ -960,317 +875,54 @@ public class JythonTopLevelDataSetRegistratorTest extends AbstractFileSystemTest
                     searchCriteria = createTestSearchCriteria("SAMPLE_TYPE");
                     oneOf(openBisService).searchForSamples(searchCriteria);
                     will(returnValue(Collections.EMPTY_LIST));
+
+                    oneOf(openBisService)
+                            .performEntityOperations(
+                                    with(any(ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails.class)));
                 }
             });
     }
-    
+
     private void setUpQueryExpectations()
     {
         context.checking(new Expectations()
             {
                 {
-
+                    oneOf(dataSourceQueryService).select("path-info-db",
+                            "SELECT * from data_set_files WHERE parent_id is NULL");
+                    Object[] args =
+                        { 155555 };
+                    will(returnValue(new MockDataSet<Map<String, Object>>()));
+                    oneOf(dataSourceQueryService).select("path-info-db",
+                            "SELECT * from data_set_files WHERE parent_id = ?1", args);
+                    will(returnValue(new MockDataSet<Map<String, Object>>()));
                 }
             });
     }
 
-    protected SearchCriteria createTestSearchCriteria(String typeString)
-    {
-        SearchCriteria sc = new SearchCriteria();
-        sc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.TYPE, typeString));
-        sc.addMatchClause(MatchClause.createPropertyMatch("PROP", "VALUE"));
-        return sc;
-    }
-
-    public static final class MockStorageProcessor implements IStorageProcessorTransactional
-    {
-        static MockStorageProcessor instance;
-
-        int calledGetStoreRootDirectoryCount = 0;
-
-        int calledCommitCount = 0;
-
-        File storeRootDirectory;
-
-        String dataSetInfoString;
-
-        private List<File> incomingDirs = new ArrayList<File>();
-
-        private List<File> rootDirs = new ArrayList<File>();
-
-        public MockStorageProcessor(ExtendedProperties props)
-        {
-            instance = this;
-        }
-
-        public File getStoreRootDirectory()
-        {
-            calledGetStoreRootDirectoryCount++;
-            return storeRootDirectory;
-        }
-
-        public void setStoreRootDirectory(File storeRootDirectory)
-        {
-            this.storeRootDirectory = storeRootDirectory;
-        }
-
-        public StorageFormat getStorageFormat()
-        {
-            return StorageFormat.PROPRIETARY;
-        }
-
-        public UnstoreDataAction getDefaultUnstoreDataAction(Throwable exception)
-        {
-            return UnstoreDataAction.LEAVE_UNTOUCHED;
-        }
-
-        public IStorageProcessorTransaction createTransaction()
-        {
-            return new IStorageProcessorTransaction()
-                {
-
-                    private File storedFolder;
-
-                    public void storeData(DataSetInformation dataSetInformation,
-                            ITypeExtractor typeExtractor, IMailClient mailClient,
-                            File incomingDataSetDirectory, File rootDir)
-                    {
-                        incomingDirs.add(incomingDataSetDirectory);
-                        rootDirs.add(rootDir);
-                        dataSetInfoString = dataSetInformation.toString();
-                        try
-                        {
-                            FileUtils.copyDirectory(incomingDataSetDirectory, rootDir);
-                        } catch (IOException ex)
-                        {
-                            throw new IOExceptionUnchecked(ex);
-                        }
-                        storedFolder = rootDir;
-                    }
-
-                    public UnstoreDataAction rollback(Throwable exception)
-                    {
-                        return null;
-                    }
-
-                    public File getStoredDataDirectory()
-                    {
-                        return storedFolder;
-                    }
-
-                    public void commit()
-                    {
-                        calledCommitCount++;
-                    }
-
-                    public File tryGetProprietaryData()
-                    {
-                        return null;
-                    }
-                };
-        }
-    }
-
-    private class TestingDataSetHandler extends JythonTopLevelDataSetHandler<DataSetInformation>
+    private void setUpDynamicQueryExpectations()
     {
-        private final boolean shouldRegistrationFail;
-
-        private final boolean shouldReThrowRollbackException;
-
-        private boolean didRollbackServiceFunctionRun = false;
-
-        private boolean didRollbackDataSetRegistrationFunctionRun = false;
-
-        private boolean didTransactionRollbackHappen = false;
-
-        private boolean didRollbackTransactionFunctionRunHappen = false;
-
-        private boolean didCommitTransactionFunctionRunHappen = false;
-
-        public TestingDataSetHandler(TopLevelDataSetRegistratorGlobalState globalState,
-                boolean shouldRegistrationFail, boolean shouldReThrowRollbackException)
-        {
-            super(globalState);
-            this.shouldRegistrationFail = shouldRegistrationFail;
-            this.shouldReThrowRollbackException = shouldReThrowRollbackException;
-        }
-
-        @Override
-        public void registerDataSetInApplicationServer(DataSetInformation dataSetInformation,
-                NewExternalData data) throws Throwable
-        {
-            if (shouldRegistrationFail)
-            {
-                throw new UserFailureException("Didn't work.");
-            } else
-            {
-                super.registerDataSetInApplicationServer(dataSetInformation, data);
-            }
-        }
-
-        @Override
-        public void rollback(DataSetRegistrationService<DataSetInformation> service,
-                Throwable throwable)
-        {
-            super.rollback(service, throwable);
-            didServiceRollbackHappen = true;
-            if (shouldReThrowRollbackException)
-            {
-                throw CheckedExceptionTunnel.wrapIfNecessary(throwable);
-            } else
-            {
-                throwable.printStackTrace();
-            }
-        }
-
-        @Override
-        public void didRollbackTransaction(DataSetRegistrationService<DataSetInformation> service,
-                DataSetRegistrationTransaction<DataSetInformation> transaction,
-                DataSetStorageAlgorithmRunner<DataSetInformation> algorithmRunner,
-                Throwable throwable)
-        {
-            super.didRollbackTransaction(service, transaction, algorithmRunner, throwable);
-
-            didTransactionRollbackHappen = true;
-            if (shouldReThrowRollbackException)
-            {
-                throw CheckedExceptionTunnel.wrapIfNecessary(throwable);
-            } else
+        context.checking(new Expectations()
             {
-                throwable.printStackTrace();
-            }
-        }
-
-        @Override
-        protected void invokeRollbackServiceFunction(PyFunction function,
-                DataSetRegistrationService<DataSetInformation> service, Throwable throwable)
-        {
-            super.invokeRollbackServiceFunction(function, service, throwable);
-            PythonInterpreter interpreter =
-                    ((JythonDataSetRegistrationService<DataSetInformation>) service)
-                            .getInterpreter();
-            didRollbackServiceFunctionRun =
-                    interpreter.get("didRollbackServiceFunctionRun", Boolean.class);
-        }
-
-        @Override
-        protected void invokeRollbackDataSetRegistrationFunction(PyFunction function,
-                DataSetRegistrationService<DataSetInformation> service,
-                DataSetRegistrationAlgorithm registrationAlgorithm, Throwable throwable)
-        {
-            super.invokeRollbackDataSetRegistrationFunction(function, service,
-                    registrationAlgorithm, throwable);
-
-            PythonInterpreter interpreter =
-                    ((JythonDataSetRegistrationService<DataSetInformation>) service)
-                            .getInterpreter();
-            didRollbackDataSetRegistrationFunctionRun =
-                    interpreter.get("didRollbackServiceFunctionRun", Boolean.class);
-        }
-
-        @Override
-        protected void invokeRollbackTransactionFunction(PyFunction function,
-                DataSetRegistrationService<DataSetInformation> service,
-                DataSetRegistrationTransaction<DataSetInformation> transaction,
-                DataSetStorageAlgorithmRunner<DataSetInformation> algorithmRunner,
-                Throwable throwable)
-        {
-            super.invokeRollbackTransactionFunction(function, service, transaction,
-                    algorithmRunner, throwable);
-
-            PythonInterpreter interpreter =
-                    ((JythonDataSetRegistrationService<DataSetInformation>) service)
-                            .getInterpreter();
-            didRollbackTransactionFunctionRunHappen =
-                    interpreter.get("didTransactionRollbackHappen", Boolean.class);
-        }
-
-        @Override
-        protected void invokeCommitTransactionFunction(PyFunction function,
-                DataSetRegistrationService<DataSetInformation> service,
-                DataSetRegistrationTransaction<DataSetInformation> transaction)
-        {
-            super.invokeCommitTransactionFunction(function, service, transaction);
-
-            PythonInterpreter interpreter =
-                    ((JythonDataSetRegistrationService<DataSetInformation>) service)
-                            .getInterpreter();
-            didCommitTransactionFunctionRunHappen =
-                    interpreter.get("didTransactionCommitHappen", Boolean.class);
-        }
-
-        @Override
-        protected JythonDataSetRegistrationService<DataSetInformation> createJythonDataSetRegistrationService(
-                File aDataSetFile, DataSetInformation userProvidedDataSetInformationOrNull,
-                IDelegatedActionWithResult<Boolean> cleanAfterwardsAction,
-                ITopLevelDataSetRegistratorDelegate delegate, PythonInterpreter interpreter)
-        {
-            JythonDataSetRegistrationService<DataSetInformation> service =
-                    new TestDataRegistrationService(this, aDataSetFile,
-                            userProvidedDataSetInformationOrNull, cleanAfterwardsAction,
-                            interpreter, shouldRegistrationFail);
-            return service;
-        }
-
-    }
-
-    protected static class TestDataRegistrationService extends
-            JythonDataSetRegistrationService<DataSetInformation>
-    {
-        private final boolean shouldRegistrationFail;
-
-        /**
-         * @param registrator
-         * @param globalCleanAfterwardsAction
-         * @param interpreter
-         */
-        public TestDataRegistrationService(
-                JythonTopLevelDataSetHandler<DataSetInformation> registrator, File aDataSetFile,
-                DataSetInformation userProvidedDataSetInformationOrNull,
-                IDelegatedActionWithResult<Boolean> globalCleanAfterwardsAction,
-                PythonInterpreter interpreter, boolean shouldRegistrationFail)
-        {
-            super(registrator, aDataSetFile, userProvidedDataSetInformationOrNull,
-                    globalCleanAfterwardsAction,
-                    new AbstractOmniscientTopLevelDataSetRegistrator.NoOpDelegate(), interpreter);
-            this.shouldRegistrationFail = shouldRegistrationFail;
-        }
+                {
+                    oneOf(dynamicTransactionQuery)
+                            .select("SELECT * from data_set_files WHERE parent_id is NULL",
+                                    (Object[]) null);
+                    will(returnValue(new MockDataSet<Map<String, Object>>()));
 
-        @Override
-        public IEntityOperationService<DataSetInformation> getEntityRegistrationService()
-        {
-            return new TestEntityOperationService(getRegistrator(), shouldRegistrationFail);
-        }
+                    oneOf(openBisService)
+                            .performEntityOperations(
+                                    with(any(ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails.class)));
 
+                }
+            });
     }
 
-    protected static class TestEntityOperationService extends
-            DefaultEntityOperationService<DataSetInformation>
+    protected SearchCriteria createTestSearchCriteria(String typeString)
     {
-
-        private final boolean shouldRegistrationFail;
-
-        /**
-         * @param registrator
-         */
-        public TestEntityOperationService(
-                AbstractOmniscientTopLevelDataSetRegistrator<DataSetInformation> registrator,
-                boolean shouldRegistrationFail)
-        {
-            super(registrator, new AbstractOmniscientTopLevelDataSetRegistrator.NoOpDelegate());
-            this.shouldRegistrationFail = shouldRegistrationFail;
-        }
-
-        @Override
-        public AtomicEntityOperationResult performOperationsInApplcationServer(
-                AtomicEntityOperationDetails<DataSetInformation> registrationDetails)
-        {
-            if (shouldRegistrationFail)
-            {
-                assert false;
-            }
-            return super.performOperationsInApplcationServer(registrationDetails);
-        }
-
+        SearchCriteria sc = new SearchCriteria();
+        sc.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.TYPE, typeString));
+        sc.addMatchClause(MatchClause.createPropertyMatch("PROP", "VALUE"));
+        return sc;
     }
 }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java
index ed641945656c7a1c7b55b051abdf83d7d0534b0b..4df92f78de45aebd653c9f4f5dffc867cca82ff9 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java
@@ -38,6 +38,7 @@ import ch.systemsx.cisd.common.filesystem.QueueingPathRemoverService;
 import ch.systemsx.cisd.common.logging.BufferedAppender;
 import ch.systemsx.cisd.common.mail.IMailClient;
 import ch.systemsx.cisd.common.utilities.ExtendedProperties;
+import ch.systemsx.cisd.etlserver.DynamicTransactionQueryFactory;
 import ch.systemsx.cisd.etlserver.IStorageProcessorTransactional;
 import ch.systemsx.cisd.etlserver.ITypeExtractor;
 import ch.systemsx.cisd.etlserver.ThreadParameters;
@@ -420,8 +421,8 @@ public class DataSetRegistrationTransactionTest extends AbstractFileSystemTestCa
         TopLevelDataSetRegistratorGlobalState globalState =
                 new TopLevelDataSetRegistratorGlobalState("dss",
                         ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID,
-                        workingDirectory, openBisService, mailClient, dataSetValidator, null, true,
-                        threadParameters);
+                        workingDirectory, openBisService, mailClient, dataSetValidator, null,
+                        new DynamicTransactionQueryFactory(), true, threadParameters);
         return globalState;
     }
 
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/dying-script.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/dying-script.py
index bff9b7a9b803a64ce2b29fac2596a9d0c6b7f912..ea06f3ffa244ccf5f5f213dc13220279cf4011f4 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/dying-script.py
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/dying-script.py
@@ -10,6 +10,5 @@ registrationDetails = factory.createRegistrationDetails()
 dataSetInformation = registrationDetails.getDataSetInformation()
 dataSetInformation.setExperimentIdentifier(identifier)
 registrationDetails.setDataSetType(dto.DataSetType("O1"));
-futureDataSet = service.queueDataSetRegistration(io.File(incoming, "sub_data_set_1"), registrationDetails)
 
 None.non_existant_function()
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/dynamic-query-failure-test.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/dynamic-query-failure-test.py
new file mode 100644
index 0000000000000000000000000000000000000000..2e52815bdc0b7865047c4a2733c73f4e5889a879
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/dynamic-query-failure-test.py
@@ -0,0 +1,7 @@
+import sys
+
+# Execute a query
+tr = service.transaction()
+query = tr.getDatabaseQuery("path-info-db")
+result = query.select("SELECT * from data_set_files WHERE parent_id is NULL", None)
+sys.stdout.write("Roots: " + str(result.size()) + "\n")
\ No newline at end of file
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/query-interface-test.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/query-interface-test.py
index 8b8cd54f0f02dffc82033705b7fc0af51e339bb9..aaacabad30f8e472d1b4bf85f480d5e1e63cc822 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/query-interface-test.py
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/query-interface-test.py
@@ -9,7 +9,7 @@ def execute_query(query_service, block, query, params=None):
 	result.close()
 
 # Execute a query
-query_service = service.getDataSourceQueryService()
+query_service = state.getDataSourceQueryService()
 execute_query(query_service, lambda result: sys.stdout.write("Roots: " + str(result.size()) + "\n") , "SELECT * from data_set_files WHERE parent_id is NULL")
 
 execute_query(query_service, lambda result: sys.stdout.write("Level 1: " + str(result.size()) + "\n"), "SELECT * from data_set_files WHERE parent_id = ?1", [155555])
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/rollback-dying-script.py b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/rollback-dying-script.py
index dff78f3b76d945a15e9b5ad45fbe1c754564d8a8..d862febba1b0ad06ce9c38f51b5d5e9dab77289c 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/rollback-dying-script.py
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/rollback-dying-script.py
@@ -18,6 +18,5 @@ registrationDetails = factory.createRegistrationDetails()
 dataSetInformation = registrationDetails.getDataSetInformation()
 dataSetInformation.setExperimentIdentifier(identifier)
 registrationDetails.setDataSetType(dto.DataSetType("O1"));
-futureDataSet = service.queueDataSetRegistration(io.File(incoming, "sub_data_set_1"), registrationDetails)
 
 None.non_existant_function()