diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/DataSetRegistrationHelper.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/DataSetRegistrationHelper.java
new file mode 100644
index 0000000000000000000000000000000000000000..469e743854bcde173a3ce66dbbeab40aa3edced9
--- /dev/null
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/DataSetRegistrationHelper.java
@@ -0,0 +1,167 @@
+/*
+ * Copyright 2010 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.api.v1;
+
+import java.io.File;
+import java.util.concurrent.locks.Lock;
+
+import org.apache.log4j.Logger;
+
+import ch.systemsx.cisd.common.filesystem.FileOperations;
+import ch.systemsx.cisd.common.filesystem.IFileOperations;
+import ch.systemsx.cisd.common.mail.IMailClient;
+import ch.systemsx.cisd.common.utilities.IDelegatedActionWithResult;
+import ch.systemsx.cisd.etlserver.DataSetRegistrationAlgorithm;
+import ch.systemsx.cisd.etlserver.IDataSetInfoExtractor;
+import ch.systemsx.cisd.etlserver.IDataStrategyStore;
+import ch.systemsx.cisd.etlserver.IETLServerPlugin;
+import ch.systemsx.cisd.etlserver.IStorageProcessor;
+import ch.systemsx.cisd.etlserver.ITypeExtractor;
+import ch.systemsx.cisd.etlserver.validation.IDataSetValidator;
+import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
+
+/**
+ * @author Chandrasekhar Ramakrishnan
+ */
+class DataSetRegistrationHelper extends DataSetRegistrationAlgorithm
+{
+
+    private final PutDataSetService service;
+
+    private final IETLServerPlugin plugin;
+
+    /**
+     * @param incomingDataSetFile
+     * @param cleanAftrewardsAction
+     */
+    public DataSetRegistrationHelper(PutDataSetService service, IETLServerPlugin plugin,
+            File incomingDataSetFile, IDelegatedActionWithResult<Boolean> cleanAftrewardsAction)
+    {
+        super(incomingDataSetFile, cleanAftrewardsAction);
+        this.service = service;
+        this.plugin = plugin;
+    }
+
+    @Override
+    protected IDataSetInfoExtractor getDataSetInfoExtractor()
+    {
+        return plugin.getDataSetInfoExtractor();
+    }
+
+    @Override
+    protected IDataSetValidator getDataSetValidator()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    protected String getDataStoreCode()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    protected IDataStrategyStore getDataStrategyStore()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    protected String getEmailSubjectTemplate()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    protected IFileOperations getFileOperations()
+    {
+        return FileOperations.getMonitoredInstanceForCurrentThread();
+    }
+
+    @Override
+    protected DatabaseInstance getHomeDatabaseInstance()
+    {
+        // TODO Auto-generated method stub
+        return null;
+    }
+
+    @Override
+    protected IMailClient getMailClient()
+    {
+        return service.getMailClient();
+    }
+
+    @Override
+    protected Logger getNotificationLog()
+    {
+        return service.getOperationLog();
+    }
+
+    @Override
+    protected IEncapsulatedOpenBISService getOpenBisService()
+    {
+        return service.getOpenBisService();
+    }
+
+    @Override
+    protected Logger getOperationLog()
+    {
+        return service.getOperationLog();
+    }
+
+    @Override
+    protected Lock getRegistrationLock()
+    {
+        return service.getRegistrationLock();
+    }
+
+    @Override
+    protected IStorageProcessor getStorageProcessor()
+    {
+        return plugin.getStorageProcessor();
+    }
+
+    @Override
+    protected ITypeExtractor getTypeExtractor()
+    {
+        return plugin.getTypeExtractor();
+    }
+
+    @Override
+    protected void rollback(Throwable ex)
+    {
+        rollbackStorageProcessor(ex);
+    }
+
+    @Override
+    protected boolean shouldDeleteUnidentified()
+    {
+        return true;
+    }
+
+    @Override
+    protected boolean shouldNotifySuccessfulRegistration()
+    {
+        return false;
+    }
+
+}
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetExecutor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetExecutor.java
index d26d9e13996b269a072e29d33bf61c69b7cef4fb..7b4f1d761f4a8eb4338dba929fedc01c394ec41b 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetExecutor.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetExecutor.java
@@ -30,6 +30,7 @@ import org.apache.log4j.Logger;
 import ch.systemsx.cisd.common.exceptions.EnvironmentFailureException;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.io.ConcatenatedFileOutputStreamWriter;
