diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/AbstractPostRegistrationTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/AbstractPostRegistrationTask.java
index 823daf9f8cb17a2fa113eaf40e8a51e4e74ab9b7..f8595a4f04e40eb00b97a2d3f4482908cbaca1b4 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/AbstractPostRegistrationTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/AbstractPostRegistrationTask.java
@@ -16,30 +16,33 @@
 
 package ch.systemsx.cisd.etlserver.postregistration;
 
+import java.util.Properties;
+
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 
 /**
- * 
+ * Abstract super class of all implementations of {@link IPostRegistrationTask}.
  *
  * @author Franz-Josef Elmer
  */
 public abstract class AbstractPostRegistrationTask implements IPostRegistrationTask
 {
+    private static final NoCleanupTask DEFAULT_CLEANUP_TASK = new NoCleanupTask();
+    
+    protected final Properties properties;
     protected final IEncapsulatedOpenBISService service;
 
-    public AbstractPostRegistrationTask(IEncapsulatedOpenBISService service)
+    public AbstractPostRegistrationTask(Properties properties, IEncapsulatedOpenBISService service)
     {
+        this.properties = properties;
         this.service = service;
     }
-    
-    public final void execute(String dataSetCode, ICleanupTaskHandler handler)
+
+    /**
+     * Returns a cleanup task which does nothing.
+     */
+    public ICleanupTask createCleanupTask(String dataSetCode)
     {
-        handler.handle(computeCleanupTask(dataSetCode));
-        processDataSet(dataSetCode);
+        return DEFAULT_CLEANUP_TASK;
     }
-
-    protected abstract ICleanupTask computeCleanupTask(String dataSetCode);
-
-    protected abstract void processDataSet(String dataSetCode);
-
-  }
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/IPostRegistrationTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/IPostRegistrationTask.java
index bf4c89d45b1789a28df66e0098703427c85a0158..a24c8e959e0ff0e154b206577b361e4393ca0a51 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/IPostRegistrationTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/IPostRegistrationTask.java
@@ -16,13 +16,24 @@
 
 package ch.systemsx.cisd.etlserver.postregistration;
 
+import java.util.Properties;
+
+import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
+
 /**
- * Interface of a task executed after registration of a data set.
- *
+ * Interface of a task executed after registration of a data set. Implementing class should have a
+ * public constructor with two parameters: First is of type {@link Properties} and second is of type
+ * {@link IEncapsulatedOpenBISService}.
+ * 
  * @author Franz-Josef Elmer
  */
 public interface IPostRegistrationTask
 {
+    /**
+     * Returns <code>true</code> if this task needs a lock onto the data store.
+     */
+    public boolean requiresDataStoreLock();
+    
     /**
      * Creates a cleanup task for the specified data set. This method will be invoked before the
      * actual task is performed by the method {@link #execute(String)}.
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/ICleanupTaskHandler.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/NoCleanupTask.java
similarity index 77%
rename from datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/ICleanupTaskHandler.java
rename to datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/NoCleanupTask.java
index a88ef5d74fe2f2a151e7cf665de22eac33d698b5..515962f7280238340c8f2cf972692c660e065735 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/ICleanupTaskHandler.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/NoCleanupTask.java
@@ -17,11 +17,16 @@
 package ch.systemsx.cisd.etlserver.postregistration;
 
 /**
- * Interface for classes which can handle {@link ICleanupTask} instances.
+ * An implementation of {@link ICleanupTask} which does nothing.
  *
  * @author Franz-Josef Elmer
  */
-public interface ICleanupTaskHandler
+public class NoCleanupTask implements ICleanupTask
 {
-    public void handle(ICleanupTask cleanupTask);
+    private static final long serialVersionUID = 1L;
+
+    public void cleanup()
+    {
+    }
+
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/PostRegistrationMaintenanceTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/PostRegistrationMaintenanceTask.java
index 2697a9ba824086365ab169cfcc881021ff491dcb..f8298e2ce6ec1273aba60d7910fb5252862f3075 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/PostRegistrationMaintenanceTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/PostRegistrationMaintenanceTask.java
@@ -37,7 +37,7 @@ import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
-import ch.systemsx.cisd.common.maintenance.IMaintenanceTask;
+import ch.systemsx.cisd.common.maintenance.IDataStoreLockingMaintenanceTask;
 import ch.systemsx.cisd.common.utilities.ClassUtils;
 import ch.systemsx.cisd.common.utilities.PropertyParametersUtil;
 import ch.systemsx.cisd.common.utilities.PropertyParametersUtil.SectionProperties;
@@ -52,7 +52,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria
  *
  * @author Franz-Josef Elmer
  */
-public class PostRegistrationMaintenanceTask implements IMaintenanceTask
+public class PostRegistrationMaintenanceTask implements IDataStoreLockingMaintenanceTask
 {
     private static final String POST_REGISTRATION_TASKS_PROPERTY = "post-registration-tasks";
     
@@ -79,6 +79,8 @@ public class PostRegistrationMaintenanceTask implements IMaintenanceTask
     
     private IEncapsulatedOpenBISService service;
     
+    private boolean needsLockOnDataStore;
+    
     private Set<Entry<String, IPostRegistrationTask>> tasks;
     
     private File cleanupTasksFolder;
@@ -87,6 +89,11 @@ public class PostRegistrationMaintenanceTask implements IMaintenanceTask
 
     private File newLastSeenDataSetFile;
 
+    public boolean requiresDataStoreLock()
+    {
+        return needsLockOnDataStore;
+    }
+
     public void setUp(String pluginName, Properties properties)
     {
         service = ServiceProvider.getOpenBISService();
@@ -100,7 +107,12 @@ public class PostRegistrationMaintenanceTask implements IMaintenanceTask
             Properties taskPorperties = sectionProperty.getProperties();
             String className = PropertyUtils.getMandatoryProperty(taskPorperties, "class");
             IPostRegistrationTask task =
-                    ClassUtils.create(IPostRegistrationTask.class, className, taskPorperties);
+                    ClassUtils.create(IPostRegistrationTask.class, className, taskPorperties,
+                            service);
+            if (task.requiresDataStoreLock())
+            {
+                needsLockOnDataStore = true;
+            }
             map.put(sectionProperty.getKey(), task);
         }
         tasks = map.entrySet();