diff --git a/integration-tests/run.sh b/integration-tests/run.sh
index c83d52324ae5c1c67d577f50dd5db77db92cfac8..925b2771522cefc342d1f51bc6d50ab012e127d2 100755
--- a/integration-tests/run.sh
+++ b/integration-tests/run.sh
@@ -217,8 +217,7 @@ function install_lims_client {
 # unpack everything, override default configuration with test configuation	
 function install_etls {
     unpack etlserver
-    prepare etlserver etlserver-raw
-    prepare etlserver etlserver-analys
+    prepare etlserver etlserver-all
     remove_unpacked etlserver
 }
 
@@ -378,7 +377,7 @@ function create_test_data_dir {
     local DIR=$2
     mkdir $DIR/$NAME
     local i=0  
-    while [  $i -lt 5 ]; do
+    while [  $i -lt 15 ]; do
 	create_test_data_file $DIR/$NAME/$NAME-data$i.txt
 	let i=i+1 
     done
@@ -438,8 +437,7 @@ function switch_dmv {
 
 function switch_processing_pipeline {
     new_state=$1
-    switch_etl $new_state etlserver-analys
-    switch_etl $new_state etlserver-raw 
+    switch_etl $new_state etlserver-all
     switch_dmv $new_state datamover-analys
     switch_sth $new_state dummy-img-analyser start.sh stop.sh
     switch_dmv $new_state datamover-raw
@@ -472,9 +470,11 @@ function assert_correct_results {
     assert_dir_empty $DATA/in-analys
     assert_dir_empty $DATA/out-analys
     assert_dir_empty $DATA/analys-copy
-    imgAnalys="$DATA/store-analys/Project_NEMO/Experiment_EXP1/ObservableType_IMAGE_ANALYSIS_DATA/Barcode_3VCP1/1"
+    
+    local store_dir=$DATA/main-store
+    local imgAnalys="$store_dir/Project_NEMO/Experiment_EXP1/ObservableType_IMAGE_ANALYSIS_DATA/Barcode_3VCP1/1"
     assert_dir_exists "$imgAnalys"
-    rawData="$DATA/store-raw/3V/Project_NEMO/Experiment_EXP1/ObservableType_IMAGE/Barcode_3VCP1/1"
+    local rawData="$store_dir/3V/Project_NEMO/Experiment_EXP1/ObservableType_IMAGE/Barcode_3VCP1/1"
     assert_dir_exists "$rawData"
 }
 
diff --git a/integration-tests/templates/data/main-store/.gitignore b/integration-tests/templates/data/main-store/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/integration-tests/templates/etlserver-raw/etc/service.properties b/integration-tests/templates/etlserver-raw/etc/service.properties
index e9c67cbb546841666f1e5131bbbbcd08a9289215..977b2d5b668970e9f362542648a2db959b4369b4 100644
--- a/integration-tests/templates/etlserver-raw/etc/service.properties
+++ b/integration-tests/templates/etlserver-raw/etc/service.properties
@@ -1,8 +1,5 @@
 # The root directory of the data store
-storeroot-dir = ../data/store-raw
-
-# The directory to watch for incoming data.
-incoming-dir = ../data/out-raw
+storeroot-dir = ../data/main-store
 
 # The check interval (in seconds)
 check-interval = 2
@@ -11,7 +8,7 @@ check-interval = 2
 server-url = https://localhost:8443/openbis/services/etl-openbis
 
 # The username to use when contacting the LIMS server
-username = etlserver2
+username = etlserver
 
 # The password to use when contacting the LIMS server
 password = <change this>
@@ -29,30 +26,62 @@ mail.smtp.host = mail.ethz.ch
 # The number of milliseconds to wait before retrying to execute the renaming process.
 # renaming.failure.millis-to-sleep = 5000
 
+# Comma separated names of processing threads. Each thread should have configuration properties prefixed with its name
+# E.g. 'code-extractor' property for the thread 'my-etl' should be specified as 'my-etl.code-extractor'
+inputs=raw-data,image-analysis
+
 # ---------------------------------------------------------------------------
-# Plugin properties
+# Raw data thread
 # ---------------------------------------------------------------------------
+# The directory to watch for incoming data.
+raw-data.incoming-dir = ../data/out-raw
 
-# The extractor class to use for code extraction
-code-extractor = ch.systemsx.cisd.etlserver.threev.CodeExtractor
+# The extractor plugin class to use for code extraction
+raw-data.code-extractor = ch.systemsx.cisd.etlserver.threev.CodeExtractor
 # The separator that separates an experiment code from the data set one
-code-extractor.entity-separator = _
-code-extractor.number-of-prefixes = 2
+raw-data.code-extractor.entity-separator = _
+raw-data.code-extractor.number-of-prefixes = 2
 # The separator that separates project code from experiment code
-code-extractor.project-separator = .
+raw-data.code-extractor.project-separator = .
+# ...........................................................................
+
+# The extractor plugin class to use for type extraction
+raw-data.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor
+raw-data.type-extractor.file-format-type = TIFF
+raw-data.type-extractor.locator-type = RELATIVE LOCATION
+raw-data.type-extractor.observable-type = IMAGE
+raw-data.type-extractor.procedure-type = DATA ACQUISITION
+
+# The storage processor plugin (IStorageProcessor implementation)
+# raw-data.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor
+raw-data.storage-processor = ch.systemsx.cisd.etlserver.BDSStorageProcessor
+raw-data.storage-processor.version = 1.0
+raw-data.storage-processor.measurementEntityTypeDescription = screening plate
+raw-data.storage-processor.processingType = RAW_DATA
+raw-data.storage-processor.format = HCS_IMAGE V1.0
+raw-data.storage-processor.number_of_channels = 1
+raw-data.storage-processor.contains_original_data = true
+raw-data.storage-processor.well_geometry = 3x3
+raw-data.storage-processor.plate_geometry = 16x24
+raw-data.storage-processor.file-extractor = ch.systemsx.cisd.etlserver.threev.HCSImageFileExtractor
+
+# ---------------------------------------------------------------------------
+# image-analysis thread
+# ---------------------------------------------------------------------------
+image-analysis.incoming-dir = ../data/out-analys
+
+image-analysis.code-extractor = ch.systemsx.cisd.etlserver.threev.CodeExtractor
+image-analysis.code-extractor.entity-separator = _
+image-analysis.code-extractor.number-of-prefixes = 2
+image-analysis.code-extractor.project-separator = .
 # ...........................................................................
 
 # The extractor class to use for type extraction
-type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor
-type-extractor.file-format-type = TIFF
-type-extractor.locator-type = RELATIVE LOCATION
-type-extractor.observable-type = IMAGE
-type-extractor.procedure-type = DATA ACQUISITION
+image-analysis.type-extractor = ch.systemsx.cisd.etlserver.SimpleTypeExtractor
+image-analysis.type-extractor.file-format-type = 3VPROPRIETARY
+image-analysis.type-extractor.locator-type = RELATIVE LOCATION
+image-analysis.type-extractor.observable-type = IMAGE_ANALYSIS_DATA
+image-analysis.type-extractor.procedure-type = IMAGE ANALYSIS
 
 # The storage processor (IStorageProcessor implementation)
-# storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor
-storage-processor = ch.systemsx.cisd.etlserver.BDSStorageProcessor
-storage-processor.version = 1.0
-storage-processor.measurementEntityTypeDescription = screening plate
-storage-processor.processingType = RAW_DATA
-storage-processor.format = UNKNOWN V1.0
\ No newline at end of file
+image-analysis.storage-processor = ch.systemsx.cisd.etlserver.DefaultStorageProcessor
diff --git a/integration-tests/templates/openBIS-server/roles.conf b/integration-tests/templates/openBIS-server/roles.conf
index 4e6837a08241c15c507771b36d43d3881049b55d..811246ef9448e23030e329669b1f7fab5e50a0e0 100644
--- a/integration-tests/templates/openBIS-server/roles.conf
+++ b/integration-tests/templates/openBIS-server/roles.conf
@@ -2,5 +2,5 @@
 poweruser
 
 [Roles]
-etlserver = etlserver1,etlserver2
+etlserver = etlserver
 admin = test
\ No newline at end of file