+import ch.systemsx.cisd.etlserver.IETLServerPlugin;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.FileInfoDssDTO;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO;
@@ -52,6 +53,8 @@ class PutDataSetExecutor
     private final PutDataSetService service;
 
     // Command Context State
+    private final IETLServerPlugin plugin;
+
     private final String sessionToken;
 
     private final NewDataSetDTO newDataSet;
@@ -60,10 +63,11 @@ class PutDataSetExecutor
 
     private final File dataSetDir;
 
-    PutDataSetExecutor(PutDataSetService service, String sessionToken, NewDataSetDTO newDataSet,
-            InputStream inputStream)
+    PutDataSetExecutor(PutDataSetService service, IETLServerPlugin plugin, String sessionToken,
+            NewDataSetDTO newDataSet, InputStream inputStream)
     {
         this.service = service;
+        this.plugin = plugin;
         this.sessionToken = sessionToken;
         this.newDataSet = newDataSet;
         this.inputStream = inputStream;
@@ -94,6 +98,10 @@ class PutDataSetExecutor
         // the space or an ETL server can override.
 
         // Register data set
+        DataSetRegistrationHelper helper =
+                new DataSetRegistrationHelper(service, plugin, dataSetDir, null);
+        helper.prepare();
+        helper.registerDataSet();
 
         deleteDataSetDir();
     }
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 f4cbf273566d9c495ee71acbbde7fa63b143fbb4..3eec8d184b56806924243b0acc1de94070627507 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
@@ -20,13 +20,18 @@ import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.Properties;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReentrantLock;
 
 import org.apache.log4j.Logger;
 
 import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.mail.MailClient;
+import ch.systemsx.cisd.etlserver.DataStrategyStore;
+import ch.systemsx.cisd.etlserver.IETLServerPlugin;
 import ch.systemsx.cisd.etlserver.Parameters;
+import ch.systemsx.cisd.etlserver.ThreadParameters;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO;
 
@@ -40,24 +45,35 @@ public class PutDataSetService
 {
     private final IEncapsulatedOpenBISService openBisService;
 
-    private final MailClient mailClient;
+    private final Logger operationLog;
 
-    private final File incomingDir;
+    private final Lock registrationLock;
 
-    private final Logger operationLog;
+    private final DataStrategyStore dataStrategyStore;
+
+    private MailClient mailClient;
+
+    private IETLServerPlugin plugin;
+
+    private File incomingDir;
 
     public PutDataSetService(IEncapsulatedOpenBISService openBisService, Logger operationLog)
     {
         this.openBisService = openBisService;
         this.operationLog = operationLog;
 
-        PutDataSetServiceInitializer initializer = new PutDataSetServiceInitializer();
+        // PutDataSetServiceInitializer initializer = new PutDataSetServiceInitializer();
+        //
+        // incomingDir = initializer.getIncomingDir();
+        // incomingDir.mkdir();
+        //
+        // plugin = initializer.getPlugin();
+        //
+        // mailClient = new MailClient(initializer.getMailProperties());
 
-        incomingDir = initializer.getIncomingDir();
-        incomingDir.mkdir();
+        this.registrationLock = new ReentrantLock();
 
-        // mailClient = new MailClient(initializer.getMailProperties());
-        mailClient = null;
+        this.dataStrategyStore = new DataStrategyStore(this.openBisService, mailClient);
     }
 
     public void putDataSet(String sessionToken, NewDataSetDTO newDataSet, InputStream inputStream)
@@ -65,7 +81,7 @@ public class PutDataSetService
     {
         try
         {
-            new PutDataSetExecutor(this, sessionToken, newDataSet, inputStream).execute();
+            new PutDataSetExecutor(this, plugin, sessionToken, newDataSet, inputStream).execute();
 
         } catch (UserFailureException e)
         {
@@ -105,6 +121,17 @@ public class PutDataSetService
     {
         return operationLog;
     }
+
+    public Lock getRegistrationLock()
+    {
+        return registrationLock;
+    }
+
+    public DataStrategyStore getDataStrategyStore()
+    {
+        return dataStrategyStore;
+    }
+
 }
 
 /**
@@ -131,11 +158,10 @@ class PutDataSetServiceInitializer
         return Parameters.createMailProperties(params.getProperties());
     }
 
-    Object getPlugin()
+    IETLServerPlugin getPlugin()
     {
-        // ThreadParameters[] threadParams = params.getThreads();
-        // return threadParams[0].getPlugin();
-        return null;
+        ThreadParameters[] threadParams = params.getThreads();
+        return threadParams[0].getPlugin();
     }
 
 }