diff --git a/integration-tests/templates/data-ibrain2/scripts/commonDropbox.py b/integration-tests/templates/data-ibrain2/scripts/commonDropbox.py
index c6ddb2ffa478b74b2738ffadbd24f921c92fb68c..97c8f1d22984c8f3048f4d8dd9602a22ffaa0f9e 100755
--- a/integration-tests/templates/data-ibrain2/scripts/commonDropbox.py
+++ b/integration-tests/templates/data-ibrain2/scripts/commonDropbox.py
@@ -10,6 +10,7 @@ class AbstractPropertiesParser:
 		path = os.path.join(incoming, fileName)
 		self._propertiesDict = self._parseMetadata(path)
 	
+	# Returns: name of the file
 	def _findFile(self, incoming, prefix):
 		for file in os.listdir(incoming):
 			if file.startswith(prefix):
@@ -184,30 +185,34 @@ class RegistrationConfirmationUtils:
 
 # --------------
 
-def setImageDatasetPropertiesAndRegister(imageDataset, iBrain2DatasetId, metadataParser, incoming, service, factory):
-    imageRegistrationDetails = factory.createImageRegistrationDetails(imageDataset, incoming)
-    for propertyCode, value in metadataParser.getDatasetPropertiesIter():
-        imageRegistrationDetails.setPropertyValue(propertyCode, value)
-
-    tr = service.transaction(incoming, factory)
-    dataset = tr.createNewDataSet(imageRegistrationDetails)
-    dataset.setParentDatasets([metadataParser.getParentDatasetPermId()])
-    imageDataSetFolder = tr.moveFile(incoming.getPath(), dataset)
-    if tr.commit():
+def setImageDatasetPropertiesAndRegister(imageDataset, metadataParser, incoming, service, factory):
+	iBrain2DatasetId = metadataParser.getIBrain2DatasetId()
+   	imageRegistrationDetails = factory.createImageRegistrationDetails(imageDataset, incoming)
+   	for propertyCode, value in metadataParser.getDatasetPropertiesIter():
+   		imageRegistrationDetails.setPropertyValue(propertyCode, value)
+
+	tr = service.transaction(incoming, factory)
+	dataset = tr.createNewDataSet(imageRegistrationDetails)
+	dataset.setParentDatasets([metadataParser.getParentDatasetPermId()])
+	imageDataSetFolder = tr.moveFile(incoming.getPath(), dataset)
+	if tr.commit():
 		createSuccessStatus(iBrain2DatasetId, dataset, incoming.getPath())
 
 def registerDerivedBlackBoxDataset(state, service, factory, incoming, metadataParser, datasetType, fileFormatType):
+    transaction = service.transaction(incoming, factory)
+    dataset = transaction.createNewDataSet()
+    dataset.setDataSetType(datasetType)
+    dataset.setFileFormatType(fileFormatType)
+    registerDerivedDataset(state, transaction, dataset, incoming, metadataParser)
+    
+def registerDerivedDataset(state, transaction, dataset, incoming, metadataParser):
     iBrain2DatasetId = metadataParser.getIBrain2DatasetId()
     openbisDatasetParent = metadataParser.getParentDatasetPermId()
 
     (space, plate) = tryGetConnectedPlate(state, openbisDatasetParent, iBrain2DatasetId, incoming.getPath())
     if plate == None:
         return
-    transaction = service.transaction(incoming, factory)
     
-    dataset = transaction.createNewDataSet()
-    dataset.setDataSetType(datasetType)
-    dataset.setFileFormatType(fileFormatType)
     dataset.setSample(transaction.getSample('/'+space+'/'+plate))
     dataset.setMeasuredData(False)
     for propertyCode, value in metadataParser.getDatasetPropertiesIter():
