diff --git a/screening/etc/example-dropbox-configuration/jython-flexible-images/data-set-handler.py b/screening/etc/example-dropbox-configuration/jython-flexible-images/data-set-handler.py
new file mode 100755
index 0000000000000000000000000000000000000000..dcd2d013cfbb941a2af1f408fd2f9012b7d8eeae
--- /dev/null
+++ b/screening/etc/example-dropbox-configuration/jython-flexible-images/data-set-handler.py
@@ -0,0 +1,119 @@
+#! /usr/bin/env python
+# This is an example Jython dropbox for importing HCS image datasets
+
+import os
+from ch.systemsx.cisd.openbis.dss.etl.dto.api.v1 import *
+from ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto import Geometry
+
+    
+class ImageDataSetFlexible(SimpleImageDataConfig):
+    """
+    Extracts tile number, channel code and well code for a given relative path to an image.
+    Will be called for each file found in the incoming directory which has the allowed image extension.
+      
+    Example file name: bDZ01-1A_wD17_s3_z123_t321_cGFP
+    Returns:
+        ImageMetadata
+    """
+    def extractImageMetadata(self, imagePath):
+        image_tokens = ImageMetadata()
+    
+        basename = os.path.splitext(imagePath)[0]
+        # 
+        token_dict = {}
+        for token in basename.split("_"):
+            token_dict[token[:1]] = token[1:]
+        
+        image_tokens.well = token_dict["w"]
+        fieldText = token_dict["s"]
+        try:
+            image_tokens.tileNumber = int(fieldText)
+        except ValueError:
+            raise Exception("Cannot parse field number from '" + fieldText + "' in '" + basename + "' file name.")
+    
+        image_tokens.channelCode = token_dict["c"]
+        return image_tokens
+
+    """
+    Overrides the default implementation which returns (1, maxTileNumber) geometry.
+    
+    Calculates the width and height of the matrix of tiles (a.k.a. fields or sides) in the well.
+    
+    Parameter imageMetadataList: a list of metadata for each encountered image
+    Parameter maxTileNumber: the biggest tile number among all encountered images
+    Returns:
+        Geometry
+    """
+    def getTileGeometry(self, imageTokens, maxTileNumber):
+        return Geometry.createFromRowColDimensions(maxTileNumber / 3, 3);
+    
+    """
+    Overrides the default implementation which does the same thing (to demonstrate how this can be done). 
+    
+    For a given tile number and tiles geometry returns (x,y) which describes where the tile is
+    located on the well.
+    
+    Parameter tileNumber: number of the tile
+    Parameter tileGeometry: the geometry of the well matrix
+    Returns:
+         Location
+    """
+    def getTileCoordinates(self, tileNumber, tileGeometry):
+        columns = tileGeometry.getWidth()
+        row = ((tileNumber - 1) / columns) + 1
+        col = ((tileNumber - 1) % columns) + 1
+        return Location(row, col)
+
+""" sample type code of the plate, needed if a new sample is registered automatically """
+PLATE_TYPE_CODE = "PLATE"
+SIRNA_EXP_TYPE = "SIRNA_HCS"
+DEFAULT_SPACE = "TEST"
+""" project and experiment where new plates will be registered """
+DEFAULT_PROJECT_CODE = "TEST-PROJECT"
+DEFAULT_EXPERIMENT_CODE = "E1"
+
+PLATE_GEOMETRY_PROPERTY_CODE = "$PLATE_GEOMETRY"
+PLATE_GEOMETRY = "384_WELLS_16X24"
+
+if incoming.isDirectory(): 
+    tokens = incoming.getName().split(".")
+    if len(tokens) < 2:
+        print "Invalid name:", incoming.getName()
+        exit
+    plateCode = tokens[0]
+    experimentCode = tokens[1]
+    
+    config = ImageDataSetFlexible()
+    config.setRawImageDatasetType()
+    config.setPlate(DEFAULT_SPACE, plateCode)
+    #factory.registerImageDataset(config, incoming, service)
+    imageRegistrationDetails = factory.createImageRegistrationDetails(config, incoming)
+
+    tr = service.transaction(incoming, factory)
+    
+    sampleIdentifier = "/"+DEFAULT_SPACE+"/"+plateCode
+    plate = tr.getSample(sampleIdentifier)
+    if plate == None:
+        expIdentifier = "/"+DEFAULT_SPACE+"/"+DEFAULT_PROJECT_CODE+"/"+experimentCode
+        #expIdentifier = "/"+DEFAULT_SPACE+"/"+DEFAULT_PROJECT_CODE+"/"+DEFAULT_EXPERIMENT_CODE
+        experiment = tr.getExperiment(expIdentifier)
+        if experiment == None:
+            experiment = tr.createNewExperiment(expIdentifier)
+            experiment.setType(SIRNA_EXP_TYPE)
+            experiment.setPropertyValue("MICROSCOPE", "BD_PATHWAY_855")
+            experiment.setPropertyValue("DESCRIPTION", "koko")
+
+        plate = tr.createNewSample(sampleIdentifier)
+        plate.setType(PLATE_TYPE_CODE)
+        plate.setPropertyValue(PLATE_GEOMETRY_PROPERTY_CODE, PLATE_GEOMETRY)
+        plate.setExperiment(experiment)
+        tr.commit()
+        tr = service.transaction(incoming, factory)
+    
+    imageDataset = tr.createNewDataSet(imageRegistrationDetails)
+    imageDataset.setSample(plate)
+    imageDataSetFolder = tr.moveFile(incoming.getPath(), imageDataset)
+    imageDatasetCode = imageDataset.getDataSetCode()
+    print "Registered dataset:", imageDatasetCode
+    tr.commit()
+
diff --git a/screening/etc/example-dropbox-configuration/jython-flexible-images/example-images.zip b/screening/etc/example-dropbox-configuration/jython-flexible-images/example-images.zip
new file mode 100644
index 0000000000000000000000000000000000000000..cb8a851aaf6029592ae5a69de5cbc32d236fc488
Binary files /dev/null and b/screening/etc/example-dropbox-configuration/jython-flexible-images/example-images.zip differ