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 d48f91516d10f12c1d264f39c585c29fb95da9f9..3d2237fb09913899d2fed707e279aae7f33948f9 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/ETLDaemon.java
@@ -326,13 +326,14 @@ public final class ETLDaemon
             final boolean notifySuccessfulRegistration)
     {
         final File storeRootDir = DssPropertyParametersUtil.getStoreRootDir(properties);
+        File dssInternalTempDir = DssPropertyParametersUtil.getDssInternalTempDir(properties);
         migrateStoreRootDir(storeRootDir, openBISService.getHomeDatabaseInstance());
         String dssCode = DssPropertyParametersUtil.getDataStoreCode(properties);
         TopLevelDataSetRegistratorGlobalState globalState =
                 new TopLevelDataSetRegistratorGlobalState(dssCode, shareId, storeRootDir,
-                        openBISService, mailClient, dataSetValidator, dataSourceQueryService,
-                        new DynamicTransactionQueryFactory(), notifySuccessfulRegistration,
-                        threadParameters);
+                        dssInternalTempDir, openBISService, mailClient, dataSetValidator,
+                        dataSourceQueryService, new DynamicTransactionQueryFactory(),
+                        notifySuccessfulRegistration, threadParameters);
 
         ITopLevelDataSetRegistrator registrator =
                 ClassUtils.create(ITopLevelDataSetRegistrator.class, threadParameters
@@ -356,15 +357,16 @@ public final class ETLDaemon
             Class<?> defaultTopLevelDataSetRegistratorClass)
     {
         final File storeRootDir = DssPropertyParametersUtil.getStoreRootDir(properties);
+        File dssInternalTempDir = DssPropertyParametersUtil.getDssInternalTempDir(properties);
         migrateStoreRootDir(storeRootDir, openBISService.getHomeDatabaseInstance());
         String dssCode = DssPropertyParametersUtil.getDataStoreCode(properties);
         TopLevelDataSetRegistratorGlobalState globalState =
                 new TopLevelDataSetRegistratorGlobalState(dssCode, shareId, storeRootDir,
-                        openBISService, mailClient, dataSetValidator, dataSourceQueryService,
-                        new DynamicTransactionQueryFactory(), notifySuccessfulRegistration,
-                        threadParameters, useIsFinishedMarkerFile, deleteUnidentified,
-                        preRegistrationScriptOrNull, postRegistrationScriptOrNull,
-                        validationScriptsOrNull);
+                        dssInternalTempDir, openBISService, mailClient, dataSetValidator,
+                        dataSourceQueryService, 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 59c86bd84d9c5e5dc00fa031514fcb71c2ebed7c..4eea2ca41646b2d13712b0edb0fd8f39047c0cc9 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/TopLevelDataSetRegistratorGlobalState.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/TopLevelDataSetRegistratorGlobalState.java
@@ -48,6 +48,8 @@ public class TopLevelDataSetRegistratorGlobalState
 
     private final File storeRootDir;
 
+    private final File dssInternalTempDir;
+
     private final IEncapsulatedOpenBISService openBisService;
 
     private final IMailClient mailClient;
@@ -85,13 +87,14 @@ public class TopLevelDataSetRegistratorGlobalState
      * @param threadParameters
      */
     public TopLevelDataSetRegistratorGlobalState(String dssCode, String shareId, File storeRootDir,
-            IEncapsulatedOpenBISService openBisService, IMailClient mailClient,
-            IDataSetValidator dataSetValidator, IDataSourceQueryService dataSourceQueryService,
+            File dssInternalTempDir, IEncapsulatedOpenBISService openBisService,
+            IMailClient mailClient, IDataSetValidator dataSetValidator,
+            IDataSourceQueryService dataSourceQueryService,
             DynamicTransactionQueryFactory dynamicTransactionQueryFactory,
             boolean notifySuccessfulRegistration, ThreadParameters threadParameters)
     {
-        this(dssCode, shareId, storeRootDir, openBisService, mailClient, dataSetValidator,
-                dataSourceQueryService, dynamicTransactionQueryFactory,
+        this(dssCode, shareId, storeRootDir, dssInternalTempDir, openBisService, mailClient,
+                dataSetValidator, dataSourceQueryService, dynamicTransactionQueryFactory,
                 notifySuccessfulRegistration, threadParameters, threadParameters
                         .useIsFinishedMarkerFile(), threadParameters.deleteUnidentified(),
                 threadParameters.tryGetPreRegistrationScript(), threadParameters
@@ -99,8 +102,9 @@ public class TopLevelDataSetRegistratorGlobalState
     }
 
     public TopLevelDataSetRegistratorGlobalState(String dssCode, String shareId, File storeRootDir,
-            IEncapsulatedOpenBISService openBisService, IMailClient mailClient,
-            IDataSetValidator dataSetValidator, IDataSourceQueryService dataSourceQueryService,
+            File dssInternalTempDir, IEncapsulatedOpenBISService openBisService,
+            IMailClient mailClient, IDataSetValidator dataSetValidator,
+            IDataSourceQueryService dataSourceQueryService,
             DynamicTransactionQueryFactory dynamicTransactionQueryFactory,
             boolean notifySuccessfulRegistration, ThreadParameters threadParameters,
             boolean useIsFinishedMarkerFile, boolean deleteUnidentified,
@@ -111,6 +115,7 @@ public class TopLevelDataSetRegistratorGlobalState
         this.dssCode = dssCode;
         this.shareId = shareId;
         this.storeRootDir = storeRootDir;
+        this.dssInternalTempDir = dssInternalTempDir;
         this.openBisService = openBisService;
         this.mailClient = mailClient;
         this.dataSetValidator = dataSetValidator;
@@ -140,6 +145,14 @@ public class TopLevelDataSetRegistratorGlobalState
         return storeRootDir;
     }
 
+    /**
+     * Get a directory that can be used for temporary files, and is local to the server.
+     */
+    public File getDssInternalTempDir()
+    {
+        return dssInternalTempDir;
+    }
+
     public IEncapsulatedOpenBISService getOpenBisService()
     {
         return openBisService;
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/AbstractOmniscientTopLevelDataSetRegistrator.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/AbstractOmniscientTopLevelDataSetRegistrator.java
index 1760346d142f3bad2f518e317b5dc8404d90b9d5..3ba071c406db252ebe4a15159a1ece949ed9f15b 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/AbstractOmniscientTopLevelDataSetRegistrator.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/AbstractOmniscientTopLevelDataSetRegistrator.java
@@ -236,7 +236,8 @@ public abstract class AbstractOmniscientTopLevelDataSetRegistrator<T extends Dat
                         new ReentrantLock(), FileOperations.getMonitoredInstanceForCurrentThread(),
                         onErrorDecision);
 
-        DataSetRegistrationTransaction.rollbackDeadTransactions(globalState.getStoreRootDir());
+        DataSetRegistrationTransaction.rollbackDeadTransactions(globalState
+                .getDssInternalTempDir());
 
     }
 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java
index c32f960d40c8aa8f1fe59bbc3860258595d199ba..ab8862d86ab842a31f3c7a7ec53c20c449661088 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DataSetRegistrationService.java
@@ -147,7 +147,7 @@ public class DataSetRegistrationService<T extends DataSetInformation> implements
         // Clone this service for the transaction to keep them independent
         DataSetRegistrationTransaction<T> transaction =
                 new DataSetRegistrationTransaction<T>(registrator.getGlobalState()
-                        .getStoreRootDir(), workingDirectory, stagingDirectory, this,
+                        .getDssInternalTempDir(), workingDirectory, stagingDirectory, this,
                         detailsFactory);
 
         transactions.add(transaction);
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ConfigParameters.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ConfigParameters.java
index 63f06d1e1a42be45305dfa5e6784212ce241b899..d568b8039e33ef6c3485999a037ea10dc03c1eb0 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ConfigParameters.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ConfigParameters.java
@@ -32,6 +32,7 @@ import ch.systemsx.cisd.common.utilities.PropertyParametersUtil;
 import ch.systemsx.cisd.common.utilities.PropertyParametersUtil.SectionProperties;
 import ch.systemsx.cisd.common.utilities.PropertyUtils;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.PluginServletConfig;
+import ch.systemsx.cisd.openbis.dss.generic.shared.utils.DssPropertyParametersUtil;
 
 /**
  * Configuration parameters for the Data Set Download Server.
@@ -97,6 +98,8 @@ public final class ConfigParameters implements IServletPropertiesManager
 
     private final File storePath;
 
+    private final File dssInternalTempDir;
+
     private final File rpcIncomingDirectory;
 
     private final int port;
@@ -136,6 +139,7 @@ public final class ConfigParameters implements IServletPropertiesManager
     {
         this.properties = properties;
         storePath = new File(PropertyUtils.getMandatoryProperty(properties, STOREROOT_DIR_KEY));
+        dssInternalTempDir = getInternalTempDirectory(properties);
         rpcIncomingDirectory = getRpcIncomingDirectory(properties);
         port = getMandatoryIntegerProperty(properties, PORT_KEY);
         serverURL = PropertyUtils.getMandatoryProperty(properties, SERVER_URL_KEY);
@@ -162,14 +166,19 @@ public final class ConfigParameters implements IServletPropertiesManager
                         DEFAULT_AUTH_CACHE_CLEANUP_TIMER_PERIOD_MINS);
         pluginServlets = new LinkedHashMap<String, PluginServletConfig>();
         SectionProperties[] pluginServicesProperties =
-            PropertyParametersUtil.extractSectionProperties(properties,
-                    PLUGIN_SERVICES_LIST_KEY, false);
+                PropertyParametersUtil.extractSectionProperties(properties,
+                        PLUGIN_SERVICES_LIST_KEY, false);
         addServletsProperties("", pluginServicesProperties);
 
         webstartJarPath =
                 PropertyUtils.getProperty(properties, WEBSTART_JAR_PATH, WEBSTART_JAR_PATH_DEFAULT);
     }
 
+    private File getInternalTempDirectory(Properties properties)
+    {
+        return DssPropertyParametersUtil.getDssInternalTempDir(properties);
+    }
+
     private static File getRpcIncomingDirectory(final Properties properties)
     {
         String incomingDirPath = PropertyUtils.getProperty(properties, RPC_INCOMING_DIR);
@@ -233,6 +242,11 @@ public final class ConfigParameters implements IServletPropertiesManager
         return rpcIncomingDirectory;
     }
 
+    public File getDssInternalTempDir()
+    {
+        return dssInternalTempDir;
+    }
+
     public final int getPort()
     {
         return port;
@@ -308,6 +322,7 @@ public final class ConfigParameters implements IServletPropertiesManager
         if (operationLog.isInfoEnabled())
         {
             operationLog.info(String.format("Store root directory: '%s'.", storePath));
+            operationLog.info(String.format("Temp file directory: '%s'.", dssInternalTempDir));
             operationLog.info(String.format("RPC incoming directory: '%s'.", rpcIncomingDirectory));
             operationLog.info(String.format("Port number: %d.", port));
             operationLog.info(String.format("URL of openBIS server: '%s'.", serverURL));
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java
index eb0b16594c5e65603d0ed7cd9541f51f701f2f71..5f5640d3c1ab62b0806517ab2146c89cea0dd62a 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/DssPropertyParametersUtil.java
@@ -21,6 +21,7 @@ import java.util.Map.Entry;
 import java.util.Properties;
 import java.util.Set;
 
+import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.common.utilities.ExtendedProperties;
 import ch.systemsx.cisd.common.utilities.PropertyUtils;
@@ -43,6 +44,11 @@ public class DssPropertyParametersUtil
 
     public static final String SERVER_URL_KEY = "server-url";
 
+    /**
+     * Temp directory for dss usage.
+     */
+    static final String DSS_TEMP_DIR_PATH = "dss-temp-dir";
+
     /** Location of service properties file. */
     public static final String SERVICE_PROPERTIES_FILE = "etc/service.properties";
 
@@ -57,7 +63,8 @@ public class DssPropertyParametersUtil
         Properties properties = PropertyUtils.loadProperties(filePath);
         Properties systemProperties = System.getProperties();
         ExtendedProperties dssSystemProperties =
-                ExtendedProperties.getSubset(systemProperties, OPENBIS_DSS_SYSTEM_PROPERTIES_PREFIX, true);
+                ExtendedProperties.getSubset(systemProperties,
+                        OPENBIS_DSS_SYSTEM_PROPERTIES_PREFIX, true);
         Set<Entry<Object, Object>> entrySet = dssSystemProperties.entrySet();
         for (Entry<Object, Object> entry : entrySet)
         {
@@ -81,4 +88,23 @@ public class DssPropertyParametersUtil
     {
         return PropertyUtils.getMandatoryProperty(serviceProperties, SERVER_URL_KEY);
     }
+
+    public static File getDssInternalTempDir(final Properties properties)
+    {
+        String defaultTempDirPath =
+                new File(System.getProperty("user.dir"), "dss-tmp").getAbsolutePath();
+        String tempDirPath =
+                PropertyUtils.getProperty(properties, DSS_TEMP_DIR_PATH, defaultTempDirPath);
+        File tempDir = new File(tempDirPath);
+        tempDir.mkdirs();
+        if (false == tempDir.exists())
+        {
+            throw new ConfigurationFailureException(
+                    "Could not create an internal temp directory for the data store server at path: "
+                            + tempDir.getPath()
+                            + ". Please make sure this directory exists and is writable by the data store server or provide an alternate using directory for the "
+                            + DSS_TEMP_DIR_PATH + " configuration setting");
+        }
+        return tempDir;
+    }
 }
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 826dcb9c39fdbb894cd7c9d55edb0e9c46389596..b7caa65e228dde94cc3b62f8e24c15e293e6c9fa 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/TransferredDataSetHandlerTest.java
@@ -287,8 +287,9 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC
         TopLevelDataSetRegistratorGlobalState globalState =
                 new TopLevelDataSetRegistratorGlobalState("dss",
                         ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID,
-                        workingDirectory, authorizedLimsService, mailClient, dataSetValidator,
-                        null, new DynamicTransactionQueryFactory(), true, threadParameters);
+                        workingDirectory, workingDirectory, authorizedLimsService, mailClient,
+                        dataSetValidator, null, new DynamicTransactionQueryFactory(), true,
+                        threadParameters);
 
         context.checking(new Expectations()
             {
@@ -806,8 +807,9 @@ public final class TransferredDataSetHandlerTest extends AbstractFileSystemTestC
         TopLevelDataSetRegistratorGlobalState globalState =
                 new TopLevelDataSetRegistratorGlobalState("dss",
                         ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID,
-                        workingDirectory, authorizedLimsService, mailClient, dataSetValidator,
-                        null, new DynamicTransactionQueryFactory(), true, threadParameters);
+                        workingDirectory, workingDirectory, authorizedLimsService, mailClient,
+                        dataSetValidator, 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 440479560246ce91a8549ae5b223fcab0845136d..6034333437fcdc976c24b79c2b89145d770ff371 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
@@ -173,8 +173,8 @@ public abstract class AbstractJythonDataSetHandlerTest extends AbstractFileSyste
         TopLevelDataSetRegistratorGlobalState globalState =
                 new TopLevelDataSetRegistratorGlobalState("dss",
                         ch.systemsx.cisd.openbis.dss.generic.shared.Constants.DEFAULT_SHARE_ID,
-                        workingDirectory, openBisService, mailClient, dataSetValidator,
-                        dataSourceQueryService, myFactory, true, threadParameters);
+                        workingDirectory, workingDirectory, openBisService, mailClient,
+                        dataSetValidator, dataSourceQueryService, myFactory, true, threadParameters);
         return globalState;
     }
 
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 f3e1832298bc12d5c00488e8dc91e8cb0345a30f..43dffe1af828eea4968617300c1eed0473edc46c 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
@@ -111,8 +111,9 @@ 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,
-                        new DynamicTransactionQueryFactory(), true, threadParameters);
+                        workingDirectory, workingDirectory, openBisService, mailClient,
+                        dataSetValidator, null, new DynamicTransactionQueryFactory(), true,
+                        threadParameters);
         return globalState;
     }
 
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 4df92f78de45aebd653c9f4f5dffc867cca82ff9..130a17d29ba9a873c338562708d82729ad313baf 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
@@ -421,8 +421,9 @@ 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,
-                        new DynamicTransactionQueryFactory(), true, threadParameters);
+                        workingDirectory, workingDirectory, openBisService, mailClient,
+                        dataSetValidator, null, new DynamicTransactionQueryFactory(), true,
+                        threadParameters);
         return globalState;
     }