@@ -218,6 +223,12 @@ def registerDerivedBlackBoxDataset(state, service, factory, incoming, metadataPa
     if transaction.commit():
         createSuccessStatus(iBrain2DatasetId, dataset, incoming.getPath())
 
+def findCSVFile(dir):
+	for file in os.listdir(dir):
+		if file.endswith(".csv"):
+			return dir + "/" + file
+	raise Exception("No CSV file has been found in "+dir)
+
 """
 Returns:
    (plateSpace, plateCode) tuple for the plate connected with the specified dataset
diff --git a/integration-tests/templates/data-ibrain2/scripts/hcs_analysis_well_features.py b/integration-tests/templates/data-ibrain2/scripts/hcs_analysis_well_features.py
index 6486b490795426a271bc3d6571e08ac2653eeefe..1558b858e53580e9ddf0c73a27eb1fcdf13fc15f 100755
--- a/integration-tests/templates/data-ibrain2/scripts/hcs_analysis_well_features.py
+++ b/integration-tests/templates/data-ibrain2/scripts/hcs_analysis_well_features.py
@@ -1,19 +1,26 @@
 #! /usr/bin/env python
 # This is an example Jython dropbox for importing feature vectors coming from analysis of image datasets
  
-import os
 from ch.systemsx.cisd.openbis.dss.etl.dto.api.v1 import *
+import commonImageDropbox
+import commonDropbox
 
+reload(commonImageDropbox)
+reload(commonDropbox)
+
+# Global variable where we set the iBrain2 id of the dataset at the beginning, 
+# so that the rollback can use it as well.
+iBrain2DatasetId = None
+    
 SEPARATOR = ","
  
-# Specific code which defines the feature vector values for the dataset..
+# Specific code which defines the feature vector values for the dataset.
 # Usually you will parse the content of the incoming file or directory to get the values.
-# Here all the values are hard-coded for simplicity,
-# but the example shows which calls you need to perform in your parser.
 # Parameters
-#     incoming: java.io.File which points to the incoming dataset
-def defineFeatures(featuresBuilder, incoming):
-    file = open(incoming.getPath())
+#     incomingCsvPath: path which points to the incoming CSV file
+def defineFeatures(incomingCsvFile):
+    featuresBuilder = factory.createFeaturesBuilder()
+    file = open(incomingCsvFile)
     for header in file:
         headerTokens = header.split(SEPARATOR)
         featureCode = headerTokens[0]
@@ -27,40 +34,24 @@ def defineFeatures(featuresBuilder, incoming):
                 value = rowTokens[column].strip()
                 well = rowLabel + str(column)
                 featureValues.addValue(well, value)
- 
-# Returns the code of the plate to which the dataset should be connected.
-# Parameters
-#     incoming: java.io.File which points to the incoming dataset
-def extractPlateCode(incoming):
-    return os.path.splitext(incoming.getName())[0]
- 
-def extractSpaceCode(incoming):
-    return "TEST"
- 
-# ----------------------------               
-# --- boilerplate code which register one dataset with image analysis results on the well level
-# --- Nothing has to be modified if your case is not complicated.
-# ----------------------------               
- 
-featuresBuilder = factory.createFeaturesBuilder()
-defineFeatures(featuresBuilder, incoming)
- 
-analysisRegistrationDetails = factory.createFeatureVectorRegistrationDetails(featuresBuilder, incoming)
-tr = service.transaction(incoming, factory)
-analysisDataset = tr.createNewDataSet(analysisRegistrationDetails)
- 
-# set plate to which the dataset should be connected
-sampleIdentifier = "/"+extractSpaceCode(incoming)+"/"+extractPlateCode(incoming)
-plate = tr.getSample(sampleIdentifier)
-analysisDataset.setSample(plate)
- 
-# store the original file in the dataset.
-tr.moveFile(incoming.getPath(), analysisDataset)
- 
-# ----------------------------               
-# --- optional: other standard operations on analysisDataset can be performed (see IDataSet interface)
-# ----------------------------               
- 
-analysisDataset.setFileFormatType("CSV")
-analysisDataset.setDataSetType("HCS_ANALYSIS_WELL_FEATURES")
-#analysisDataset.setParentDatasets(["20110302085840150-90"])
\ No newline at end of file
+    return featuresBuilder
+
+def register(incomingPath):
+    metadataParser = commonDropbox.DerivedDatasetMetadataParser(incomingPath)
+    global iBrain2DatasetId
+    iBrain2DatasetId = metadataParser.getIBrain2DatasetId()
+
+    transaction = service.transaction(incoming, factory)
+    incomingCsvFile = commonDropbox.findCSVFile(incomingPath)
+    featuresBuilder = defineFeatures(incomingCsvFile)
+    analysisRegistrationDetails = factory.createFeatureVectorRegistrationDetails(featuresBuilder, incoming)
+    dataset = transaction.createNewDataSet(analysisRegistrationDetails)
+    dataset.setDataSetType('HCS_ANALYSIS_WELL_FEATURES')
+    dataset.setFileFormatType('CSV')
+    commonDropbox.registerDerivedDataset(state, transaction, dataset, incoming, metadataParser)
+ 
+def rollback_transaction(service, transaction, algorithmRunner, throwable):
+    commonDropbox.createFailureStatus(iBrain2DatasetId, throwable, incoming)
+            
+if incoming.isDirectory():
+    register(incoming.getPath())
\ No newline at end of file
diff --git a/integration-tests/templates/data-ibrain2/scripts/hcs_analysis_well_quality.py b/integration-tests/templates/data-ibrain2/scripts/hcs_analysis_well_quality.py
index f78ec67e6c3506a3a3ba7ea1a06c7998fe8c805d..ed49cae01e7244bd352252d2ea6c4ea997a393e1 100755
--- a/integration-tests/templates/data-ibrain2/scripts/hcs_analysis_well_quality.py
+++ b/integration-tests/templates/data-ibrain2/scripts/hcs_analysis_well_quality.py
@@ -19,16 +19,7 @@ def register(incomingPath):
     if plate == None:
         return
     
-    imageDataset = commonImageDropbox.IBrain2ImageDataSetConfig()
-    imageDataset.setOverviewImageDatasetType()
-    imageDataset.setPlate(space, plate)
-    imageDataset.setFileFormatType("JPG")
-    imageDataset.setRecognizedImageExtensions(["jpg", "jpeg", "png", "gif"])    
-    imageDataset.setStoreChannelsOnExperimentLevel(False)
-    imageDataset.setGenerateThumbnails(True)
-    imageDataset.setMaxThumbnailWidthAndHeight(imageDataset.THUMBANAIL_SIZE)
-
-    commonDropbox.setPropertiesAndRegister(imageDataset, iBrain2DatasetId, metadataParser, incoming, service, factory)
+    #TODO: finish me !!!!
 
 def rollback_transaction(service, transaction, algorithmRunner, throwable):
     commonDropbox.createFailureStatus(iBrain2DatasetId, throwable, incoming)
diff --git a/integration-tests/templates/data-ibrain2/scripts/hcs_image_overview.py b/integration-tests/templates/data-ibrain2/scripts/hcs_image_overview.py
index 500dc57059e20890a77f0965563cc074064a2cf2..a596c43cc6dc1308138ef078fbc0448b28532571 100755
--- a/integration-tests/templates/data-ibrain2/scripts/hcs_image_overview.py
+++ b/integration-tests/templates/data-ibrain2/scripts/hcs_image_overview.py
@@ -29,7 +29,7 @@ def register(incomingPath):
     imageDataset.setGenerateThumbnails(True)
     imageDataset.setMaxThumbnailWidthAndHeight(imageDataset.THUMBANAIL_SIZE)
 
-    commonDropbox.setImageDatasetPropertiesAndRegister(imageDataset, iBrain2DatasetId, metadataParser, incoming, service, factory)
+    commonDropbox.setImageDatasetPropertiesAndRegister(imageDataset, metadataParser, incoming, service, factory)
 
 def rollback_transaction(service, transaction, algorithmRunner, throwable):
     commonDropbox.createFailureStatus(iBrain2DatasetId, throwable, incoming)
diff --git a/integration-tests/templates/data-ibrain2/scripts/hcs_image_segmentation.py b/integration-tests/templates/data-ibrain2/scripts/hcs_image_segmentation.py
index b514027f8a30d12935478509b093be9d96b50feb..a0d9f775c2d4f222b4749c5af5495ea154dd9a3d 100755
--- a/integration-tests/templates/data-ibrain2/scripts/hcs_image_segmentation.py
+++ b/integration-tests/templates/data-ibrain2/scripts/hcs_image_segmentation.py
@@ -33,7 +33,7 @@ def register(incomingPath):
     imageDataset.setStoreChannelsOnExperimentLevel(False)
     imageDataset.setOriginalDataStorageFormat(OriginalDataStorageFormat.HDF5)
   
-    commonDropbox.setImageDatasetPropertiesAndRegister(imageDataset, iBrain2DatasetId, metadataParser, incoming, service, factory)
+    commonDropbox.setImageDatasetPropertiesAndRegister(imageDataset, metadataParser, incoming, service, factory)
 
 def rollback_transaction(service, transaction, algorithmRunner, throwable):
     commonDropbox.createFailureStatus(iBrain2DatasetId, throwable, incoming)