diff --git a/spim_registration/timelapse/Snakefile b/spim_registration/timelapse/Snakefile
old mode 100644
new mode 100755
index cafc9128152cf949d6fe15794451ee7f16b399d8..812dccc659d3b7bfd2aed5728f94dd2c1cf1ebf2
--- a/spim_registration/timelapse/Snakefile
+++ b/spim_registration/timelapse/Snakefile
@@ -1,162 +1,475 @@
 import os, glob, sys, re
+from timelaps_utils import produce_xml_merge_job_files, produce_string, padding_of_file_id
 
 #where are we (can be configured through -d/--directory flag)
 JOBDIR=os.path.abspath(os.path.curdir)
-if JOBDIR[-1] != "/":
+if JOBDIR[-1] != "/": # this checks if jobdir ends with slash if not it adds a slash
    JOBDIR+="/"
 
 #data specific config file, expected to be inside JOBDIR
-configfile: "tomancak.json"
-   
-datasets = glob.glob('*00.h5')
-
-#TODO: this should go into a python module in this path
-fre = re.compile(r'(?P<xml_base>\w+)-(?P<file_id>\d+)-00.h5')
-xml_merge_in = []
-for ds in datasets:
-   bn = os.path.basename(ds)
-   bn_res = fre.search(bn)
-   xml_base,file_id = bn_res.group('xml_base'),bn_res.group('file_id')
-   xml_merge_in.append("{xbase}.job_{fid}.xml".format(xbase=xml_base, fid=int(file_id)))
-   
-#TODO: this should go into a python module in this path
-def produce_string(_fstring, *args, **kwargs):
-   contents = dict()
-   for item in args:
-      if type(item) == type(kwargs):
-         contents.update(item)
-         
-   contents.update(kwargs)
-   return _fstring.format(**contents)
+# configfile: "tomancak_test_cluster.json"
+configfile: "tomancak_test_cluster.yaml"
+
+
+padding_format = "{0:0"+str(padding_of_file_id(int(config["common"]["ntimepoints"])))+"d}"
+ds_format = "-"+padding_format+"-00.h5"
+
+# problematic needs padding of file_id
+datasets = [ str(config["common"]["hdf5_xml_filename"].strip('\"')+(ds_format.format(item))) for item in range(int(config["common"]["ntimepoints"])) ]
+
+xml_merge_in = produce_xml_merge_job_files(datasets)
 
 rule done:
-    input: [ ds+"_deconvolved" for ds in datasets ]
+    input: [ ds + "_output_hdf5" for ds in datasets ]
+    #input: [ ds + "_fusion" for ds in datasets ]
+    
+rule resave_prepared:
+    input: expand("{dataset}.{suffix}",dataset=[ config["common"]["hdf5_xml_filename"] ], suffix=["xml","h5"])
+
+# defining xml for czi dataset
+rule define_xml_czi:
+    input:glob.glob('*.czi'), config["define_xml_czi"]["first_czi"]
+    output: config["common"]["first_xml_filename"] + ".xml"
+    log: "define_xml_czi.log"
+    run: 
+        cmd_string = produce_string("""{fiji-prefix} {fiji-app} \
+        -Dimage_file_directory={jdir} \
+           -Dfirst_czi={first_czi} \
+           -Dangles={angles} \
+           -Dchannels={channels} \
+           -Dillumination={illumination} \
+           -Dpixel_distance_x={pixel_distance_x} \
+           -Dpixel_distance_y={pixel_distance_y} \
+           -Dpixel_distance_z={pixel_distance_z} \
+           -Dpixel_unit={pixel_unit} \
+           -Dfirst_xml_filename={first_xml_filename} \
+           -Drotation_around={rotation_around} \
+           -- --no-splash {path_bsh}""",
+                                       config["common"],
+                                       config["define_xml_czi"],
+                                       jdir=JOBDIR,
+                                       path_bsh=config["common"]["bsh_directory"] + config["define_xml_czi"]["bsh_file"])
+        cmd_string += " > {log} 2>&1"
+        shell(cmd_string)
+
+        
+        
+# defining xml for tif dataset
+rule define_xml_tif:
+    input: glob.glob(re.sub("{{.}}","*",config["define_xml_tif"]['image_file_pattern'])) #replaces all occurrences of {{a}} (a can be any character) by * to use the string for globbing
+    output: config["common"]["first_xml_filename"] + ".xml"
+    log: "define_xml_tif.log"
+    run:
+        cmd_string = produce_string(
+        	"""{fiji-prefix} {fiji-app} \
+        -Dimage_file_directory={jdir} \
+        -Dtimepoints={timepoints} \
+        -Dangles={angles} \
+        -Dchannels={channels} \
+        -Dillumination={illumination} \
+        -Dimage_file_pattern={image_file_pattern} \
+        -Dpixel_distance_x={pixel_distance_x} \
+        -Dpixel_distance_y={pixel_distance_y} \
+        -Dpixel_distance_z={pixel_distance_z} \
+        -Dpixel_unit={pixel_unit} \
+       	-Dxml_filename={first_xml_filename} \
+        -Dtype_of_dataset={type_of_dataset} \
+        -Dmultiple_timepoints={multiple_timepoints} \
+        -Dmultiple_channels={multiple_channels} \
+        -Dmultiple_illumination_directions={multiple_illumination_directions} \
+        -Dmultiple_angles={multiple_angles} \
+        -Dimglib_container={imglib_container} \
+	-- --no-splash {path_bsh}""",
+	   config["common"],
+	   config["define_xml_tif"],
+	   jdir=JOBDIR,
+	   path_bsh=config["common"]["bsh_directory"] + config["define_xml_tif"]["bsh_file"],
+           timepoints="0-"+str(int(config["common"]["ntimepoints"])-1)
+        )
+	
+	cmd_string +=" > {log} 2>&1"
+	shell(cmd_string)
+
+ruleorder: define_xml_czi > define_xml_tif 
 
+# create mother .xml/.h5
+rule hdf5_xml:
+    input: config["common"]["first_xml_filename"] + ".xml" 
+    output: expand("{dataset}.{suffix}",dataset=[ config["common"]["hdf5_xml_filename"].strip('\"')], suffix=["xml","h5"]),
+            [ item+"_xml" for item in datasets ]
+    log: "hdf5_xml.log"
+    run:
+        part_string = produce_string(
+        	"""{fiji-prefix} {fiji-app} \
+                -Dimage_file_directory={jdir} \
+                -Dfirst_xml_filename={first_xml_filename} \
+                -Dhdf5_xml_filename={hdf5_xml_filename} \
+                -Dresave_angle={resave_angle} \
+                -Dresave_channel={resave_channel} \
+                -Dresave_illumination={resave_illumination} \
+                -Dresave_timepoint={resave_timepoint} \
+                -Dsubsampling_factors={subsampling_factors} \
+                -Dhdf5_chunk_sizes={hdf5_chunk_sizes} \
+                -Dtimepoints_per_partition={timepoints_per_partition} \
+                -Dsetups_per_partition={setups_per_partition} \
+                -Drun_only_job_number=0 \
+                -- --no-splash {path_bsh}""", 
+           config["common"],
+           config["define_xml_czi"],
+           config["resave_hdf5"],
+           jdir=JOBDIR,
+           path_bsh=config["common"]["bsh_directory"] + config["resave_hdf5"]["bsh_file"])
+
+        part_string += " > {log} 2>&1 && touch {output}"
+        shell(part_string)
+       
+
+# resave  .czi/.tif dataset as hdf5	
+rule resave_hdf5:
+    input: rules.hdf5_xml.output # "{xml_base}-{file_id,\d+}-00.h5_xml"
+    output: "{xml_base}-{file_id,\d+}-00.h5", "{xml_base}-{file_id,\d+}-00.h5_hdf5"
+    log: "resave_hdf5-{file_id}.log"
+    run:
+        part_string = produce_string(
+        	"""{fiji-prefix} {fiji-app} \
+        	-Dimage_file_directory={jdir} \
+                -Dfirst_xml_filename={first_xml_filename} \
+                -Dhdf5_xml_filename={input_xml_base} \
+        -Dresave_angle={resave_angle} \
+        -Dresave_channel={resave_channel} \
+        -Dresave_illumination={resave_illumination} \
+        -Dresave_timepoint={resave_timepoint} \
+        -Dsubsampling_factors={subsampling_factors} \
+        -Dhdf5_chunk_sizes={hdf5_chunk_sizes} \
+        -Dtimepoints_per_partition={timepoints_per_partition} \
+        -Dsetups_per_partition={setups_per_partition} \
+        -Drun_only_job_number={job_number} \
+        -- --no-splash {path_bsh}""", # the & submits everyting at once
+           config["common"],
+           config["define_xml_czi"],
+           config["resave_hdf5"],
+           jdir=JOBDIR,
+           path_bsh=config["common"]["bsh_directory"] + config["resave_hdf5"]["bsh_file"],
+           input_xml_base="{wildcards.xml_base}",
+           job_number=int(wildcards.file_id)+1) 
+   	part_string += " > {log} 2>&1 && touch {output}"
+        shell(part_string) 
+       	       	
 rule registration:
-    input: "{xml_base}-{file_id}-00.h5"
-    output: "{xml_base}-{file_id,\d+}-00.h5_registered", #"{xml_base}.job_{file_id,\d+}.xml"
+    input:  "{xml_base}-{file_id}-00.h5" 
+    output: "{xml_base}.job_{file_id,\d+}.xml"#, "{xml_base}-{file_id,\d+}-00.h5_registered", 
     log: "{xml_base}-{file_id}-registration.log"
     run:
         cmd_string = produce_string(
            """{fiji-prefix} {fiji-app} \
--Dparallel_timepoints={file_id_w} \
--Dimage_file_directory={jdir} \
--Dxml_filename={input_xml} \
--Dprocess_timepoint={timepoint} \
--Dprocess_channel={channel} \
--Dprocess_illumination={illuminations} \
--Dprocess_angle={angle} \
--Dprocessing_channel={proc-ch} \
--Dlabel_interest_points={label_interest_points} \
--Dtype_of_registration={type_of_registration} \
--Dtype_of_detection={type_of_detection} \
--Dsubpixel_localization={subpixel_localization} \
--Dimglib_container={imglib_container} \
--Dradius_1={radius_1} \
--Dradius_2={radius_2} \
--Dthreshold={threshold} \
--Dinitial_sigma={initial_sigma} \
--Dthreshold_gaussian={threshold_gaussian} \
--Dregistration_algorithm={algorithm} \
--Dinterest_points_channel_0={interest_points_channel_0} \
--Dinterest_points_channel_1={interest_points_channel_1} \
--Dfix_tiles={fix_tiles} \
--Dmap_back_tiles={map_back_tiles} \
--Dtransformation_model={transformation_model} \
--Dmodel_to_regularize_with={model_to_regularize_with} \
--Dlambda={lambda} \
--Dallowed_error_for_ransac={allowed_error_for_ransac} \
--Ddetection_min_max={detection_min_max} \
--- --no-splash {bsh_file}""",
+        -Dparallel_timepoints={file_id_w} \
+        -Dimage_file_directory={jdir} \
+        -Dxml_filename={input_xml} \
+	-Dreg_process_timepoint={reg_process_timepoint} \
+	-Dreg_process_channel={reg_process_channel} \
+	-Dreg_process_illumination={reg_process_illumination} \
+	-Dreg_process_angle={reg_process_angle} \
+	-Dchannels={channels} \
+	-Dreg_processing_channel={reg_processing_channel} \
+        -Dlabel_interest_points={label_interest_points} \
+        -Dtype_of_registration={type_of_registration} \
+        -Dtype_of_detection={type_of_detection} \
+        -Dsubpixel_localization={subpixel_localization} \
+        -Dimglib_container={imglib_container} \
+	-Dreg_radius_1={reg_radius_1} \
+	-Dreg_radius_2={reg_radius_2} \
+        -Dreg_threshold={reg_threshold} \
+        -Dinitial_sigma={initial_sigma} \
+        -Dthreshold_gaussian={threshold_gaussian} \
+        -Dregistration_algorithm={algorithm} \
+        -Dreg_interest_points_channel={reg_interest_points_channel} \
+        -Dfix_tiles={fix_tiles} \
+        -Dmap_back_tiles={map_back_tiles} \
+        -Dtransformation_model={transformation_model} \
+        -Dmodel_to_regularize_with={model_to_regularize_with} \
+        -Dlambda={lambda} \
+        -Dallowed_error_for_ransac={allowed_error_for_ransac} \
+        -Ddetection_min_max={detection_min_max} \
+        -Dsignificance={significance} \
+        -- --no-splash {path_bsh}""",
            config["common"], 
            config["registration"],
-           file_id_w="{wildcards.file_id}",
+           file_id_w=wildcards.file_id,
+           path_bsh=config["common"]["bsh_directory"] + config["registration"]["bsh_file"],
            jdir=JOBDIR,
-           input_xml="{wildcards.xml_base}")
-        cmd_string += "> {log} 2>&1 && touch {output}"
+           input_xml=wildcards.xml_base)
+        cmd_string += " > {log} 2>&1 && touch {output}"
        
         shell(cmd_string)
         #shell("touch {output}")
 
 rule xml_merge:
-    input: [ item+"_registered" for item in datasets ] #xml_merge_in 
+    input: [ str(config["common"]["hdf5_xml_filename"].strip('\"')+".job_"+(padding_format.format(item))+".xml") for item in range(int(config["common"]["ntimepoints"])) ] #[ item+"_registered" for item in datasets ] 
     output: "{xml_base}_merge.xml"
     log: "{xml_base}_merge.log"
     run:
-        cmd_string = produce_string("{fiji-prefix} {fiji-app} -Dimage_file_directory={jdir} -Dmerged_xml={output} -- --no-splash {bsh_file} > {log} 2>&1",
+        cmd_string = produce_string(
+        	"""{fiji-prefix} {fiji-app} \
+        -Dimage_file_directory={jdir} \
+        -Dmerged_xml={output} \
+        -- --no-splash {path_bsh}""",
                                     config["common"],
                                     config["xml_merge"],
-                                    log="{log}",
+                                    path_bsh=config["common"]["bsh_directory"] + config["xml_merge"]["bsh_file"],
                                     jdir=JOBDIR,
                                     output="{output}")
+        cmd_string += " > {log} 2>&1 && touch {output}"
         shell(cmd_string)
 
-rule external_trafo:
+rule timelapse:
     input: rules.xml_merge.output
-    output: rules.xml_merge.output[0] + "_external_trafo"
-    log: "external_trafo.log"
+    output: rules.xml_merge.output[0] + "_timelapse"
+    log: "{xml_base}_timelapse.log"
     run:
-        cmd_string = produce_string("""{fiji-prefix} {fiji-app} \
--Dimage_file_directory={jdir} \
+        cmd_string = produce_string(
+        	"""{fiji-prefix} {fiji-app} \
+        -Dimage_file_directory={jdir} \
         -Dmerged_xml={input} \
--Dtransform_angle={angle} \
--Dtransform_channel={channel} \
--Dtransform_illumination={illumination} \
--Dtransform_timepoint={timepoint} \
--Dtransformation={transformation} \
--Dapply_transformation={apply_transformation} \
--Ddefine_mode_transform={define_mode_transform} \
--Dmatrix_transform={matrix_transform} \
--- --no-splash {bsh_file}""",
+        -Dtimelapse_process_timepoints={timelapse_process_timepoints} \
+        -Dreg_process_channel={reg_process_channel} \
+        -Dreg_process_illumination={reg_process_illumination} \
+        -Dreg_process_angle={reg_process_angle} \
+        -Dreference_timepoint={reference_timepoint} \
+        -Dchannels={channels} \
+        -Dtype_of_registration_timelapse={type_of_registration_timelapse} \
+        -Dregistration_algorithm={algorithm} \
+        -Dreg_interest_points_channel={reg_interest_points_channel} \
+        -Dtransformation_model={transformation_model} \
+        -Dmodel_to_regularize_with={model_to_regularize_with} \
+        -Dlambda={lambda} \
+        -Dallowed_error_for_ransac={allowed_error_for_ransac} \
+        -Dsignificance={significance} \
+        -- --no-splash {path_bsh}""",
+                                    config["common"],
+                                    config["registration"],
+                                    config["timelapse"],
+                                    input="{input}",
+                                    path_bsh=config["common"]["bsh_directory"] + config["timelapse"]["bsh_file"],
+                                    jdir=JOBDIR)
+        cmd_string += " > {log} 2>&1 && touch {output}"
+        shell(cmd_string)
+        
+rule fusion:
+    input: rules.timelapse.output, "{xml_base}-{file_id,\d+}-00.h5", merged_xml="{xml_base}_merge.xml"
+    output: "{xml_base}-{file_id,\d+}-00.h5_fusion"
+    log: "{xml_base}-{file_id,\d+}-00-fusion.log"
+    run:
+        cmd_string = produce_string(
+        	"""{fiji-prefix} {fiji-app} \
+        -Dimage_file_directory={jdir} \
+    	-Dparallel_timepoints={file_id_w} \
+    	-Dmerged_xml={merged_xml_file} \
+    	-Dprocess_timepoint={process_timepoint} \
+    	-Dprocess_channel={process_channel} \
+    	-Dprocess_illumination={process_illumination} \
+    	-Dprocess_angle={process_angle} \
+    	-Dxml_output={xml_output} \
+    	-Dfused_image={fused_image} \
+    	-Dminimal_x={minimal_x} \
+    	-Dminimal_y={minimal_y} \
+    	-Dminimal_z={minimal_z} \
+    	-Dmaximal_x={maximal_x} \
+    	-Dmaximal_y={maximal_y} \
+    	-Dmaximal_z={maximal_z} \
+    	-Ddownsample={downsample} \
+    	-Dpixel_type={pixel_type} \
+    	-Dimglib2_container_fusion={imglib2_container_fusion} \
+    	-Dprocess_views_in_paralell={process_views_in_paralell} \
+    	-Dinterpolation={interpolation} \
+    	-Dimglib2_data_container={imglib2_data_container} \
+    	-Dsubsampling_factors={subsampling_factors} \
+    	-Dhdf5_chunk_sizes={hdf5_chunk_sizes} \
+    	-Dtimepoints_per_partition={timepoints_per_partition} \
+    	-Dsetups_per_partition={setups_per_partition} \
+    		-- --no-splash {path_bsh}""",
+                                    config["common"],
+                                    config["fusion"],
+                                    config["resave_hdf5"],
+                                    path_bsh=config["common"]["bsh_directory"] + config["fusion"]["bsh_file"],
+                                    jdir=JOBDIR,
+                                    file_id_w="{wildcards.file_id}",
+                                    merged_xml_file="{input.merged_xml}"
+        )
+        cmd_string += " > {log} 2>&1 && touch {output}"
+        shell(cmd_string)
+
+rule external_transform:
+    input: rules.timelapse.output, merged_xml="{xml_base}_merge.xml"
+    output: rules.timelapse.output[0] + "_external_trafo"
+    log: "external_transform.log"
+    run:
+        cmd_string = produce_string(
+        	"""{fiji-prefix} {fiji-app} \
+        -Dimage_file_directory={jdir} \
+	-Dmerged_xml={merged_xml_file} \
+	-Dchannel_setting={channel_setting} \
+	-Dtransform_angle={transform_angle} \
+	-Dtransform_channel={transform_channel} \
+	-Dtransform_illumination={transform_illumination} \
+	-Dtransform_timepoint={transform_timepoint} \
+	-Dtransformation={transformation} \
+	-Dapply_transformation={apply_transformation} \
+	-Ddefine_mode_transform={define_mode_transform} \
+	-Dmatrix_transform={matrix_transform} \
+	-- --no-splash {path_bsh}""",
                                     config["common"], 
                                     config["external_transform"],
+                                    path_bsh=config["common"]["bsh_directory"] + config["external_transform"]["bsh_file"],
                                     jdir=JOBDIR,
-                                    input="{input}")
-        cmd_string += "> {log} 2>&1 && touch {output}"
+                                    merged_xml_file="{input.merged_xml}"
+        )
+        cmd_string += " > {log} 2>&1 && touch {output}"
         shell(cmd_string)
 
 rule deconvolution:
-    input: rules.external_trafo.output, "{xml_base}-{file_id,\d+}-00.h5", merged_xml="{xml_base}_merge.xml"
-    output: "{xml_base}-{file_id,\d+}-00.h5_deconvolved"
+    input: rules.timelapse.output, "{xml_base}-{file_id,\d+}-00.h5", merged_xml="{xml_base}_merge.xml" # rules.external_transform.output, "{xml_base}-{file_id,\d+}-00.h5", merged_xml="{xml_base}_merge.xml"
+    output: "{xml_base}-{file_id,\d+}-00.h5_deconvolution"
     log: "{xml_base}-{file_id,\d+}-00-deconvolution.log"
     run:
-        cmd_string = produce_string("""{fiji-prefix} {fiji-app} \
--Dimage_file_directory={jdir} \
--Ddeco_output_file_directory={jdir} \
+        cmd_string = produce_string(
+        	"""{fiji-prefix} {fiji-app} \
+        -Dimage_file_directory={jdir} \
+        -Ddeco_output_file_directory={jdir} \
         -Dmerged_xml={merged_xml_file} \
--Dparallel_timepoints={file_id_w} \
--Dprocess_timepoint={process_timepoint} \
--Dprocess_channel={process_channel} \
--Dprocess_illumination={process_illumination} \
--Dprocess_angle={process_angle} \
--Dminimal_x_deco={minimal_x} \
--Dminimal_y_deco={minimal_y} \
--Dminimal_z_deco={minimal_z} \
--Dmaximal_x_deco={maximal_x} \
--Dmaximal_y_deco={maximal_y} \
--Dmaximal_z_deco={maximal_z} \
--Dimglib2_container_deco={imglib2_container} \
--Dtype_of_iteration={type_of_iteration} \
--Dosem_acceleration={osem_acceleration} \
--DTikhonov_parameter={Tikhonov_parameter} \
--Dcompute={compute} \
--Dpsf_estimation={psf_estimation} \
--Ddirectory_cuda={directory_cuda} \
--Ddetections_to_extract_psf_for_channel_0={detections_to_extract_psf_for_channel_0} \
--Ddetections_to_extract_psf_for_channel_1={detections_to_extract_psf_for_channel_1} \
--Dpsf_size_x={psf_size_x} \
--Dpsf_size_y={psf_size_y} \
--Dpsf_size_z={psf_size_z} \
--Diterations={iterations} \
-        -- --no-splash {bsh_file}""",
+        -Dparallel_timepoints={file_id_w} \
+        -Dprocess_timepoint={process_timepoint} \
+        -Dprocess_channel={process_channel} \
+        -Dprocess_illumination={process_illumination} \
+        -Dprocess_angle={process_angle} \
+        -Dchannels={channels} \
+        -Dminimal_x_deco={minimal_x_deco} \
+        -Dminimal_y_deco={minimal_y_deco} \
+        -Dminimal_z_deco={minimal_z_deco} \
+        -Dmaximal_x_deco={maximal_x_deco} \
+        -Dmaximal_y_deco={maximal_y_deco} \
+        -Dmaximal_z_deco={maximal_z_deco} \
+        -Dimglib2_container_deco={imglib2_container} \
+        -Dtype_of_iteration={type_of_iteration} \
+        -Dosem_acceleration={osem_acceleration} \
+        -DTikhonov_parameter={Tikhonov_parameter} \
+        -Dcompute={compute} \
+        -Dpsf_estimation={psf_estimation} \
+        -Ddirectory_cuda={directory_cuda} \
+        -Ddetections_to_extract_psf_for_channel={detections_to_extract_psf_for_channel} \
+        -Dpsf_size_x={psf_size_x} \
+        -Dpsf_size_y={psf_size_y} \
+        -Dpsf_size_z={psf_size_z} \
+        -Diterations={iterations} \
+        -- --no-splash {path_bsh}""",
                                     config["common"], 
                                     config["deconvolution"],
                                     file_id_w="{wildcards.file_id}",
+                                    path_bsh=config["common"]["bsh_directory"] + config["deconvolution"]["bsh_file"],
                                     jdir=JOBDIR,
                                     merged_xml_file="{input.merged_xml}"
         )
-        cmd_string += "> {log} 2>&1 && touch {output}"
+        cmd_string += " > {log} 2>&1 && touch {output}"
         shell(cmd_string)
-  
+
+rule define_output:
+    input: [ item + "_" + config["common"]["fusion_switch"] for item in datasets ], glob.glob('TP*')
+    output: config["hdf5_output"]["output_xml"].strip('\"') + ".xml"
+    log: "define_output.log"
+    run:
+        cmd_string = produce_string(
+        	"""{fiji-prefix} {fiji-app} \
+        -Dimage_file_directory={jdir} \
+        -Dtimepoints={output_timepoints} \
+        -Dchannels={output_channels} \
+        -Dimage_file_pattern={output_image_file_pattern} \
+        -Dpixel_distance_x={output_pixel_distance_x} \
+        -Dpixel_distance_y={output_pixel_distance_y} \
+        -Dpixel_distance_z={output_pixel_distance_z} \
+        -Dpixel_unit={output_pixel_unit} \
+       	-Dxml_filename={output_xml} \
+        -Dtype_of_dataset={output_type_of_dataset} \
+        -Dmultiple_timepoints={output_multiple_timepoints} \
+        -Dmultiple_channels={output_multiple_channels} \
+        -Dmultiple_illumination_directions={output_illumination_directions} \
+        -Dmultiple_angles={output_multiple_angles} \
+        -Dimglib_container={output_imglib_container} \
+	-- --no-splash {path_bsh}""",
+	config["common"],
+	config["hdf5_output"],
+	jdir=JOBDIR,
+	path_bsh=config["common"]["bsh_directory"] + config["hdf5_output"]["bsh_file_define"])
+	
+	cmd_string +=" > {log} 2>&1"
+	shell(cmd_string)
+
+# create mother .xml/.h5
+rule hdf5_xml_output:
+    input: config["hdf5_output"]["output_xml"].strip('\"') + ".xml"
+    output: expand("{dataset}.{suffix}",dataset=[ config["common"]["hdf5_xml_filename"].strip('\"')], suffix=["xml","h5"]),
+    	    [ item+"_output" for item in datasets ] 
+    log: "output_hdf5_xml.log"
+    run:
+        part_string = produce_string(
+        	"""{fiji-prefix} {fiji-app} \
+                -Dimage_file_directory={jdir} \
+                -Dfirst_xml_filename={output_xml} \
+                -Dhdf5_xml_filename={output_hdf5_xml} \
+                -Dresave_angle={resave_angle} \
+                -Dresave_channel={resave_channel} \
+                -Dresave_illumination={resave_illumination} \
+                -Dresave_timepoint={resave_timepoint} \
+                -Dsubsampling_factors={subsampling_output} \
+                -Dhdf5_chunk_sizes={chunk_sizes_output} \
+                -Dtimepoints_per_partition={timepoints_per_partition} \
+                -Dsetups_per_partition={setups_per_partition} \
+                -Drun_only_job_number=0 \
+                -Doutput_data_type={output_data_type} \
+                -Dconvert_32bit={convert_32bit}\
+                -- --no-splash {path_bsh}""", 
+           config["common"],
+           config["hdf5_output"],
+           config["resave_hdf5"],
+           jdir=JOBDIR,
+           path_bsh=config["common"]["bsh_directory"] + config["hdf5_output"]["bsh_file_hdf5"])
+
+        part_string += " > {log} 2>&1 && touch {output}"
+        shell(part_string)
+
+rule resave_hdf5_output:
+    input: rules.hdf5_xml_output.output
+    output: "{xml_base}-{file_id,\d+}-00.h5_output_hdf5"
+    log: "resave_output-{file_id}.log"
+    run:
+        part_string = produce_string(
+        	"""{fiji-prefix} {fiji-app} \
+                -Dimage_file_directory={jdir} \
+                -Dfirst_xml_filename={output_xml} \
+                -Dhdf5_xml_filename={output_hdf5_xml} \
+        -Dresave_angle={resave_angle} \
+        -Dresave_channel={resave_channel} \
+        -Dresave_illumination={resave_illumination} \
+        -Dresave_timepoint={resave_timepoint} \
+        -Dsubsampling_factors={subsampling_output} \
+        -Dhdf5_chunk_sizes={chunk_sizes_output} \
+        -Dtimepoints_per_partition={timepoints_per_partition} \
+        -Dsetups_per_partition={setups_per_partition} \
+        -Drun_only_job_number={job_number} \
+        -Doutput_data_type={output_data_type} \
+        -Dconvert_32bit={convert_32bit}\
+        -- --no-splash {path_bsh}""", 
+           config["common"],
+           config["hdf5_output"],
+           config["resave_hdf5"],
+           jdir=JOBDIR,
+           path_bsh=config["common"]["bsh_directory"] + config["hdf5_output"]["bsh_file_hdf5"],
+           input_xml_base="{wildcards.xml_base}",
+           job_number=int(wildcards.file_id)+1) 
+   	part_string += " > {log} 2>&1 && touch {output}"
+        shell(part_string) 
+       	       
+
 rule distclean:
-    shell : "rm -rf *registered *tif *log *_deconvolved *.xml~* interestpoints "+str(" ".join(xml_merge_in))
+    params : glob.glob(config["common"]["hdf5_xml_filename"].strip('\"')+"*"), glob.glob(config["common"]["first_xml_filename"].strip('\"')+"*"), glob.glob("*registered"), glob.glob("*_fusion"), glob.glob("*_timelapse"), glob.glob("*log"), glob.glob("*_deconvolved"), glob.glob("*.xml~*"),"interestpoints", glob.glob("*empty"), expand("{dataset}.{suffix}",dataset=[ config["common"]["hdf5_xml_filename"].strip('\"')], suffix=["xml","h5"]), glob.glob("*_output_hdf5"), glob.glob("*_output")# xml_merge_in, 
+   
+    message : os.path.abspath(os.path.curdir) + ": rm -rf {params}"
+    shell : "rm -rf {params}"
diff --git a/spim_registration/timelapse/cluster.json b/spim_registration/timelapse/cluster.json
old mode 100644
new mode 100755
index 2807e94c521056fda295d81be4b2ee3a6954d42f..4b2be746447e0fbd6c2b2892b30e26c895b4b0dd
--- a/spim_registration/timelapse/cluster.json
+++ b/spim_registration/timelapse/cluster.json
@@ -9,8 +9,13 @@
     {
         "lsf_extra" : "-R \"span[hosts=1] rusage[mem=100000]\""
     },
+    
+    "timelapse" : 
+    {
+    	"lsf_extra" : "-n 6 -R \"span[hosts=1] rusage[mem=100000]\""
+    },
 
-    "external_trafo" :
+    "external_transfrom" :
     {
         "lsf_extra" : "-R \"span[hosts=1] rusage[mem=10000]\""
     },
@@ -19,5 +24,10 @@
     {
         "lsf_extra" : "-n 7 -R \"span[hosts=1] rusage[mem=50000]\"",
 	"lsf_q" : "gpu"
+    },
+    
+    "resave_hdf5_output" :
+    {
+	"lsf_extra" : "-n 7 -R \"span[hosts=1] rusage[mem=50000]\""
     }
 }
diff --git a/spim_registration/timelapse/deconvolution_CPU.bsh b/spim_registration/timelapse/deconvolution_CPU.bsh
deleted file mode 100644
index f21f94d72529c6304592d7b59a592270ecfc550a..0000000000000000000000000000000000000000
--- a/spim_registration/timelapse/deconvolution_CPU.bsh
+++ /dev/null
@@ -1,146 +0,0 @@
-// Load Fiji dependencies
-import ij.IJ;
-import ij.ImagePlus;
-import java.lang.Runtime;
-import java.io.File;
-import java.io.FilenameFilter;
- 
-runtime = Runtime.getRuntime();
-System.out.println(runtime.availableProcessors() + " cores available for multi-threading");
-
-System.out.println( "Start to load Parameters:" );
-
-// Select xml
-image_file_directory = System.getProperty( "image_file_directory" );
-merged_xml = System.getProperty( "merged_xml" );
-if ( ! merged_xml.endsWith(".xml") )
-    merged_xml = merged.xml + ".xml";
-     
-System.out.println( "-------------------------------------------------------" );
-System.out.println( "Load xml file: " );
-System.out.println( "selected_xml = " + image_file_directory + merged_xml);
-
-// Load general Parameters
-parallel_timepoints = Integer.parseInt(System.getProperty( "parallel_timepoints" ));
-process_timepoint = System.getProperty( "process_timepoint" );
-process_channel = System.getProperty( "process_channel" );
-process_illumination = System.getProperty( "process_illumination" );
-process_angle = System.getProperty( "process_angle" ); 
-
-System.out.println( "-------------------------------------------------------" );
-System.out.println( "General parameters: " );
-System.out.println( "timepoint_processed = " + parallel_timepoints );
-System.out.println( "process_timepoints = " + process_timepoint ); 
-System.out.println( "process_channel = " + process_channel );
-System.out.println( "process_illumination = " + process_illumination );
-System.out.println( "process_angle = " + process_angle );
-
-// Load bounding box
-minimal_x_deco = System.getProperty( "minimal_x_deco" );
-minimal_y_deco = System.getProperty( "minimal_y_deco" );
-minimal_z_deco = System.getProperty( "minimal_z_deco" );
-maximal_x_deco = System.getProperty( "maximal_x_deco" );
-maximal_y_deco = System.getProperty( "maximal_y_deco" );
-maximal_z_deco = System.getProperty( "maximal_z_deco" );
-
-System.out.println( "-------------------------------------------------------" );
-System.out.println( "Bounding box: " );
-System.out.println( "minimal_x_deco = " + minimal_x_deco );
-System.out.println( "minimal_y_deco = " + minimal_y_deco );
-System.out.println( "minimal_z_deco = " + minimal_z_deco );
-System.out.println( "maximal_x_deco = " + maximal_x_deco );
-System.out.println( "maximal_y_deco = " + maximal_y_deco );
-System.out.println( "maximal_z_deco = " + maximal_z_deco );
-
-// Load deconvolution Parameters
-imglib2_container_deco = System.getProperty( "imglib2_container_deco" );
-type_of_iteration = System.getProperty( "type_of_iteration" );
-osem_acceleration = System.getProperty( "osem_acceleration" );
-Tikhonov_parameter = System.getProperty( "Tikhonov_parameter" );
-//float Tikhonov_parameter = Float.parseFloat( System.getProperty( "Tikhonov_parameter" ) );
-compute = System.getProperty( "compute" );
-psf_estimation = System.getProperty( "psf_estimation" );
-iterations = System.getProperty( "iterations" );
-deco_output_file_directory = System.getProperty( "deco_output_file_directory" );
-detections_to_extract_psf_for_channel_0 = System.getProperty( "detections_to_extract_psf_for_channel_0" );
-detections_to_extract_psf_for_channel_1 = System.getProperty( " detections_to_extract_psf_for_channel_1" );
-System.out.println( "-------------------------------------------------------" );
-System.out.println( "Deconvolution settings: " );
-System.out.println( "imglib2_container = " + imglib2_container_deco );
-System.out.println( "type_of_iteration = "+ type_of_iteration );
-System.out.println( "osem_acceleration = " + osem_acceleration );
-System.out.println( "Tikhonov_parameter = " + Tikhonov_parameter );
-System.out.println( "compute = " + compute );
-System.out.println( "psf_estimation = " + psf_estimation );
-System.out.println( "number_of_iterations = " + iterations );
-System.out.println( "deco_output_file_directory = " + deco_output_file_directory );
-System.out.println( "detections_to_extract_psf_for_channel_0 = " + detections_to_extract_psf_for_channel_0 );
-System.out.println( "detections_to_extract_psf_for_channel_1 = " + detections_to_extract_psf_for_channel_1 );
-
-// Search for CUDA
-directory_cuda = System.getProperty( "directory_cuda" );
-
-System.out.println( "-------------------------------------------------------" );
-System.out.println( "Loading CUDA directory: " );
-System.out.println( "directory_cuda = " + directory_cuda );
-
-// PSF Parameters
-psf_size_x = System.getProperty( "psf_size_x" );
-psf_size_y = System.getProperty( "psf_size_y" );
-psf_size_z = System.getProperty( "psf_size_z" );
-
-System.out.println( "-------------------------------------------------------" );
-System.out.println( "PSF Parameters: " );
-System.out.println( "psf_size_x = " + psf_size_x );
-System.out.println( "psf_size_y = " + psf_size_y );
-System.out.println( "psf_size_z = " + psf_size_z );
-
-// Execute Fiji Plugin
-System.out.println( "=======================================================" );
-System.out.println( "Starting Deconvolution" );
-
-try {
-IJ.run("Fuse/Deconvolve Dataset", 
-	"select_xml=" + image_file_directory + merged_xml  + " " +
-	"process_angle=[All angles] " +
-	"process_channel=[All channels] " + 
-	"process_illumination=[All illuminations] " +
-	"process_timepoint=[" + process_timepoint + "] " +
-	"processing_timepoint=[Timepoint " + parallel_timepoints + "] " + 
-	"type_of_image_fusion=[Multi-view deconvolution] " +
-	"bounding_box=[Define manually] " +
-	"fused_image=[Save as TIFF stack] " +
-	"minimal_x=" + minimal_x_deco + " " +
-	"minimal_y=" + minimal_y_deco + " " +
-	"minimal_z=" + minimal_z_deco + " " +
-	"maximal_x=" + maximal_x_deco + " " +
-	"maximal_y=" + maximal_y_deco + " " +
-	"maximal_z=" + maximal_z_deco + " " +
-	"imglib2_container=" + imglib2_container_deco + " " +
-	"type_of_iteration=[" + type_of_iteration + "] " +
-	"osem_acceleration=[" + osem_acceleration + "] " +
-	"number_of_iterations=" + iterations + " " +
-//	"adjust_blending_parameters " +
-	"use_tikhonov_regularization " +
-	"tikhonov_parameter=" + Tikhonov_parameter + " " +
-	"compute=[" + compute + "] " +
-	"compute_on=[CPU (Java)] " +
-	"psf_estimation=[" + psf_estimation + "] " +
-	"psf_display=[Do not show PSFs] " +
-	"output_file_directory=" + deco_output_file_directory + " " +
-	"detections_to_extract_psf_for_channel_0=" + detections_to_extract_psf_for_channel_0 + " " +
-	"detections_to_extract_psf_for_channel_1=" + detections_to_extract_psf_for_channel_1 + " " + // Dual Channel
-	"psf_size_x=" + psf_size_x + " " +
-	"psf_size_y=" + psf_size_y + " " +
-	"psf_size_z=" + psf_size_z + "");
-}
-catch ( e ) { 
-
-    print( "[deconvolution-CPU] caught exception: "+e );
-    //important to fail the process if exception occurs
-    runtime.exit(1);
-    
-}
-
-/* shutdown */
-runtime.exit(0);
diff --git a/spim_registration/timelapse/deconvolution_GPU.bsh b/spim_registration/timelapse/deconvolution_GPU.bsh
old mode 100644
new mode 100755
index ac8066689dd5d458ef6c48f4e362639626d5ddb5..32154c2c9986c8156073d169f1fa53071506cc35
--- a/spim_registration/timelapse/deconvolution_GPU.bsh
+++ b/spim_registration/timelapse/deconvolution_GPU.bsh
@@ -1,6 +1,6 @@
 // Load Fiji dependencies
-import ij.IJ;
-import ij.ImagePlus;
+import ij.IJ; 		// calls imagej
+import ij.Prefs; 	// calls imagej settings
 import java.lang.Runtime;
 import java.io.File;
 import java.io.FilenameFilter;
@@ -8,25 +8,28 @@ import java.io.FilenameFilter;
 runtime = Runtime.getRuntime();
 System.out.println(runtime.availableProcessors() + " cores available for multi-threading");
 
-System.out.println( "Start to load Parameters:" );
+Prefs.setThreads(7); 	// defines the number of threads allowed 
+print("Threads: "+Prefs.getThreads()); // prints thread setting in output
 
+System.out.println( "Start to load Parameters:" );
 // Select xml
 image_file_directory = System.getProperty( "image_file_directory" );
 merged_xml = System.getProperty( "merged_xml" );
 if ( ! merged_xml.endsWith(".xml") )
     merged_xml = merged.xml + ".xml";
-    
+
 System.out.println( "-------------------------------------------------------" );
 System.out.println( "Load xml file: " );
-System.out.println( "selected_xml = " + image_file_directory + merged_xml);
+System.out.println( "selected_xml = " + image_file_directory + merged_xml + ".xml");
 
 // Load general Parameters
-parallel_timepoints = Integer.parseInt(System.getProperty( "parallel_timepoints" ));
+int parallel_timepoints = Integer.parseInt(System.getProperty( "parallel_timepoints" ));
 process_timepoint = System.getProperty( "process_timepoint" );
 process_channel = System.getProperty( "process_channel" );
 process_illumination = System.getProperty( "process_illumination" );
 process_angle = System.getProperty( "process_angle" ); 
 
+
 System.out.println( "-------------------------------------------------------" );
 System.out.println( "General parameters: " );
 System.out.println( "timepoint_processed = " + parallel_timepoints );
@@ -62,8 +65,7 @@ compute = System.getProperty( "compute" );
 psf_estimation = System.getProperty( "psf_estimation" );
 iterations = System.getProperty( "iterations" );
 deco_output_file_directory = System.getProperty( "deco_output_file_directory" );
-detections_to_extract_psf_for_channel_0 = System.getProperty( "detections_to_extract_psf_for_channel_0" );
-detections_to_extract_psf_for_channel_1 = System.getProperty( "detections_to_extract_psf_for_channel_1" );
+
 
 System.out.println( "-------------------------------------------------------" );
 System.out.println( "Deconvolution settings: " );
@@ -75,14 +77,11 @@ System.out.println( "compute = " + compute );
 System.out.println( "psf_estimation = " + psf_estimation );
 System.out.println( "number_of_iterations = " + iterations );
 System.out.println( "deco_output_file_directory = " + deco_output_file_directory );
-System.out.println( "detections_to_extract_psf_for_channel_0 = " + detections_to_extract_psf_for_channel_0 );
-System.out.println( "detections_to_extract_psf_for_channel_1 = " + detections_to_extract_psf_for_channel_1 );
 
 // Search for CUDA
-directory_cuda = System.getProperty( "directory_cuda" );
-
 System.out.println( "-------------------------------------------------------" );
 System.out.println( "Loading CUDA directory: " );
+directory_cuda = System.getProperty( "directory_cuda" );
 System.out.println( "directory_cuda = " + directory_cuda );
 
 // PSF Parameters
@@ -96,19 +95,48 @@ System.out.println( "psf_size_x = " + psf_size_x );
 System.out.println( "psf_size_y = " + psf_size_y );
 System.out.println( "psf_size_z = " + psf_size_z );
 
+
+// Channel settings
+System.out.println( "-------------------------------------------------------" );
+System.out.println( "Channel Settings: " );
+// Channel setting for Deconvolution
+// parses channels and takes from there the number of channels
+// parses detections_to_extract_psf_for_channel 
+channels = System.getProperty( "channels" );
+System.out.println( "Channels = " + channels ); 
+
+detections_to_extract_psf_for_channel = System.getProperty( "detections_to_extract_psf_for_channel" );
+System.out.println( "PSF: " + detections_to_extract_psf_for_channel );
+
+// Splits channels and detections_to_extract_psf_for_channel 
+String delims = "[,]";
+String[] channel_token = channels.split(delims);
+String[] psf_token = detections_to_extract_psf_for_channel.split(delims);
+		
+// Assembles channel_string 
+StringBuilder channel_string = new StringBuilder();
+
+for (int channel=0; channel < channel_token.length; channel++ )
+
+{	
+	String channel_part = "detections_to_extract_psf_for_channel_" + channel_token[channel] + "=" + psf_token[channel] + " ";
+	channel_string.append( channel_part );
+	channel_string.append(" ");
+}
+
+System.out.println( channel_string );
+
 // Execute Fiji Plugin
 System.out.println( "=======================================================" );
 System.out.println( "Starting Deconvolution" );
-
 try {
 IJ.run("Fuse/Deconvolve Dataset", 
-	"select_xml=" + image_file_directory + merged_xml + " " +
+	"select_xml=" + image_file_directory + merged_xml + " " + 
 	"process_angle=[All angles] " +
 	"process_channel=[All channels] " + 
 	"process_illumination=[All illuminations] " +
 	"process_timepoint=[" + process_timepoint + "] " +
 	"processing_timepoint=[Timepoint " + parallel_timepoints + "] " +
-//	"processing_timepoint=[Timepoint 0] " + 
 	"type_of_image_fusion=[Multi-view deconvolution] " +
 	"bounding_box=[Define manually] " +
 	"fused_image=[Save as TIFF stack] " +
@@ -130,13 +158,10 @@ IJ.run("Fuse/Deconvolve Dataset",
 	"psf_estimation=[" + psf_estimation + "] " +
 	"psf_display=[Do not show PSFs] " +
 	"output_file_directory=" + deco_output_file_directory + " " +
-//	"directory=[/sw/users/schmied/packages/Fiji.app.cuda_new/lib/] " +
-	"directory=[" + directory_cuda + "] " +
+	"cuda_directory=[" + directory_cuda + "] " +
 	"select_native_library_for_cudafourierconvolution=libFourierConvolutionCUDALib.so " + 
 	"gpu_1 " +
-//	"gpu_2 " + 
-	"detections_to_extract_psf_for_channel_0=" + detections_to_extract_psf_for_channel_0 + " " +
-//	"detections_to_extract_psf_for_channel_1=" + detections_to_extract_psf_for_channel_1 + " " + // Dual Channel
+	channel_string +
 	"psf_size_x=" + psf_size_x + " " +
 	"psf_size_y=" + psf_size_y + " " +
 	"psf_size_z=" + psf_size_z + "");
diff --git a/spim_registration/timelapse/define_czi.bsh b/spim_registration/timelapse/define_czi.bsh
new file mode 100755
index 0000000000000000000000000000000000000000..e3e1d30e788e27aa6888ce5a4a7e352162aae4d5
--- /dev/null
+++ b/spim_registration/timelapse/define_czi.bsh
@@ -0,0 +1,174 @@
+// Load Fiji dependencies
+import ij.IJ; 		// calls imagej
+import ij.Prefs; 	// calls imagej settings
+import ij.ImagePlus;
+import java.lang.Runtime;
+import java.io.File;
+import java.io.FilenameFilter;
+
+runtime = Runtime.getRuntime();
+System.out.println(runtime.availableProcessors() + " cores available for multi-threading");
+
+//Prefs.setThreads(2); 	// defines the number of threads allowed
+//print("Threads: "+Prefs.getThreads()); // prints thread setting in output
+
+System.out.println("Start loading parameters");
+
+// Directory, and first .czi
+System.out.println("---------------------------------------------------------");
+System.out.println("Directory:");
+image_file_directory = System.getProperty( "image_file_directory" );
+first_xml_filename = System.getProperty( "first_xml_filename" );
+first_czi = System.getProperty( "first_czi" );
+
+System.out.println( "xml_file_path = " + image_file_directory + first_xml_filename + ".xml" );
+System.out.println( "first_czi_path = " + image_file_directory + first_czi );
+
+// Dataset settings
+System.out.println("---------------------------------------------------------");
+System.out.println("Angle Settings:");
+
+// Angle settings
+// Parses angles and determines the number of angles
+// uses tokens of string angles to assemble the string for angle_string
+// via StringBuilder
+angles = System.getProperty( "angles" );
+System.out.println( "Angles = " + angles );
+
+// Parses string angles
+String delims = "[,]";
+String[] angle_token = angles.split(delims);
+
+// Builds string using the number of tokens and inserts the tokens in the string
+StringBuilder angle_string = new StringBuilder();
+String angle_part;
+
+	for ( int angle = 0; angle < angle_token.length; angle++) {
+		int num_angles = angle + 1;
+		angle_part = "angle_" + num_angles + "=" + angle_token[angle];
+		angle_string.append(angle_part);
+		angle_string.append(" ");
+			
+		}
+
+System.out.println( angle_string );
+
+System.out.println("---------------------------------------------------------");
+System.out.println("Channel Settings:");
+
+// Channel settings
+// This parses channels and determines the number of channels
+// then uses the tokens of channels to assemble the necessary string
+// for channel_string via StringBuilder
+channels = System.getProperty( "channels" );
+System.out.println( "Channel Names = " + channels );
+
+// Parses string channel_names
+String delims = "[,]";
+String[] channel_token = channels.split(delims);
+
+// Builds string using the number of tokens and inserts the tokens in the string
+StringBuilder channel_string = new StringBuilder();
+String channel_part;
+
+	for ( int channel = 0; channel < channel_token.length; channel++) {
+		int num_channel = channel + 1;
+		channel_part = "channel_" + num_channel + "=" + channel_token[channel];
+		channel_string.append(channel_part);
+		channel_string.append(" ");
+			
+		}
+			
+System.out.println( "Channel String = " + channel_string );
+
+System.out.println("---------------------------------------------------------");
+System.out.println("Illumination Settings:");
+
+// Illuminatin settings
+// This parses illumination and determines the number of illuminations
+// then uses the tokens of illuminations to assemble the string for 
+// illum_string via StringBuilder
+illumination = System.getProperty( "illumination" );
+System.out.println( "Illumination = " + illumination );
+
+// Parses string illumination
+String delims = "[,]";
+String[] illum_token = illumination.split(delims);
+
+// Builds string using the number of tokens and inserts the tokens in the string
+StringBuilder illum_string = new StringBuilder();
+String illum_part;
+
+	for ( int illum= 0; illum< illum_token.length; illum++) {
+		int num_illum = illum + 1;
+		illum_part = "_______illumination_" + num_illum + "=" + illum_token[illum];
+		illum_string.append(illum_part);
+		illum_string.append(" ");
+			
+		}
+
+System.out.println( illum_string );
+
+System.out.println("---------------------------------------------------------");
+System.out.println("Rotation setting:");
+
+rotation_around = System.getProperty( "rotation_around" );
+System.out.println( "rotation_around = " + rotation_around );
+
+// Calibaration
+System.out.println("=========================================================");
+System.out.println("Calibration:");
+float pixel_distance_x = Float.parseFloat( System.getProperty( "pixel_distance_x" ) );
+float pixel_distance_y = Float.parseFloat( System.getProperty( "pixel_distance_y" ) );
+float pixel_distance_z = Float.parseFloat( System.getProperty( "pixel_distance_z" ) );
+pixel_unit = System.getProperty( "pixel_unit" );
+
+System.out.println( "pixel_distance_x = " + pixel_distance_x );
+System.out.println( "pixel_distance_y = " + pixel_distance_y );
+System.out.println( "pixel_distance_z = " + pixel_distance_z );
+System.out.println( "pixel_unit = " + pixel_unit );
+
+// Executes Fiji plugin
+System.out.println("=========================================================");
+System.out.println("Start plugin:");
+System.out.println("Define Multi-View Dataset type_of_dataset=[Zeiss Lightsheet Z.1 Dataset (LOCI Bioformats)] " +
+	"xml_filename=" + first_xml_filename + ".xml " +
+	"browse=" + image_file_directory + first_czi + " " + 
+	"first_czi=" + image_file_directory + first_czi + " " + 
+	angle_string +
+	channel_string + 
+ 	illum_string +
+	"modify_calibration " + 
+	"modify_rotation_axis " +
+	"pixel_distance_x=" + pixel_distance_x + " " + 
+	"pixel_distance_y=" + pixel_distance_y + " " + 
+	"pixel_distance_z=" + pixel_distance_z + " " +
+	"pixel_unit=" + pixel_unit + " " +
+	"rotation_around=" + rotation_around + "");
+
+try {
+IJ.run("Define Multi-View Dataset", 
+	"type_of_dataset=[Zeiss Lightsheet Z.1 Dataset (LOCI Bioformats)] " +
+	"xml_filename=" + first_xml_filename + ".xml " +
+	"browse=" + image_file_directory + first_czi + " " + 
+	"first_czi=" + image_file_directory + first_czi + " " + 
+	angle_string +
+	channel_string + 
+	illum_string +
+	"modify_calibration " + 
+	"modify_rotation_axis " +
+	"pixel_distance_x=" + pixel_distance_x + " " + 
+	"pixel_distance_y=" + pixel_distance_y + " " + 
+	"pixel_distance_z=" + pixel_distance_z + " " +
+	"pixel_unit=" + pixel_unit + " " +
+	"rotation_around=" + rotation_around + "");
+}
+catch ( e ) { 
+
+    print( "[define_czi] caught exception: "+e );
+    //important to fail the process if exception occurs
+    runtime.exit(1);
+    
+}
+/* shutdown */
+runtime.exit(0);
diff --git a/spim_registration/timelapse/define_output.bsh b/spim_registration/timelapse/define_output.bsh
new file mode 100755
index 0000000000000000000000000000000000000000..e2469feb053fc3a11f2b2bf0169f2dbf699ffa15
--- /dev/null
+++ b/spim_registration/timelapse/define_output.bsh
@@ -0,0 +1,137 @@
+import ij.IJ; 		// calls imagej
+import ij.Prefs; 	// calls imagej settings
+import ij.ImagePlus;
+import java.lang.Runtime;
+import java.io.File;
+import java.io.FilenameFilter;
+
+runtime = Runtime.getRuntime();
+System.out.println(runtime.availableProcessors() + " cores available for multi-threading");
+
+Prefs.setThreads(1); 	// defines the number of threads allowed 
+print("Threads: "+Prefs.getThreads()); // prints thread setting in output
+
+System.out.println("Start loading parameters");
+// Directory
+System.out.println("=========================================================");
+System.out.println("Directory:");
+image_file_directory = System.getProperty( "image_file_directory" );
+xml_filename = System.getProperty( "xml_filename" );
+
+System.out.println( "image_file_directory = " + image_file_directory );
+System.out.println( "xml_filename = " + xml_filename );
+
+// Dataset settings
+System.out.println("=========================================================");
+System.out.println("Dataset:");
+timepoints = System.getProperty( "timepoints" );
+image_file_pattern = System.getProperty( "image_file_pattern" );
+type_of_dataset = System.getProperty( "type_of_dataset" );
+multiple_timepoints = System.getProperty( "multiple_timepoints" );
+multiple_illumination_directions = System.getProperty( "multiple_illumination_directions" );
+multiple_angles = System.getProperty( "multiple_angles" );
+imglib_container = System.getProperty( "imglib_container" );
+
+System.out.println( "timepoints = " + timepoints );
+System.out.println( "image_file_pattern = " + image_file_pattern );
+System.out.println( "type_of_dataset = " + type_of_dataset );
+System.out.println( "multiple_timepoints = " + multiple_timepoints );
+System.out.println( "multiple_illumination_directions = " + multiple_illumination_directions );
+System.out.println( "multiple_angles = " + multiple_angles );
+System.out.println( "imglib_container = " + imglib_container );
+
+// Calibaration
+System.out.println("=========================================================");
+System.out.println("Calibration:");
+float pixel_distance_x = Float.parseFloat( System.getProperty( "pixel_distance_x" ) );
+float pixel_distance_y = Float.parseFloat( System.getProperty( "pixel_distance_y" ) );
+float pixel_distance_z = Float.parseFloat( System.getProperty( "pixel_distance_z" ) );
+pixel_unit = System.getProperty( "pixel_unit" );
+
+System.out.println( "pixel_distance_x = " + pixel_distance_x );
+System.out.println( "pixel_distance_y = " + pixel_distance_y );
+System.out.println( "pixel_distance_z = " + pixel_distance_z );
+System.out.println( "pixel_unit = " + pixel_unit );
+
+// Channel switch
+System.out.println("=========================================================");
+System.out.println("Channel Switch:");
+multiple_channels = System.getProperty( "multiple_channels" );
+System.out.println( "multiple_channels = " + multiple_channels );
+
+channels = System.getProperty( "channels" ); 
+
+if ( multiple_channels.equalsIgnoreCase( "NO (one channel)" ) )
+
+{ 
+
+	channels="";
+
+}
+
+else if ( multiple_channels.equalsIgnoreCase( "YES (one file per channel)" ) )
+
+{
+
+	channels = "channels_=" + channels + " ";
+
+}
+
+else {
+
+	System.out.println( "Channel switch setting gibberish" );
+
+}
+
+System.out.println( "channels = " + channels );
+
+System.out.println("Define Multi-View Dataset , type_of_dataset=[" + type_of_dataset + "] " +
+	"xml_filename=[" + xml_filename + ".xml] " +
+	"multiple_timepoints=[" + multiple_timepoints + "] " +
+	"multiple_channels=[" + multiple_channels + "] " +
+	"_____multiple_illumination_directions=[" + multiple_illumination_directions + "] " + 
+	"multiple_angles=[" + multiple_angles + "] " +
+	"image_file_directory=" + image_file_directory + " " +
+	"image_file_pattern=" + image_file_pattern + " " + 
+	"timepoints_=" + timepoints + " " +
+	channels +
+	"calibration_type=[Same voxel-size for all views] calibration_definition=[User define voxel-size(s)]" + " " + 
+	"imglib2_data_container=[" + imglib_container + "] " + 
+	"pixel_distance_x=" + pixel_distance_x + " " + 
+	"pixel_distance_y=" + pixel_distance_y + " " + 
+	"pixel_distance_z=" + pixel_distance_z + " " +
+	"pixel_unit=" + pixel_unit + "");
+
+// Executes Fiji plugin
+System.out.println("=========================================================");
+System.out.println("Start plugin:");
+try {
+IJ.run("Define Multi-View Dataset", 
+	"type_of_dataset=[" + type_of_dataset + "] " +
+	"xml_filename=[" + xml_filename + ".xml] " +
+	"multiple_timepoints=[" + multiple_timepoints + "] " +
+	"multiple_channels=[" + multiple_channels + "] " +
+	"_____multiple_illumination_directions=[" + multiple_illumination_directions + "] " + 
+	"multiple_angles=[" + multiple_angles + "] " +
+	"image_file_directory=" + image_file_directory + " " +
+	"image_file_pattern=" + image_file_pattern + " " + 
+	"timepoints_=" + timepoints + " " +
+	channels +
+	"calibration_type=[Same voxel-size for all views] calibration_definition=[User define voxel-size(s)]" + " " + 
+	"imglib2_data_container=[" + imglib_container + "] " + 
+	"pixel_distance_x=" + pixel_distance_x + " " + 
+	"pixel_distance_y=" + pixel_distance_y + " " + 
+	"pixel_distance_z=" + pixel_distance_z + " " +
+	"pixel_unit=" + pixel_unit + "");
+}
+catch ( e ) { 
+
+    print( "[define_output] caught exception: "+e );
+    //important to fail the process if exception occurs
+    runtime.exit(1);
+    
+}
+/* shutdown */
+runtime.exit(0);
+
+
diff --git a/spim_registration/timelapse/define_tif_zip.bsh b/spim_registration/timelapse/define_tif_zip.bsh
new file mode 100755
index 0000000000000000000000000000000000000000..a5f401511eb4263335f9aa64b2ad8307d39ebee7
--- /dev/null
+++ b/spim_registration/timelapse/define_tif_zip.bsh
@@ -0,0 +1,179 @@
+import ij.IJ; 		// calls imagej
+import ij.Prefs; 	// calls imagej settings
+import ij.ImagePlus;
+import java.lang.Runtime;
+import java.io.File;
+import java.io.FilenameFilter;
+
+runtime = Runtime.getRuntime();
+System.out.println(runtime.availableProcessors() + " cores available for multi-threading");
+
+Prefs.setThreads(1); 	// defines the number of threads allowed 
+print("Threads: "+Prefs.getThreads()); // prints thread setting in output
+
+System.out.println("Start loading parameters");
+// Directory
+System.out.println("=========================================================");
+System.out.println("Directory:");
+image_file_directory = System.getProperty( "image_file_directory" );
+xml_filename = System.getProperty( "xml_filename" );
+
+System.out.println( "image_file_directory = " + image_file_directory );
+System.out.println( "xml_filename = " + xml_filename );
+
+// Dataset settings
+System.out.println("=========================================================");
+System.out.println("Dataset:");
+image_file_pattern = System.getProperty( "image_file_pattern" );
+type_of_dataset = System.getProperty( "type_of_dataset" );
+timepoints = System.getProperty( "timepoints" );
+angles = System.getProperty( "angles" );
+
+System.out.println( "image_file_pattern = " + image_file_pattern );
+System.out.println( "type_of_dataset = " + type_of_dataset );
+System.out.println( "timepoints = " + timepoints );
+System.out.println( "angles = " + angles );
+
+multiple_timepoints = System.getProperty( "multiple_timepoints" );
+multiple_channels = System.getProperty( "multiple_channels" );
+multiple_illumination_directions = System.getProperty( "multiple_illumination_directions" );
+multiple_angles = System.getProperty( "multiple_angles" );
+imglib_container = System.getProperty( "imglib_container" );
+
+System.out.println( "multiple_timepoints = " + multiple_timepoints );
+System.out.println( "multiple_channels = " + multiple_channels );
+System.out.println( "multiple_illumination_directions = " + multiple_illumination_directions );
+System.out.println( "multiple_angles = " + multiple_angles );
+System.out.println( "imglib_container = " + imglib_container );
+
+System.out.println("---------------------------------------------------------");
+System.out.println("Channel setting:");
+
+// Channel switch: parses channels and determines if Single or Multi Channel
+// assembles the appropriate string for the channel setting
+channels = System.getProperty( "channels" ); 
+
+String channel_string = null;
+		
+String delims = "[,]";
+String[] channel_token = channels.split(delims);
+		
+if (channels.equalsIgnoreCase(""))
+	{
+	System.out.println("Warning: There are no channels set");
+	}
+			
+else if ( channel_token.length == 1  )
+	{
+	channel_string="";
+	System.out.println("Single Channel");
+	}
+		
+	else if ( channel_token.length > 1)
+	{
+	channel_string = "channels_=" + channels + " ";
+	System.out.println("Multi Channel");
+	}
+		
+System.out.println( "Channels = " + channel_string );
+
+
+System.out.println("---------------------------------------------------------");
+System.out.println("Illumination setting:");
+// Illuminatin switch: parses illumination and determines if there is a single
+// or multiple illumination sides and then assembles the illum_string
+
+illumination = System.getProperty( "illumination" );
+
+String illum_string = null;
+		
+String delims = "[,]";
+String[] illum_token = illumination.split(delims);
+		
+if (illumination.equalsIgnoreCase(""))
+	{
+	System.out.println("Warning: There are no illuminations set");
+	}
+			
+	else if ( illum_token.length == 1  )
+	{
+	illum_string="";
+	System.out.println("One illumination side or fused illumination");
+	}
+		
+	else if ( illum_token.length > 1)
+	{
+	illum_string = "illumination_=" + illumination + " ";
+	System.out.println("Dual Illumination sides");
+	}
+		
+System.out.println( "Illuminations = " + illum_string );
+
+// Calibaration
+System.out.println("=========================================================");
+System.out.println("Calibration:");
+float pixel_distance_x = Float.parseFloat( System.getProperty( "pixel_distance_x" ) );
+float pixel_distance_y = Float.parseFloat( System.getProperty( "pixel_distance_y" ) );
+float pixel_distance_z = Float.parseFloat( System.getProperty( "pixel_distance_z" ) );
+pixel_unit = System.getProperty( "pixel_unit" );
+
+System.out.println( "pixel_distance_x = " + pixel_distance_x );
+System.out.println( "pixel_distance_y = " + pixel_distance_y );
+System.out.println( "pixel_distance_z = " + pixel_distance_z );
+System.out.println( "pixel_unit = " + pixel_unit );
+
+
+System.out.println("Define Multi-View Dataset , type_of_dataset=[" + type_of_dataset + "] " +
+	"xml_filename=[" + xml_filename + ".xml] " +
+	"multiple_timepoints=[" + multiple_timepoints + "] " +
+	"multiple_channels=[" + multiple_channels + "] " +
+	"_____multiple_illumination_directions=[" + multiple_illumination_directions + "] " + 
+	"multiple_angles=[" + multiple_angles + "] " +
+	"image_file_directory=" + image_file_directory + " " +
+	"image_file_pattern=" + image_file_pattern + " " + 
+	"timepoints_=" + timepoints + " " +
+	channel_string +
+	illum_string +
+	"acquisition_angles_=" + acquisition_angles + " " +  
+	"calibration_type=[Same voxel-size for all views] calibration_definition=[User define voxel-size(s)]" + " " + 
+	"imglib2_data_container=[" + imglib_container + "] " + 
+	"pixel_distance_x=" + pixel_distance_x + " " + 
+	"pixel_distance_y=" + pixel_distance_y + " " + 
+	"pixel_distance_z=" + pixel_distance_z + " " +
+	"pixel_unit=" + pixel_unit + "");
+
+// Executes Fiji plugin
+System.out.println("=========================================================");
+System.out.println("Start plugin:");
+try {
+IJ.run("Define Multi-View Dataset", 
+	"type_of_dataset=[" + type_of_dataset + "] " +
+	"xml_filename=[" + xml_filename + ".xml] " +
+	"multiple_timepoints=[" + multiple_timepoints + "] " +
+	"multiple_channels=[" + multiple_channels + "] " +
+	"_____multiple_illumination_directions=[" + multiple_illumination_directions + "] " + 
+	"multiple_angles=[" + multiple_angles + "] " +
+	"image_file_directory=" + image_file_directory + " " +
+	"image_file_pattern=" + image_file_pattern + " " + 
+	"timepoints_=" + timepoints + " " +
+	channel_string +
+	illum_string +
+	"acquisition_angles_=" + angles + " " +  
+	"calibration_type=[Same voxel-size for all views] calibration_definition=[User define voxel-size(s)]" + " " + 
+	"imglib2_data_container=[" + imglib_container + "] " + 
+	"pixel_distance_x=" + pixel_distance_x + " " + 
+	"pixel_distance_y=" + pixel_distance_y + " " + 
+	"pixel_distance_z=" + pixel_distance_z + " " +
+	"pixel_unit=" + pixel_unit + "");
+}
+catch ( e ) { 
+
+    print( "[define_tif_zip] caught exception: "+e );
+    //important to fail the process if exception occurs
+    runtime.exit(1);
+    
+}
+/* shutdown */
+runtime.exit(0);
+
+
diff --git a/spim_registration/timelapse/export.bsh b/spim_registration/timelapse/export.bsh
new file mode 100755
index 0000000000000000000000000000000000000000..1e928a8113f474ce8523b99124eb68f196db4a1b
--- /dev/null
+++ b/spim_registration/timelapse/export.bsh
@@ -0,0 +1,101 @@
+// Load Fiji dependencies
+import ij.IJ; 		// calls imagej
+import ij.Prefs; 	// calls imagej settings
+import ij.ImagePlus;
+import java.lang.Runtime;
+import java.io.File;
+import java.io.FilenameFilter;
+
+runtime = Runtime.getRuntime();
+System.out.println(runtime.availableProcessors() + " cores available for multi-threading");
+
+Prefs.setThreads(1); 	// defines the number of threads allowed 
+print("Threads: "+Prefs.getThreads()); // prints thread setting in output
+
+System.out.println("Start loading parameters");
+
+// Directory, and first .czi
+System.out.println("=========================================================");
+System.out.println("Directory:");
+image_file_directory = System.getProperty( "image_file_directory" );
+first_xml_filename = System.getProperty( "first_xml_filename" );
+hdf5_xml_filename = System.getProperty( "hdf5_xml_filename" );
+
+System.out.println( "dir=" + image_file_directory );
+System.out.println( "xml_filename=" + first_xml_filename );
+System.out.println( "hdf5_xml_filename=" + hdf5_xml_filename );
+
+// Dataset settings
+System.out.println("=========================================================");
+System.out.println("Dataset:");
+resave_angle = System.getProperty( "resave_angle" );
+resave_channel = System.getProperty( "resave_channel" );
+resave_illumination = System.getProperty( "resave_illumination" );
+resave_timepoint = System.getProperty( "resave_timepoint" );
+
+System.out.println( "resave_angle=" + resave_angle );
+System.out.println( "resave_channel=" + resave_channel );
+System.out.println( "resave_illumination=" + resave_illumination );
+System.out.println( "resave_timepoint=" + resave_timepoint);
+
+// Hdf5 settings
+System.out.println("=========================================================");
+System.out.println("Hdf5 settings:");
+subsampling_factors = System.getProperty( "subsampling_factors" );
+hdf5_chunk_sizes = System.getProperty( "hdf5_chunk_sizes" );
+timepoints_per_partition = System.getProperty( "timepoints_per_partition" );
+setups_per_partition = System.getProperty( "setups_per_partition" );
+run_only_job_number = System.getProperty( "run_only_job_number" );
+
+System.out.println( "subsampling_factors=" + subsampling_factors);
+System.out.println( "hdf5_chunk_sizes=" + hdf5_chunk_sizes );
+System.out.println( "timepoints_per_partition=" + timepoints_per_partition );
+System.out.println( "setups_per_partition=" + setups_per_partition );
+System.out.println( "run_only_job_number=" + run_only_job_number );
+
+// Activate cluster processing
+System.out.println("=========================================================");
+System.out.println("Cluster setting:");
+try {
+IJ.run("Toggle Cluster Processing", "display_cluster");
+}
+catch ( e ) { 
+
+    print( "[export::cluster setting] caught exception: "+e );
+    //important to fail the process if exception occurs
+    runtime.exit(1);
+    
+}
+
+// Executes Fiji plugin
+System.out.println("=========================================================");
+System.out.println("Start plugin:");
+
+try {
+IJ.run("As HDF5",
+	"select_xml=" + image_file_directory + first_xml_filename + ".xml " +
+	"resave_angle=[" + resave_angle + "] " +
+	"resave_channel=[" + resave_channel + "] " +
+	"resave_illumination=[" + resave_illumination + "] " +
+	"resave_timepoint=[" + resave_timepoint + "] " +
+	"manual_mipmap_setup " +
+	"subsampling_factors=[" + subsampling_factors + "] " +
+	"hdf5_chunk_sizes=[" + hdf5_chunk_sizes + "] " +
+	"split_hdf5 " +
+	"timepoints_per_partition=" + timepoints_per_partition + " " +
+	"setups_per_partition=" + setups_per_partition + " " +
+	"run_only_job_number=" + run_only_job_number + " " +
+	"use_deflate_compression " +
+	"export_path=" + image_file_directory + hdf5_xml_filename );
+}
+catch ( e ) { 
+
+    print( "[export::resaving] caught exception: "+e );
+    //important to fail the process if exception occurs
+    runtime.exit(1);
+    
+}
+
+/* shutdown */
+System.exit(0);
+
diff --git a/spim_registration/timelapse/export_output.bsh b/spim_registration/timelapse/export_output.bsh
new file mode 100755
index 0000000000000000000000000000000000000000..f05798a6b9e011e8d1b8737940a6a7cb08c5ca8e
--- /dev/null
+++ b/spim_registration/timelapse/export_output.bsh
@@ -0,0 +1,114 @@
+// Load Fiji dependencies
+import ij.IJ; 		// calls imagej
+import ij.Prefs; 	// calls imagej settings
+import ij.ImagePlus;
+import java.lang.Runtime;
+import java.io.File;
+import java.io.FilenameFilter;
+
+runtime = Runtime.getRuntime();
+System.out.println(runtime.availableProcessors() + " cores available for multi-threading");
+
+Prefs.setThreads(1); 	// defines the number of threads allowed 
+print("Threads: "+Prefs.getThreads()); // prints thread setting in output
+
+System.out.println("Start loading parameters");
+
+// Directory, and first .czi
+System.out.println("=========================================================");
+System.out.println("Directory:");
+image_file_directory = System.getProperty( "image_file_directory" );
+first_xml_filename = System.getProperty( "first_xml_filename" );
+hdf5_xml_filename = System.getProperty( "hdf5_xml_filename" );
+
+System.out.println( "dir=" + image_file_directory );
+System.out.println( "xml_filename=" + first_xml_filename );
+System.out.println( "hdf5_xml_filename=" + hdf5_xml_filename );
+
+// Dataset settings
+System.out.println("=========================================================");
+System.out.println("Dataset:");
+resave_angle = System.getProperty( "resave_angle" );
+resave_channel = System.getProperty( "resave_channel" );
+resave_illumination = System.getProperty( "resave_illumination" );
+resave_timepoint = System.getProperty( "resave_timepoint" );
+
+System.out.println( "resave_angle=" + resave_angle );
+System.out.println( "resave_channel=" + resave_channel );
+System.out.println( "resave_illumination=" + resave_illumination );
+System.out.println( "resave_timepoint=" + resave_timepoint);
+
+// Hdf5 settings
+System.out.println("=========================================================");
+System.out.println("Hdf5 settings:");
+subsampling_factors = System.getProperty( "subsampling_factors" );
+hdf5_chunk_sizes = System.getProperty( "hdf5_chunk_sizes" );
+timepoints_per_partition = System.getProperty( "timepoints_per_partition" );
+setups_per_partition = System.getProperty( "setups_per_partition" );
+run_only_job_number = System.getProperty( "run_only_job_number" );
+
+System.out.println( "subsampling_factors=" + subsampling_factors);
+System.out.println( "hdf5_chunk_sizes=" + hdf5_chunk_sizes );
+System.out.println( "timepoints_per_partition=" + timepoints_per_partition );
+System.out.println( "setups_per_partition=" + setups_per_partition );
+System.out.println( "run_only_job_number=" + run_only_job_number );
+
+// Add a switch for choosing between 16 or 32 bit
+output_data_type = System.getProperty( "output_data_type" );
+System.out.println( "Output Datatype = " + output_data_type );
+
+convert_32bit = System.getProperty( "convert_32bit" );
+
+if ( output_data_type.equalsIgnoreCase( "32Bit" ) )
+	{
+		data_string = "convert_32bit=" + convert_32bit;
+	}
+else if ( output_data_type.equalsIgnoreCase( "16Bit" ) )
+	{
+		data_string = "";
+	}
+
+System.out.println( "Data string = " + data_string );
+
+// Activate cluster processing
+System.out.println("=========================================================");
+System.out.println("Cluster setting:");
+try{
+IJ.run("Toggle Cluster Processing", "display_cluster");
+}
+catch ( e ) { 
+	print( "[export_output::cluster setting] caught exception: "+e );
+	//important to fail the process if exception occurs
+	runtime.exit(1);
+}
+	
+// Executes Fiji plugin
+System.out.println("=========================================================");
+System.out.println("Start plugin:");
+try{
+IJ.run("As HDF5",
+	"select_xml=" + image_file_directory + first_xml_filename + ".xml " +
+	"resave_angle=[" + resave_angle + "] " +
+	"resave_channel=[" + resave_channel + "] " +
+	"resave_illumination=[" + resave_illumination + "] " +
+	"resave_timepoint=[" + resave_timepoint + "] " +
+	"manual_mipmap_setup " +
+	"subsampling_factors=[" + subsampling_factors + "] " +
+	"hdf5_chunk_sizes=[" + hdf5_chunk_sizes + "] " +
+	"split_hdf5 " +
+	"timepoints_per_partition=" + timepoints_per_partition + " " +
+	"setups_per_partition=" + setups_per_partition + " " +
+	"run_only_job_number=" + run_only_job_number + " " +
+	"use_deflate_compression " +
+	"export_path=" + image_file_directory + hdf5_xml_filename + " " +
+	data_string + "");
+}
+catch ( e ) { 
+	print( "[export_output::resaving] caught exception: "+e );
+	//important to fail the process if exception occurs
+	runtime.exit(1);
+}
+	
+/* shutdown */
+System.exit(0);
+
diff --git a/spim_registration/timelapse/fusion.bsh b/spim_registration/timelapse/fusion.bsh
new file mode 100755
index 0000000000000000000000000000000000000000..79f9d54911da2bef0b7b3f57e4d64ce62dbdf6d7
--- /dev/null
+++ b/spim_registration/timelapse/fusion.bsh
@@ -0,0 +1,113 @@
+// Load Fiji dependencies
+import ij.IJ; 		// calls imagej
+import ij.Prefs; 	// calls imagej settings
+import ij.ImagePlus;
+import java.lang.Runtime;
+import java.io.File;
+import java.io.FilenameFilter;
+ 
+runtime = Runtime.getRuntime();
+System.out.println(runtime.availableProcessors() + " cores available for multi-threading");
+
+System.out.println( "Start to load Parameters:" );
+
+Prefs.setThreads(6); 	// defines the number of threads allowed 
+print("Threads: "+Prefs.getThreads()); // prints thread setting in output
+
+System.out.println( "Start to load Parameters:" );
+// select xml
+System.out.println( "-------------------------------------------------------" );
+System.out.println( "Load xml file: " );
+image_file_directory = System.getProperty( "image_file_directory" );
+
+merged_xml = System.getProperty( "merged_xml" );
+if ( ! merged_xml.endsWith(".xml") )
+    merged_xml = merged.xml + ".xml";
+
+System.out.println( "xml_path=" + image_file_directory + merged_xml + ".xml" );
+
+// Load general Parameters
+System.out.println( "-------------------------------------------------------" );
+System.out.println( "General parameters: " );
+int parallel_timepoints = Integer.parseInt( System.getProperty( "parallel_timepoints" ) );
+process_timepoint = System.getProperty( "process_timepoint" );
+process_channel = System.getProperty( "process_channel" );
+process_illumination = System.getProperty( "process_illumination" );
+process_angle = System.getProperty( "process_angle" ); 
+
+System.out.println( process_timepoint );
+System.out.println( "timepoint = " + parallel_timepoints);
+System.out.println( "illuminations = " + process_illumination );
+System.out.println( "angles = " + process_angle );
+
+//Load bounding box
+System.out.println( "-------------------------------------------------------" );
+System.out.println( "Load bounding box: " );
+minimal_x = System.getProperty( "minimal_x" );
+minimal_y = System.getProperty( "minimal_y" );
+minimal_z = System.getProperty( "minimal_z" );
+maximal_x = System.getProperty( "maximal_x" );
+maximal_y = System.getProperty( "maximal_y" );
+maximal_z = System.getProperty( "maximal_z" );
+downsample = System.getProperty( "downsample" );
+
+System.out.println( "minimal_x=" + minimal_x );
+System.out.println( "minimal_y=" + minimal_y );
+System.out.println( "minimal_z=" + minimal_z );
+System.out.println( "maximal_x=" + maximal_x );
+System.out.println( "maximal_y=" + maximal_y );
+System.out.println( "maximal_z=" + maximal_z );
+System.out.println( "downsample=" + downsample );
+
+// Load fusion parameters
+System.out.println( "-------------------------------------------------------" );
+System.out.println( "Fusion parameters: " );
+pixel_type = System.getProperty( "pixel_type" );
+imglib2_container_fusion = System.getProperty( "imglib2_container_fusion" );
+interpolation = System.getProperty( "interpolation" );
+imglib2_data_container = System.getProperty( "imglib2_data_container" );
+
+System.out.println( "pixel_type=" + pixel_type );
+System.out.println( "imglib2_container_fusion=" + imglib2_container_fusion );
+System.out.println( "interpolation=" + interpolation );
+System.out.println( "imglib2_data_container=" + imglib2_data_container );
+
+// Execute Fiji Plugin
+System.out.println( "=======================================================" );
+System.out.println( "Starting Fusion" );
+try{
+IJ.run("Fuse/Deconvolve Dataset", 
+	"select_xml=" + image_file_directory + merged_xml + " " +
+	"process_angle=[" + process_angle + "] " +	
+        "process_illumination=[" + process_illumination + "] " +
+        "process_timepoint=[" + process_timepoint + "] " +
+	"processing_timepoint=[Timepoint " + parallel_timepoints + "] " + 
+//	"xml_output=[Do not process on cluster] " +
+	"processing_timepoint=[Timepoint "+ parallel_timepoints +"] " +
+	"type_of_image_fusion=[Weighted-average fusion] " +
+	"bounding_box=[Define manually] " +
+	"fused_image=[Save as TIFF stack] " + // works but does not create xml file
+	"minimal_x=" + minimal_x + " " +
+	"minimal_y=" + minimal_y + " " +
+	"minimal_z=" + minimal_z + " " +
+	"maximal_x=" + maximal_x + " " +
+	"maximal_y=" + maximal_y + " " +
+	"maximal_z=" + maximal_z + " " +
+	"downsample=" + downsample + " " +
+	"pixel_type=[" + pixel_type + "] " + 
+	"imglib2_container=" + imglib2_container_fusion + " " + 
+	"process_views_in_paralell=All " +
+	"interpolation=[" + interpolation + "] " + 
+	//"blend " +
+	//"content-based " +
+	"output_file_directory=" + image_file_directory + " " +
+	"lossless " +
+	"imglib2_data_container=[" + imglib2_data_container + "]");
+}
+catch ( e ) {
+	    print( "[Contentbased multiview fusion] caught exception: "+e );
+	    //important to fail the process if exception occurs
+	    runtime.exit(1);
+}
+/* shutdown */
+runtime.exit(0);
diff --git a/spim_registration/timelapse/registration.bsh b/spim_registration/timelapse/registration.bsh
old mode 100644
new mode 100755
index f7c6b26bb1edb96765c2da801b2c3f42da75e7e6..d6872232b191687a082c3e8f591979528318672e
--- a/spim_registration/timelapse/registration.bsh
+++ b/spim_registration/timelapse/registration.bsh
@@ -1,12 +1,18 @@
-import ij.IJ;
+// Load Fiji dependencies
+import ij.IJ; 		// calls imagej
+import ij.Prefs; 	// calls imagej settings
 import ij.ImagePlus;
 import java.lang.Runtime;
 import java.io.File;
 import java.io.FilenameFilter;
- 
+import java.lang.Object;
+
 runtime = Runtime.getRuntime();
 System.out.println(runtime.availableProcessors() + " cores available for multi-threading");
 
+//Prefs.setThreads(1); 	// defines the number of threads allowed 
+//print("Threads: "+Prefs.getThreads()); // prints thread setting in output
+
 System.out.println("Start loading parameters");
 
 // select xml
@@ -18,24 +24,20 @@ xml_filename = System.getProperty( "xml_filename" );
 
 System.out.println( "selected_xml = " + xml_path + xml_filename + ".xml");
 
-
 // Load general Parameters
 System.out.println( "-------------------------------------------------------" );
 System.out.println( "General parameters: " );
 
-parallel_timepoints = Integer.parseInt(System.getProperty( "parallel_timepoints" ));
-process_timepoint = System.getProperty( "process_timepoint" );
-process_channel = System.getProperty( "process_channel" );
-process_illumination = System.getProperty( "process_illumination" );
-process_angle = System.getProperty( "process_angle" ); 
-processing_channel = System.getProperty( "processing_channel" ); 
+int parallel_timepoints = Integer.parseInt(System.getProperty( "parallel_timepoints" ));
+unique_id = System.getProperty( "parallel_timepoints" );
+reg_process_timepoint = System.getProperty( "reg_process_timepoint" );
+reg_process_illumination = System.getProperty( "reg_process_illumination" );
+reg_process_angle = System.getProperty( "reg_process_angle" ); 
 
 System.out.println( "parallel_timepoints = " + parallel_timepoints );
-System.out.println( "process_timepoints = " + process_timepoint ); 
-System.out.println( "process_channel = " + process_channel );
-System.out.println( "process_illumination = " + process_illumination );
-System.out.println( "process_angle = " + process_angle );
-System.out.println( "processing_channel = " + processing_channel );
+System.out.println( "process_timepoints = " + reg_process_timepoint ); 
+System.out.println( "process_illumination = " + reg_process_illumination );
+System.out.println( "process_angle = " + reg_process_angle );
 
 // Interest point detection parameters
 System.out.println( "-------------------------------------------------------" );
@@ -53,53 +55,215 @@ System.out.println( "type_of_detection = " + type_of_detection );
 System.out.println( "subpixel_localization = " + subpixel_localization );
 System.out.println( "imglib_container = " + imglib_container );
 
-// Parameters for difference of mean !!Comment out for Difference of Gaussian!!
-System.out.println( "-------------------------------------------------------" );
-System.out.println( "Difference of Mean detection: " );
-
-int radius_1 = Integer.parseInt( System.getProperty( "radius_1" ) );
-int radius_2 = Integer.parseInt( System.getProperty( "radius_2" ) );
-float threshold = Float.parseFloat( System.getProperty( "threshold" ) );
-
-System.out.println( "radius_1 = " + radius_1 );
-System.out.println( "radius_2 = " + radius_2 );
-System.out.println( "threshold = " + threshold );
-
-//Parameters for difference of gaussian !!Comment out for Differnence of Mean!!
-//System.out.println( "-------------------------------------------------------" );
-//System.out.println( "Difference of Gaussian detection: " );
-//float initial_sigma = Float.parseFloat( System.getProperty( "initial_sigma" ) );
-//float threshold_gaussian = Float.parseFloat( System.getProperty( "threshold_gaussian" ) );
-//System.out.println( "initial_sigma = " + initial_sigma );
-//System.out.println( "threshold_gaussian = " + threshold_gaussian );
-
 // Registration parameters
 System.out.println( "-------------------------------------------------------" );
 System.out.println( "Parameters for Registration: " );
 
 registration_algorithm = System.getProperty( "registration_algorithm" );
-interest_points_channel_0 = System.getProperty( "interest_points_channel_0" );
-interest_points_channel_1 = System.getProperty( "interest_points_channel_1" );
+
 fix_tiles = System.getProperty( "fix_tiles" );
 map_back_tiles = System.getProperty( "map_back_tiles" );
 transformation_model = System.getProperty( "transformation_model" );
 model_to_regularize_with = System.getProperty( "model_to_regularize_with" );
 float lambda = Float.parseFloat( System.getProperty( "lambda" ) );
 int allowed_error_for_ransac = Integer.parseInt( System.getProperty( "allowed_error_for_ransac" ) );
-detection_min_max = System.getProperty( "detection_min_max" );
+significance = System.getProperty( "significance" );
 
 System.out.println( "registration_algorithm = " + registration_algorithm );
-System.out.println( "interest_points_channel_0 = " + interest_points_channel_0 );
-System.out.println( "interest_points_channel_1 = " + interest_points_channel_1 );
 System.out.println( "fix_tiles = " + fix_tiles );
 System.out.println( "map_back_tiles = " + map_back_tiles );
 System.out.println( "transformation = " + transformation_model);
 System.out.println( "model_to_regularize_with = " + model_to_regularize_with );
 System.out.println( "lambda = " + lambda );
 System.out.println( "allowed_error_for_ransac = " + allowed_error_for_ransac );
-System.out.println( "detection_min_max = " + detection_min_max );
+System.out.println( "significance = " + significance );
+
+
+// detection_min_max = System.getProperty( "detection_min_max" );
+// System.out.println( "detection_min_max = " + detection_min_max );
+System.out.println( "-------------------------------------------------------" );
+System.out.println( "Channel setting for Detection: " );
+
+// Channel setting for Difference-of-Mean detection
+// parses channels and takes from there the number of channels
+// takes from reg_process_channel if it is Single Channel, Dual Channel or Dual Channel
+// were one Channel contains the beads
+// from this it decides which string to assemble
+reg_process_channel = System.getProperty( "reg_process_channel" );
+System.out.println( "process_channel = " + reg_process_channel );
+
+reg_processing_channel = System.getProperty( "reg_processing_channel" ); 
+System.out.println( "processing_channel = channel " + reg_processing_channel ); 
+
+channels = System.getProperty( "channels" );
+System.out.println( "Channels = " + channels );
+
+reg_radius_1 = System.getProperty( "reg_radius_1" );
+System.out.println( "reg_radius_1 = " + reg_radius_1 );
+	
+reg_radius_2 = System.getProperty( "reg_radius_2" );
+System.out.println( "reg_radius_2 = " + reg_radius_2 );
+
+reg_threshold = System.getProperty( "reg_threshold" );
+System.out.println( "reg_threshold = " + reg_threshold);	
+	
+// Splits up channels, reg_radius_1, reg_radius_2 and reg_threshold
+String delims = "[,]";
+String[] channel_token = channels.split(delims);
+String[] radius_1_token = reg_radius_1.split(delims);
+String[] radius_2_token = reg_radius_2.split(delims);
+String[] threshold_token = reg_threshold.split(delims);
+
+String channel_string = "";
+String processing_channel_string = "";
+StringBuilder channel_string_multi = new StringBuilder();
+			
+// If there are no channels set returns an error
+if (channels.equalsIgnoreCase(""))
+{
+	System.out.println("Warning: There are no channels set");
+}
+		
+// Returns an Error if there is one channel in channels but multiple settings in radius and or threshold	
+else if ( channel_token.length == 1 && (radius_1_token.length > 1 || radius_2_token.length > 1 || threshold_token.length > 1 ) )
+{
+	System.out.println( "Error: Only one channel detected but multiple channel settings for radius or threshold" );
+}
+				
+// Assembles String for Singel Channel 
+else if (reg_process_channel.equalsIgnoreCase( "All channels" ) && channel_token.length == 1 ) 
+{
+	processing_channel_string = "";
+	channel_string_multi.append("");	
+	channel_string = "interest_point_specification=[Advanced ...] " +
+	"radius_1=" + reg_radius_1 + " " +
+	"radius_2=" + reg_radius_2 + " " +
+	"threshold=" + reg_threshold + " " +
+	"find_maxima";
+}	
+		
+// Dual Channels both Channels contain beads
+else if (reg_process_channel.equalsIgnoreCase( "All channels" ) && channel_token.length > 1 )
+{
+	// Assembles String using StringBuilder for 2 Channels		
+	for (int channel=0; channel < channel_token.length; channel++ )
+	{
+		String channel_part = "interest_point_specification_(channel_" + channel_token[channel] + ")=[Advanced ...] " +
+		"radius_1_" + channel_token[channel] +  "=" + radius_1_token[channel] + " " +
+		"radius_2_" + channel_token[channel] +  "=" + radius_2_token[channel] + " " +
+		"threshold_" + channel_token[channel] +  "=" + threshold_token[channel] + " " +
+		"find_maxima_" + channel_token[channel];
+		channel_string_multi.append(channel_part);
+		channel_string_multi.append(" ");	
+	}
+
+}
+		
+// Returns an Error if set to Dual Channel one Channel contains beads but there is only one channel in channels	
+else if ( reg_process_channel.equalsIgnoreCase( "Single channel (Select from List)" ) && channel_token.length == 1 )
+{
+	System.out.println( "Error: reg_process_channel or channels set incorrectly" );
+}
+		
+// Returns and Error if set to Dual Channel processing one channel contains the beads but there are multiple settings in radius and or threshold
+else if ( reg_process_channel.equalsIgnoreCase( "Single channel (Select from List)" ) && (radius_1_token.length > 1 || radius_2_token.length > 1 || threshold_token.length > 1 ) )
+{
+	System.out.println( "Error: You said you wanted to process only one channel but there are multiple settings for radius or threshold" );
+}	
+		
+// Assembles String for Dual Channel but only one Channel contains beads
+else if (reg_process_channel.equalsIgnoreCase( "Single channel (Select from List)" ) && channel_token.length > 1)			
+{	
+	channel_string_multi.append("");
+	processing_channel_string = "processing_channel=[channel " +  reg_processing_channel + "] ";
+	channel_string = "interest_point_specification=[Advanced ...] " +
+	"radius_1=" + reg_radius_1 + " " +
+	"radius_2=" + reg_radius_2 + " " +
+	"threshold=" + reg_threshold + " " +
+	"find_maxima";
+}
+
+// Returns and Error if no conditions above are met
+else
+{
+	System.out.println( "Error: Incorrect settings" );
+}
+				
+System.out.println( "Processing Channel = " + processing_channel_string );
+System.out.println( "Channel String: " + channel_string );
+System.out.println( reg_process_channel );
+System.out.println( "Multi channel String: " + channel_string_multi );
+
+// Channel Setting Registration
+System.out.println( "-------------------------------------------------------" );
+System.out.println( "Channel Setting for Registration: " );
+// parses channels and takes from there the number of channels
+// takes from reg_process_channel if it is Single Channel, Dual Channel or Dual Channel
+// were one Channel contains the beads
+// from this it decides which string to assemble
+
+reg_interest_points_channel = System.getProperty( "reg_interest_points_channel" );
+System.out.println( "reg_interest_points_channel = " + reg_interest_points_channel );
+
+// Splits up channels, reg_interest_points_channel
+// String delims = "[,]";
+// String[] channel_token = channels.split(delims);
+// Splits up channels, reg_interest_points_channel
+String[] interest_token = reg_interest_points_channel.split(delims);
+String reg_single_channel_string ="";
+StringBuilder reg_multi_channel_string = new StringBuilder();
+				
+// If there are no channels set returns an error
+if (channels.equalsIgnoreCase(""))
+{
+	System.out.println("Warning: There are no channels set");
+}
+				
+// Assembles string for Single Channel registration
+else if (reg_process_channel.equalsIgnoreCase( "All channels" ) && channel_token.length == 1 && interest_token.length == 1 )	
+{	
+	reg_multi_channel_string.append( "" );
+	reg_single_channel_string = "interest_points_channel_" + channels + "=" + reg_interest_points_channel + " ";
+}
+			
+// Returns error if Multi Channels are selected but not enough settings in channels or 	reg_interest_points_channel
+else if (reg_process_channel.equalsIgnoreCase( "All channels" ) &&  ( channel_token.length < 1 || interest_token.length < 1) ) 
+{
+	System.out.println( "Error: Multi Channel selected but only one setting in channels or reg_interest_points_channel" );
+}
+			
+// Assembles string for Multi Channel registration
+else if (reg_process_channel.equalsIgnoreCase( "All channels" ) && channel_token.length > 1 ) 
+{
+	for (int channel=0; channel < channel_token.length; channel++ )
+	{	
+		String channel_part = "interest_points_channel_" + channel_token[channel] + "=" + interest_token[channel] + " ";
+		reg_multi_channel_string.append( channel_part );
+		reg_multi_channel_string.append(" ");
+	}
+}
+
+// Returns error of Multi Channels one Channel contains the beads is selected but not enough settings in channels or reg_interest_points_channel
+else if (reg_process_channel.equalsIgnoreCase( "Single channel (Select from List)" ) && ( channel_token.length < 1 || interest_token.length < 1 ))
+{
+	System.out.println( "Error: Multi Channel one Channel contains beads selected but only one setting in channls or reg_interest_points_channel" );
+}
+				
+// Assembles string for Multi Channel Processing one Channel Contains the beads
+else if (reg_process_channel.equalsIgnoreCase( "Single channel (Select from List)" ) && channel_token.length > 1 && interest_token.length > 1)	
+{
+	for (int channel=0; channel < channel_token.length; channel++ )
+	{	
+		String channel_part = "interest_points_channel_" + channel_token[channel] + "=" + interest_token[channel] + " ";
+		reg_multi_channel_string.append( channel_part );
+		reg_multi_channel_string.append(" ");		
+	}
+}
+
+		System.out.println( "reg_single_channel_string = " + reg_single_channel_string );
+		System.out.println( "reg_multi_channel_string = " + reg_multi_channel_string );
 
-//activate cluster processing
+// activate cluster processing
 System.out.println( "=======================================================" );
 try {
 IJ.run("Toggle Cluster Processing", "display_cluster");
@@ -111,73 +275,107 @@ catch ( e ) {
     runtime.exit(1);
     
 }
-System.out.println( "Activated Cluster Processing" );
 
+System.out.println( "Activated Cluster Processing" );
 
-//interest point detection
+// interest point detection
 System.out.println( "=======================================================" );
 System.out.println( "Starting Detection of Interest Points" );
+
+System.out.println("Detect Interest Points for Registration , select_xml=" + xml_path + xml_filename + ".xml " +  
+	"unique_id=" + unique_id + " " +
+	"process_angle=[" + reg_process_angle + "] " + 
+	"process_channel=[" + reg_process_channel + "] " +
+	"process_illumination=[" + reg_process_illumination + "] " + 
+	"process_timepoint=[" + reg_process_timepoint + "] " +
+	processing_channel_string +
+	"xml_output=[Save every XML with user-provided unique id]" + " " + 
+	"processing_timepoint=[Timepoint " + parallel_timepoints + "] " + 
+	"type_of_interest_point_detection=[" + type_of_detection + "] " + 
+	"label_interest_points=" + label_interest_points + " " + 
+	"subpixel_localization=[" + subpixel_localization + "] " + 
+	channel_string + "" +
+	channel_string_multi + "" +
+	"");
+
 try {
 IJ.run("Detect Interest Points for Registration", 
 	"select_xml=" + xml_path + xml_filename + ".xml " +  
-	"unique_id=" + parallel_timepoints + " " +
-	"process_angle=[" + process_angle + "] " + 
-	"process_channel=[" + process_channel + "] " +
-	"process_illumination=[" + process_illumination + "] " + 
-	"process_timepoint=[" + process_timepoint + "] " +
-	"processing_channel=[" +  processing_channel + "] " + // Dual Channel: 1 Channel contains the beads
+	"unique_id=" + unique_id + " " +
+	"process_angle=[" + reg_process_angle + "] " + 
+	"process_channel=[" + reg_process_channel + "] " +
+	"process_illumination=[" + reg_process_illumination + "] " + 
+	"process_timepoint=[" + reg_process_timepoint + "] " +
+	processing_channel_string +
 	"xml_output=[Save every XML with user-provided unique id]" + " " + 
 	"processing_timepoint=[Timepoint " + parallel_timepoints + "] " + 
 	"type_of_interest_point_detection=[" + type_of_detection + "] " + 
 	"label_interest_points=" + label_interest_points + " " + 
 	"subpixel_localization=[" + subpixel_localization + "] " + 
-	"interest_point_specification_(channel_0)=[Advanced ...] " +
-//	"interest_point_specification_(channel_1)=[Advanced ...] " + // Dual Channel
-	"radius_1=" + radius_1 + " " + 
-	"radius_2=" + radius_2 + " " + 
-	"threshold=" + threshold + " " +
-	"find_maxima");
+	channel_string + "" +
+	channel_string_multi + "" +
+	"");
 }
 catch ( e ) { 
 
-    print( "[registration::interest_points] caught exception: "+e );
+    print( "[registration::detection of interest_points] caught exception: "+e );
     //important to fail the process if exception occurs
     runtime.exit(1);
     
 }
-//registration based on interest point detection
+
+// registration based on interest point detection
 System.out.println( "=======================================================" );
 System.out.println( "Starting Registration" );
 
+System.out.println("Register Dataset based on Interest Points , select_xml=" + xml_path + xml_filename + ".job_" + unique_id + ".xml " +
+        "process_angle=[" + reg_process_angle + "] " +
+        "process_channel=[" + reg_process_channel + "] " +
+        "process_illumination=[" + reg_process_illumination + "] " +
+        "process_timepoint=[" + reg_process_timepoint + "] " +
+	"xml_output=[Do not process on cluster] " + 
+	"processing_timepoint=[Timepoint " + parallel_timepoints + "] " +
+        "registration_algorithm=[" + registration_algorithm + "] " +
+        "type_of_registration=[" + type_of_registration + "] " +
+        reg_single_channel_string +
+        reg_multi_channel_string +   
+        "fix_tiles=[" + fix_tiles + "] " +
+        "map_back_tiles=[" + map_back_tiles + "] " +
+        "transformation=" + transformation_model + " " +
+        "regularize_model " +
+        "model_to_regularize_with=" + model_to_regularize_with + " " +
+        "lamba=" + lambda + " " +
+        "allowed_error_for_ransac=" + allowed_error_for_ransac + " " +
+        "significance=" + significance + "");
+
 try {
-    IJ.run("Register Dataset based on Interest Points",
-	   "select_xml=" + xml_path + xml_filename + ".job_" + parallel_timepoints + ".xml " +
-	   "process_angle=[" + process_angle + "] " +
-	   "process_channel=[" + process_channel + "] " +
-	   "process_illumination=[" + process_illumination + "] " +
-	   "process_timepoint=[" + process_timepoint + "] " +
-	   "xml_output=[Do not process on cluster] " + 
-	   "processing_timepoint=[Timepoint " + parallel_timepoints + "] " +
-	   "registration_algorithm=[" + registration_algorithm + "] " +
-	   "type_of_registration=[" + type_of_registration + "] " +
-	   "interest_points_channel_0=" + interest_points_channel_0 + " " +
-	   // check? "interest_points_channel_0=[[DO NOT register this channel]] " +
-	   //      "interest_points_channel_1=" + interest_points_channel_1 + " " + // Dual Channel
-	   "fix_tiles=[" + fix_tiles + "] " +
-	   "map_back_tiles=[" + map_back_tiles + "] " +
-	   "transformation=" + transformation_model + " " +
-	   "regularize_model " +
-	   "model_to_regularize_with=" + model_to_regularize_with + " " +
-	   "lamba=" + lambda + " " +
-	   "allowed_error_for_ransac=" + allowed_error_for_ransac);
+IJ.run("Register Dataset based on Interest Points",
+	"select_xml=" + xml_path + xml_filename + ".job_" + unique_id + ".xml " +
+        "process_angle=[" + reg_process_angle + "] " +
+        "process_channel=[" + reg_process_channel + "] " +
+        "process_illumination=[" + reg_process_illumination + "] " +
+        "process_timepoint=[" + reg_process_timepoint + "] " +
+	"xml_output=[Do not process on cluster] " + 
+	"processing_timepoint=[Timepoint " + parallel_timepoints + "] " +
+        "registration_algorithm=[" + registration_algorithm + "] " +
+        "type_of_registration=[" + type_of_registration + "] " +
+        reg_single_channel_string +
+        reg_multi_channel_string +   
+        "fix_tiles=[" + fix_tiles + "] " +
+        "map_back_tiles=[" + map_back_tiles + "] " +
+        "transformation=" + transformation_model + " " +
+        "regularize_model " +
+        "model_to_regularize_with=" + model_to_regularize_with + " " +
+        "lamba=" + lambda + " " +
+        "allowed_error_for_ransac=" + allowed_error_for_ransac + " " +
+        "significance=" + significance + "");
 }
 catch ( e ) { 
 
-    print( "[registration::based_on_interestpoints] caught exception: "+e );
+    print( "[registration::registration of interest points] caught exception: "+e );
     //important to fail the process if exception occurs
     runtime.exit(1);
     
 }
-
 /* shutdown */
 runtime.exit(0);
diff --git a/spim_registration/timelapse/timelaps_utils.py b/spim_registration/timelapse/timelaps_utils.py
new file mode 100644
index 0000000000000000000000000000000000000000..6a2bebe5395e172fe6c6cb394da4e3efff4ee3e1
--- /dev/null
+++ b/spim_registration/timelapse/timelaps_utils.py
@@ -0,0 +1,33 @@
+import re
+import os
+import math
+
+def produce_xml_merge_job_files(_datasets):
+   fre = re.compile(r'(?P<xml_base>\w+)-(?P<file_id>\d+)-00.h5')
+   value = []
+   for ds in _datasets:
+      bn = os.path.basename(ds)
+      bn_res = fre.search(bn)
+      if bn_res:
+         xml_base,file_id = bn_res.group('xml_base'),bn_res.group('file_id')
+         value.append("{xbase}.job_{fid}.xml".format(xbase=xml_base, fid=int(file_id)))
+
+   return value
+
+
+def produce_string(_fstring, *args, **kwargs):
+   contents = dict()
+   for item in args:
+      if type(item) == type(kwargs):
+         contents.update(item)
+         
+   contents.update(kwargs)
+   return _fstring.format(**contents)
+
+def padding_of_file_id(_n_timepoints):
+   value = math.ceil(math.log10(_n_timepoints))
+
+   if value < 2:
+      return 2
+   else:
+      return value
diff --git a/spim_registration/timelapse/timelapse_registration.bsh b/spim_registration/timelapse/timelapse_registration.bsh
new file mode 100755
index 0000000000000000000000000000000000000000..82c051815af93ceee782daab02e48dd8c0f7abc2
--- /dev/null
+++ b/spim_registration/timelapse/timelapse_registration.bsh
@@ -0,0 +1,193 @@
+// Load Fiji dependencies
+import ij.IJ; 		// calls imagej
+import ij.Prefs; 	// calls imagej settings
+import ij.ImagePlus;
+import java.lang.Runtime;
+import java.io.File;
+import java.io.FilenameFilter;
+ 
+runtime = Runtime.getRuntime();
+System.out.println(runtime.availableProcessors() + " cores available for multi-threading");
+
+Prefs.setThreads(1); 	// defines the number of threads allowed 
+print("Threads: "+Prefs.getThreads()); // prints thread setting in output
+
+// Load xml file
+System.out.println("---------------------------------------------------------");
+System.out.println("Xml file:");
+
+xml_path = System.getProperty( "image_file_directory" );
+
+xml_path = System.getProperty( "image_file_directory" );
+merged_xml = System.getProperty( "merged_xml" );
+if ( ! merged_xml.endsWith(".xml") )
+    merged_xml = merged.xml + ".xml";
+
+System.out.println( "selected_xml = " + xml_path + merged_xml );
+
+// General Registration Parameters and Channel Settings
+System.out.println("---------------------------------------------------------");
+System.out.println( "General parameters: " );
+
+timelapse_process_timepoints = System.getProperty( "timelapse_process_timepoints" );
+reg_process_illumination = System.getProperty( "reg_process_illumination" );
+reg_process_angle = System.getProperty( "reg_process_angle" ); 
+
+System.out.println( "process_timepoints = " + timelapse_process_timepoints ); 
+System.out.println( "process_illumination = " + reg_process_illumination );
+System.out.println( "process_angle = " + reg_process_angle );
+
+// Timelapse registration Parameter
+System.out.println("---------------------------------------------------------");
+System.out.println( "Timelapse Registration: " );
+
+reference_timepoint = System.getProperty( "reference_timepoint" );
+System.out.println( "reference_timepoint=" + reference_timepoint );
+
+type_of_registration_timelapse = System.getProperty( "type_of_registration_timelapse" );
+registration_algorithm = System.getProperty( "registration_algorithm" );
+
+
+System.out.println( "type_of_registration = " + type_of_registration_timelapse );
+System.out.println( "registration_algorithm = " + registration_algorithm );
+
+
+transformation_model = System.getProperty( "transformation_model" );
+model_to_regularize_with = System.getProperty( "model_to_regularize_with" );
+float lambda = Float.parseFloat( System.getProperty( "lambda" ) );
+int allowed_error_for_ransac = Integer.parseInt( System.getProperty( "allowed_error_for_ransac" ) );
+significance = System.getProperty( "significance" );
+
+System.out.println( "transformation = " + transformation_model );
+System.out.println( "model_to_regularize_with = " + model_to_regularize_with );
+System.out.println( "lambda = " + lambda );
+System.out.println( "allowed_error_for_ransac = " + allowed_error_for_ransac );
+System.out.println( "significance = " + significance );
+
+// Timelapse registration Parameter
+System.out.println("---------------------------------------------------------");
+System.out.println( "Channel Settings: " );
+// Channel Setting Registration
+// parses channels and takes from there the number of channels
+// takes from reg_process_channel if it is Single Channel, Dual Channel or Dual Channel
+// were one Channel contains the beads
+// from this it decides which string to assemble
+
+reg_process_channel = System.getProperty( "reg_process_channel" );
+System.out.println( "process_channel = " + reg_process_channel );
+
+channels = System.getProperty( "channels" );
+System.out.println( "Channels = " + channels );
+
+reg_interest_points_channel = System.getProperty( "reg_interest_points_channel" );
+System.out.println( "reg_interest_points_channel = " + reg_interest_points_channel );
+
+// Splits up channels, reg_interest_points_channel
+String delims = "[,]";
+String[] channel_token = channels.split(delims);
+String[] interest_token = reg_interest_points_channel.split(delims);
+				
+String reg_single_channel_string = "";
+StringBuilder reg_multi_channel_string = new StringBuilder();
+
+if (channels.equalsIgnoreCase(""))
+{
+	System.out.println("Warning: There are no channels set");
+}
+
+// Assembles string for Single Channel registration
+else if (reg_process_channel.equalsIgnoreCase( "All channels" ) && channel_token.length == 1 )	
+{	
+	reg_multi_channel_string.append( "" );
+	reg_single_channel_string = "interest_points_channel_" + channels + "=" + reg_interest_points_channel + " ";
+}
+	
+// Assembles string for Multi Channel registration
+else if (reg_process_channel.equalsIgnoreCase( "All channels" ) && channel_token.length > 1 ) 
+{
+	for (int channel=0; channel < channel_token.length; channel++ )
+
+		{	
+			String channel_part = "interest_points_channel_" + channel_token[channel] + "=" + interest_token[channel] + " ";
+			reg_multi_channel_string.append( channel_part );
+			reg_multi_channel_string.append(" ");
+		}
+}
+				
+// Returns error of Multi Channels one Channel contains the beads is selected but not enough settings in channels or reg_interest_points_channel
+else if (reg_process_channel.equalsIgnoreCase( "Single channel (Select from List)" ) && ( channel_token.length < 1 || interest_token.length < 1 ))
+{
+	System.out.println( "Error: Multi Channel one Channel contains beads selected but only one setting in channls or reg_interest_points_channel" );
+}
+			
+// Assembles string for Multi Channel Processing one Channel Contains the beads	
+else if (reg_process_channel.equalsIgnoreCase( "Single channel (Select from List)" ) && channel_token.length > 1 && interest_token.length > 1 )	
+{
+		for (int channel=0; channel < channel_token.length; channel++ )
+
+		{	
+			String channel_part = "interest_points_channel_" + channel_token[channel] + "=" + interest_token[channel] + " ";
+			reg_multi_channel_string.append( channel_part );
+			reg_multi_channel_string.append(" ");
+		}
+					
+}
+			
+System.out.println( "reg_single_channel_string = " + reg_single_channel_string );
+System.out.println( "reg_multi_channel_string = " + reg_multi_channel_string );
+
+
+System.out.println( "=======================================================" );
+System.out.println( "Starting Timelapse Registration" );
+
+System.out.println( "Register Dataset based on Interest Points , select_xml=" + xml_path + merged_xml + " " +
+	"process_angle=[" + reg_process_angle + "] " + 
+	"process_channel=[" + reg_process_channel + "] " +
+	"process_illumination=[" + reg_process_illumination + "] " +  
+	"process_timepoint=[" + timelapse_process_timepoints + "] " +
+	"registration_algorithm=[" + registration_algorithm + "] " + 
+	"type_of_registration=[" + type_of_registration_timelapse + "] " +
+	reg_multi_channel_string +
+	reg_single_channel_string +
+//	"interest_points_channel_" + channel_1 + "=" + reg_1_interest_points_channel + " " +
+//	"interest_points_channel_" + channel_2 + "=" + reg_2_interest_points_channel + " " + // Dual Channel 
+	"reference=" + reference_timepoint + " " +
+	"consider_each_timepoint_as_rigid_unit " +
+	"transformation=" + transformation_model + " " +
+	"regularize_model " +
+	"model_to_regularize_with=" + model_to_regularize_with + " " +
+	"lamba=" + lambda + " " +
+	"allowed_error_for_ransac=" + allowed_error_for_ransac + " " +
+	"significance=" + significance + "");
+
+try {
+IJ.run("Register Dataset based on Interest Points", 
+	"select_xml=" + xml_path + merged_xml + " " +
+	"process_angle=[" + reg_process_angle + "] " + 
+	"process_channel=[" + reg_process_channel + "] " +
+	"process_illumination=[" + reg_process_illumination + "] " +  
+	"process_timepoint=[" + timelapse_process_timepoints + "] " +
+	"registration_algorithm=[" + registration_algorithm + "] " + 
+	"type_of_registration=[" + type_of_registration_timelapse + "] " +
+	reg_multi_channel_string +
+	reg_single_channel_string +
+//	"interest_points_channel_" + channel_1 + "=" + reg_1_interest_points_channel + " " +
+//	"interest_points_channel_" + channel_2 + "=" + reg_2_interest_points_channel + " " + // Dual Channel 
+	"reference=" + reference_timepoint + " " +
+	"consider_each_timepoint_as_rigid_unit " +
+	"transformation=" + transformation_model + " " +
+	"regularize_model " +
+	"model_to_regularize_with=" + model_to_regularize_with + " " +
+	"lamba=" + lambda + " " +
+	"allowed_error_for_ransac=" + allowed_error_for_ransac + " " +
+	"significance=" + significance + "");
+}
+catch ( e ) { 
+
+    print( "[registration::timelapse] caught exception: "+e );
+    //important to fail the process if exception occurs
+    runtime.exit(1);
+    
+}
+/* shutdown */
+runtime.exit(0);
diff --git a/spim_registration/timelapse/tomancak.json b/spim_registration/timelapse/tomancak.json
index b1a87ba51d43edd2bb5a778b1680030c116c3688..021578435e6439631f55fdcb0780d5de97888993 100644
--- a/spim_registration/timelapse/tomancak.json
+++ b/spim_registration/timelapse/tomancak.json
@@ -1,7 +1,7 @@
 {
     "common" :
     {
-	"fiji-app" : "/projects/hpcsupport/steinbac/unicore/christopher-sandbox/unicore_jobs/Fiji.app.cuda_new/ImageJ-linux64",
+	"fiji-app" : "/projects/hpcsupport/steinbac/unicore/christopher/unicore_jobs/Fiji.app.cuda_new/ImageJ-linux64",
 	"fiji-prefix" : "/sw/bin/xvfb-run -a",
 	"directory_cuda" : "/lustre/projects/hpcsupport/steinbac/unicore/christopher/unicore_jobs/Fiji.app.cuda_new/lib/",
 	"merged_xml" : "hdf5_test_unicore_merge"
diff --git a/spim_registration/timelapse/tomancak_czi.json b/spim_registration/timelapse/tomancak_czi.json
new file mode 100644
index 0000000000000000000000000000000000000000..9a2445f03860cec92dec550035d55edcc38ada2e
--- /dev/null
+++ b/spim_registration/timelapse/tomancak_czi.json
@@ -0,0 +1,204 @@
+{
+    "common" :
+    {
+	"fiji-app" : "/projects/hpcsupport/steinbac/unicore/christopher/unicore_jobs/Fiji.app.cuda_new/ImageJ-linux64",
+	"fiji-prefix" : "/sw/bin/xvfb-run -a",
+	"directory_cuda" : "/lustre/projects/hpcsupport/steinbac/unicore/christopher/unicore_jobs/Fiji.app.cuda_new/lib/",
+	"merged_xml" : "hdf5_test_unicore_merge",
+	"bsh_directory" : "/home/steinbac/development/cschmied-snakemake-workflows/spim_registration/timelapse/",
+	"first_xml_filename" : "test_unicore",
+	"hdf5_xml_filename" : "\"hdf5_test_unicore\"",
+	"fusion_switch" : "deconvolution",
+	"ntimepoints" : 3
+    },
+    
+    "define_xml_czi" :
+    {
+    	    "pixel_distance_x" : "0.2875535786151886",
+    	    "pixel_distance_y" : "0.2875535786151886",
+    	    "pixel_distance_z" : "1.50000", 
+    	    "pixel_unit" : "um",				    
+    	    "first_czi" : "2015-02-21_LZ1_Stock68_3.czi",
+    	    "channel_1" : "green",		
+    	    "channel_2" : "red",
+    	    "angle_1" : "0",
+    	    "angle_2" : "72",
+    	    "angle_3" :"144",
+    	    "angle_4" :"216",
+    	    "angle_5" : "288",
+    	    "illumination_1" : "0",
+    	    "rotation_around" : "X-Axis",
+    	    "bsh_file" : "define_czi.bsh" 
+    },
+    
+    "define_xml_tif" :
+    {
+	"timepoints" : "0-1",
+	"acquisition_angles" : "0,72,144,216,288",
+	"channels" : "0",
+	"image_file_pattern" : "img_TL{{t}}_Angle{{a}}.tif",
+	"pixel_distance_x"  : "0.2875535786151886",
+	"pixel_distance_y" : "0.2875535786151886",
+	"pixel_distance_z" : "1.50000",
+	"pixel_unit" : "um",
+	"multiple_timepoints" : "\"YES (one file per time-point)\"",
+	"multiple_channels" : "\"NO (one channel)\"",
+	"multiple_illumination_directions" : "\"NO (one illumination direction)\"",
+	"multiple_angles" : "\"YES (one file per angle)\"",
+	"type_of_dataset" : "\"Image Stacks (ImageJ Opener)\"",
+	"imglib_container" : "\"ArrayImg (faster)\"",
+	"bsh_file" : "define_tif_zip.bsh" 
+    },
+    
+    "resave_hdf5" :
+    {
+    	    "parallel_timepoints" : "3",
+    	    "resave_angle" : "\"All angles\"",
+    	    "resave_channel" : "\"All channels\"",
+    	    "resave_illumination" : "\"All illuminations\"",
+    	    "resave_timepoint" : "\"All Timepoints\"",
+    	    "subsampling_factors" : "\"{{ {{1,1,1}}, {{2,2,1}}, {{4,4,1}}, {{8,8,1}} }}\"",
+    	    "hdf5_chunk_sizes" : "\"{{ {{32,32,4}}, {{32,32,4}}, {{16,16,16}}, {{16,16,16}} }}\"",
+    	    "timepoints_per_partition" : "1",
+    	    "setups_per_partition" : "0",
+    	    "bsh_file" : "export.bsh"
+    },
+    
+    "registration" :
+    {
+	"timepoint" : "\"Single Timepoint (Select from List)\"",
+	"illuminations" : "\"All illuminations\"",
+	"angle" : "\"All angles\"",
+	"channel" : "\"All channels\"",
+	"proc-ch" : "\"channel 0\"",
+	"algorithm" : "\"Fast 3d geometric hashing (rotation invariant)\"",
+	"label_interest_points" : "\"beads\"",
+	"type_of_registration" : "\"Register timepoints individually\"",
+	"type_of_detection" : "\"Difference-of-Mean (Integral image based)\"" ,
+	"subpixel_localization" : "\"3-dimensional quadratic fit\"",
+	"imglib_container" : "\"ArrayImg (faster)\"",
+	"radius_1" : "2",
+	"radius_2" : "3",
+	"threshold" : "0.005",
+	"interest_points_channel_0" : "\"beads\"",
+	"interest_points_channel_1" : "\"beads\"",
+	"fix_tiles" : "\"Fix first tile\"",
+	"map_back_tiles" : "\"Map back to first tile using rigid model\"",
+	"transformation_model" : "Affine",
+	"model_to_regularize_with" : "Rigid",
+	"lambda" : "0.10" ,
+	"allowed_error_for_ransac" : "5",
+	"significance" : "10",
+	"detection_min_max" : "find_maxima",
+	"initial_sigma" : "1.8",
+	"threshold_gaussian" : "0.0080",
+	"bsh_file" : "registration.bsh"
+    },
+ 
+    "xml_merge" :
+    {
+	"bsh_file" : "xml_merge.bsh"
+    },
+    
+    "timelapse" : 
+    {
+    	  "reference_timepoint" : "0",
+    	  "timelapse_process_timepoints" : "\"All Timepoints\"",
+    	  "type_of_registration_timelapse" : "\"Match against one reference timepoint (no global optimization)\"",
+    	  "bsh_file" : "timelapse_registration.bsh"
+    },
+
+    "external_transform" :
+    {
+	"bsh_file" : "transform.bsh",
+	"angle" : "\"All angles\"",
+	"channel" : "\"All channels\"",
+	"illumination" : "\"All illuminations\"",
+	"timepoint" : "\"All Timepoints\"",
+	"transformation" : "\"Rigid\"",
+	"apply_transformation" : "\"Current view transformations (appends to current transforms)\"",
+	"define_mode_transform" : "\"Matrix\"",
+	"matrix_transform" : "\"0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0\""
+    },
+    
+    "fusion" :
+    {
+    	    "minimal_x" : "128",	
+    	    "minimal_y" : "-13",
+    	    "minimal_z" : "-407",
+    	    "maximal_x" : "986",
+    	    "maximal_y" : "1927",
+    	    "maximal_z" : "498",
+    	    "downsample" : "1",
+    	    "process_timepoint" : "\"Single Timepoint (Select from List)\"",
+    	    "process_channel" : "\"All channels\"",
+    	    "process_illumination" : "\"All illuminations\"",
+    	    "process_angle" : "\"All angles\"",
+    	    "xml_output" : "\"Save every XML with user-provided unique id\"", 
+    	    "fused_image" : "\"Append to current XML Project\"",
+    	    "pixel_type" : "\"16-bit unsigned integer\"",
+    	    "imglib2_container_fusion" : "\"ArrayImg\"",
+    	    "process_views_in_paralell" : "\"All\"",
+    	    "interpolation" : "\"Linear Interpolation\"",
+    	    "imglib2_data_container" : "\"ArrayImg (faster)\"",
+    	    "bsh_file" : "fusion.bsh"
+    },
+
+    "deconvolution" :
+    {
+
+	"bsh_file" : "deconvolution_GPU.bsh",
+	"process_timepoint" : "\"Single Timepoint (Select from List)\"",
+	"process_channel" : "\"All channels\"",
+	"process_illumination" : "\"All illuminations\"",
+	"process_angle" : "\"All angles\"",
+	"minimal_x" : "76",
+	"minimal_y" : "4",
+	"minimal_z" : "-192",
+	"maximal_x" : "488",
+	"maximal_y" : "956",
+	"maximal_z" : "214",
+	"imglib2_container" : "\"ArrayImg \"",
+	"type_of_iteration" : "\"Efficient Bayesian - Optimization I (fast, precise)\"",
+	"osem_acceleration" : "\"1 (balanced)\"",
+	"Tikhonov_parameter" : "0.0006",
+	"compute" : "\"in 512x512x512 blocks\"",
+	"compute_on" : "\"GPU (Nvidia CUDA via JNA)\"",
+	"psf_estimation" : "\"Extract from beads\"",
+	"iterations" : "5",
+	"detections_to_extract_psf_for_channel_0" : "\"beads\"",
+	"detections_to_extract_psf_for_channel_1" : "\"beads\"",
+	"psf_size_x" : "19",
+	"psf_size_y" : "19",
+	"psf_size_z" : "25"
+    },
+    
+    "hdf5_output" :
+    {
+    	    "output_image_file_pattern" : "TP{{t}}_Ch{{c}}_Ill0_Ang0,72,144,216,288.tif",
+    	    "output_data_type" : "32Bit",
+    	    "output_xml" : "\"fused_Dual_Channel\"",
+    	    "output_hdf5_xml" : "\"hdf5_fused_Stock68\"",
+    	    "output_multiple_channels" : "\"NO (one channel)\"",	
+    	    "output_timepoints" : "0-1",
+    	    "output_channels" : "green",
+    	    "output_pixel_distance_x" : "0.5718", 	
+    	    "output_pixel_distance_y" : "0.5718", 	
+    	    "output_pixel_distance_z" : "0.5718", 	
+    	    "output_pixel_unit" : "um",			
+    	    "output_multiple_timepoints" : "\"YES (one file per time-point)\"",   	
+    	    "output_illumination_directions" : "\"NO (one illumination direction)\"",	
+    	    "output_multiple_angles" : "\"NO (one angle)\"",					
+    	    "output_type_of_dataset" : "\"Image Stacks (ImageJ Opener)\"", 		
+    	    "output_imglib_container" : "\"ArrayImg (faster)\"",
+    	    "bsh_file_define" : "/define_output.bsh",
+    	    "bsh_file_hdf5" : "/export_output.bsh", 	
+    	    "convert_32bit" : "\"[Use min/max of first image (might saturate intenities over time)]\""
+    	    
+    }
+
+    
+    
+    
+    
+}
diff --git a/spim_registration/timelapse/tomancak_test_cluster.json b/spim_registration/timelapse/tomancak_test_cluster.json
new file mode 100644
index 0000000000000000000000000000000000000000..44899c53b1b4dca63946a6b2a9d852faa25c9909
--- /dev/null
+++ b/spim_registration/timelapse/tomancak_test_cluster.json
@@ -0,0 +1,202 @@
+{
+    "common" :
+    {
+	"fiji-app" : "/projects/hpcsupport/steinbac/unicore/christopher/unicore_jobs/Fiji.app.cuda_new/ImageJ-linux64",
+	"fiji-prefix" : "/sw/bin/xvfb-run -a",
+	"directory_cuda" : "/lustre/projects/hpcsupport/steinbac/unicore/christopher/unicore_jobs/Fiji.app.cuda_new/lib/",
+	"merged_xml" : "hdf5_test_unicore_merge",
+	"bsh_directory" : "/home/steinbac/development/schmied-snakemake-workflows/spim_registration/timelapse/",
+	"first_xml_filename" : "test_unicore",
+	"hdf5_xml_filename" : "\"hdf5_test_unicore\"",
+	"fusion_switch" : "deconvolution",
+	"ntimepoints" : 5
+    },
+    
+    "define_xml_czi" :
+    {
+    	    "pixel_distance_x" : "0.28590106964",
+    	    "pixel_distance_y" : "0.28590106964",
+    	    "pixel_distance_z" : "1.50000", 
+    	    "pixel_unit" : "um",				    
+    	    "first_czi" : "2015-04-11_LZ2_Stock68_3.czi",
+    	    "channel_1" : "green",		
+    	    "channel_2" : "red",
+    	    "angle_1" : "0",
+    	    "angle_2" : "72",
+    	    "angle_3" : "144",
+    	    "angle_4" : "216",
+    	    "angle_5" : "288",
+    	    "illumination_1" : "0",
+    	    "rotation_around" : "X-Axis",
+    	    "bsh_file" : "define_czi.bsh" 
+    },
+    
+    "define_xml_tif" :
+    {
+	"acquisition_angles" : "0,72,144,216,288",
+	"channels" : "0",
+	"image_file_pattern" : "img_TL{{t}}_Angle{{a}}.tif",
+	"pixel_distance_x" : "0.28590106964",
+	"pixel_distance_y" : "0.28590106964",
+	"pixel_distance_z" : "1.50000",
+	"pixel_unit" : "um",
+	"multiple_timepoints" : "\"YES (one file per time-point)\"",
+	"multiple_channels" : "\"NO (one channel)\"",
+	"multiple_illumination_directions" : "\"NO (one illumination direction)\"",
+	"multiple_angles" : "\"YES (one file per angle)\"",
+	"type_of_dataset" : "\"Image Stacks (ImageJ Opener)\"",
+	"imglib_container" : "\"ArrayImg (faster)\"",
+	"bsh_file" : "define_tif_zip.bsh" 
+    },
+    
+    "resave_hdf5" :
+    {
+    	    "resave_angle" : "\"All angles\"",
+    	    "resave_channel" : "\"All channels\"",
+    	    "resave_illumination" : "\"All illuminations\"",
+    	    "resave_timepoint" : "\"All Timepoints\"",
+    	    "subsampling_factors" : "\"{{ {{1,1,1}}, {{2,2,1}}, {{4,4,1}}, {{8,8,1}} }}\"",
+    	    "hdf5_chunk_sizes" : "\"{{ {{32,32,4}}, {{32,32,4}}, {{16,16,16}}, {{16,16,16}} }}\"",
+    	    "timepoints_per_partition" : "1",
+    	    "setups_per_partition" : "0",
+    	    "bsh_file" : "export.bsh"
+    },
+    
+    "registration" :
+    {
+	"timepoint" : "\"Single Timepoint (Select from List)\"",
+	"illuminations" : "\"All illuminations\"",
+	"angle" : "\"All angles\"",
+	"channel" : "\"All channels\"",
+	"proc-ch" : "\"channel 0\"",
+	"algorithm" : "\"Fast 3d geometric hashing (rotation invariant)\"",
+	"label_interest_points" : "\"beads\"",
+	"type_of_registration" : "\"Register timepoints individually\"",
+	"type_of_detection" : "\"Difference-of-Mean (Integral image based)\"" ,
+	"subpixel_localization" : "\"3-dimensional quadratic fit\"",
+	"imglib_container" : "\"ArrayImg (faster)\"",
+	"radius_1" : "2",
+	"radius_2" : "3",
+	"threshold" : "0.005",
+	"interest_points_channel_0" : "\"beads\"",
+	"interest_points_channel_1" : "\"beads\"",
+	"fix_tiles" : "\"Fix first tile\"",
+	"map_back_tiles" : "\"Map back to first tile using rigid model\"",
+	"transformation_model" : "Affine",
+	"model_to_regularize_with" : "Rigid",
+	"lambda" : "0.10" ,
+	"allowed_error_for_ransac" : "5",
+	"significance" : "10",
+	"detection_min_max" : "find_maxima",
+	"initial_sigma" : "1.8",
+	"threshold_gaussian" : "0.0080",
+	"bsh_file" : "registration.bsh"
+    },
+ 
+    "xml_merge" :
+    {
+	"bsh_file" : "xml_merge.bsh"
+    },
+    
+    "timelapse" : 
+    {
+    	  "reference_timepoint" : "0",
+    	  "timelapse_process_timepoints" : "\"All Timepoints\"",
+    	  "type_of_registration_timelapse" : "\"Match against one reference timepoint (no global optimization)\"",
+    	  "bsh_file" : "timelapse_registration.bsh"
+    },
+
+    "external_transform" :
+    {
+	"bsh_file" : "transform.bsh",
+	"angle" : "\"All angles\"",
+	"channel" : "\"All channels\"",
+	"illumination" : "\"All illuminations\"",
+	"timepoint" : "\"All Timepoints\"",
+	"transformation" : "\"Rigid\"",
+	"apply_transformation" : "\"Current view transformations (appends to current transforms)\"",
+	"define_mode_transform" : "\"Matrix\"",
+	"matrix_transform" : "\"0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0\""
+    },
+    
+    "fusion" :
+    {
+    	    "minimal_x" : "190",	
+    	    "minimal_y" : "-16",
+    	    "minimal_z" : "-348",
+    	    "maximal_x" : "1019",
+    	    "maximal_y" : "1941",
+    	    "maximal_z" : "486",
+    	    "downsample" : "1",
+    	    "process_timepoint" : "\"Single Timepoint (Select from List)\"",
+    	    "process_channel" : "\"All channels\"",
+    	    "process_illumination" : "\"All illuminations\"",
+    	    "process_angle" : "\"All angles\"",
+    	    "xml_output" : "\"Save every XML with user-provided unique id\"", 
+    	    "fused_image" : "\"Append to current XML Project\"",
+    	    "pixel_type" : "\"16-bit unsigned integer\"",
+    	    "imglib2_container_fusion" : "\"ArrayImg\"",
+    	    "process_views_in_paralell" : "\"All\"",
+    	    "interpolation" : "\"Linear Interpolation\"",
+    	    "imglib2_data_container" : "\"ArrayImg (faster)\"",
+    	    "bsh_file" : "fusion.bsh"
+    },
+
+    "deconvolution" :
+    {
+
+	"bsh_file" : "deconvolution_GPU.bsh",
+	"process_timepoint" : "\"Single Timepoint (Select from List)\"",
+	"process_channel" : "\"All channels\"",
+	"process_illumination" : "\"All illuminations\"",
+	"process_angle" : "\"All angles\"",
+	"minimal_x" : "95",
+	"minimal_y" : "-8",
+	"minimal_z" : "-174",
+	"maximal_x" : "509",
+	"maximal_y" : "970",
+	"maximal_z" : "243",
+	"imglib2_container" : "\"ArrayImg \"",
+	"type_of_iteration" : "\"Efficient Bayesian - Optimization I (fast, precise)\"",
+	"osem_acceleration" : "\"1 (balanced)\"",
+	"Tikhonov_parameter" : "0.0006",
+	"compute" : "\"in 512x512x512 blocks\"",
+	"compute_on" : "\"GPU (Nvidia CUDA via JNA)\"",
+	"psf_estimation" : "\"Extract from beads\"",
+	"iterations" : "5",
+	"detections_to_extract_psf_for_channel_0" : "\"beads\"",
+	"detections_to_extract_psf_for_channel_1" : "\"beads\"",
+	"psf_size_x" : "19",
+	"psf_size_y" : "19",
+	"psf_size_z" : "25"
+    },
+    
+    "hdf5_output" :
+    {
+    	    "output_image_file_pattern" : "TP{{t}}_Ch{{c}}_Ill0_Ang0,72,144,216,288.tif",
+    	    "output_data_type" : "32Bit",
+    	    "output_xml" : "\"fused_Dual_Channel\"",
+    	    "output_hdf5_xml" : "\"hdf5_fused_Stock68\"",
+    	    "output_multiple_channels" : "\"NO (one channel)\"",	
+    	    "output_timepoints" : "0-4",
+    	    "output_channels" : "green",
+    	    "output_pixel_distance_x" : "0.5718", 	
+    	    "output_pixel_distance_y" : "0.5718", 	
+    	    "output_pixel_distance_z" : "0.5718", 	
+    	    "output_pixel_unit" : "um",			
+    	    "output_multiple_timepoints" : "\"YES (one file per time-point)\"",   	
+    	    "output_illumination_directions" : "\"NO (one illumination direction)\"",	
+    	    "output_multiple_angles" : "\"NO (one angle)\"",					
+    	    "output_type_of_dataset" : "\"Image Stacks (ImageJ Opener)\"", 		
+    	    "output_imglib_container" : "\"ArrayImg (faster)\"",
+    	    "bsh_file_define" : "/define_output.bsh",
+    	    "bsh_file_hdf5" : "/export_output.bsh", 	
+    	    "convert_32bit" : "\"[Use min/max of first image (might saturate intenities over time)]\""
+    	    
+    }
+
+    
+    
+    
+    
+}
diff --git a/spim_registration/timelapse/tomancak_test_cluster.yaml b/spim_registration/timelapse/tomancak_test_cluster.yaml
new file mode 100755
index 0000000000000000000000000000000000000000..77c76210cd21385a3cbff9cf250fd1a697657831
--- /dev/null
+++ b/spim_registration/timelapse/tomancak_test_cluster.yaml
@@ -0,0 +1,186 @@
+common: {
+  # directory that contains the bean shell scripts
+  bsh_directory: "/projects/pilot_spim/Christopher/snakemake-workflows/spim_registration/timelapse/",
+  directory_cuda: "/sw/users/schmied/packages/2015-06-08_Fiji.app.cuda/lib/",
+  fiji-app: "/sw/users/schmied/packages/2015-06-08_Fiji.app.cuda/ImageJ-linux64",
+  fiji-prefix: "/sw/bin/xvfb-run -a",
+  first_xml_filename: "test_unicore",
+  hdf5_xml_filename: '"hdf5_test_unicore"',
+  merged_xml: "hdf5_test_unicore_merge",
+  ntimepoints: 5,
+  angles: "0,72,144,216,288",
+  channels: "green",
+  illumination: "0",
+  pixel_distance_x: '0.28590106964',
+  pixel_distance_y: '0.28590106964',
+  pixel_distance_z: '1.50000',
+  pixel_unit: "um",
+  fusion_switch: "deconvolution"
+  # fusion_switch: "fusion"
+  }
+              
+define_xml_czi: {
+  first_czi: "2015-04-11_LZ2_Stock68_3.czi",
+  rotation_around: "X-Axis",
+  bsh_file: "define_czi.bsh"
+  }
+          
+define_xml_tif: {
+  image_file_pattern: 'img_TL{{t}}_Angle{{a}}.tif',
+  imglib_container: '"ArrayImg (faster)"',
+  multiple_angles: '"YES (one file per angle)"',
+  multiple_channels: '"NO (one channel)"',
+  multiple_illumination_directions: '"NO (one illumination direction)"',
+  multiple_timepoints: '"YES (one file per time-point)"',
+  type_of_dataset: '"Image Stacks (ImageJ Opener)"',
+  bsh_file: "define_tif_zip.bsh"
+  }
+  
+resave_hdf5: {
+  hdf5_chunk_sizes: '"{{ {{32,32,4}}, {{32,32,4}}, {{16,16,16}}, {{16,16,16}} }}"',
+  resave_angle: '"All angles"',
+  resave_channel: '"All channels"',
+  resave_illumination: '"All illuminations"',
+  resave_timepoint: '"All Timepoints"',
+  setups_per_partition: '0',
+  subsampling_factors: '"{{ {{1,1,1}}, {{2,2,1}}, {{4,4,1}}, {{8,8,1}} }}"',
+  timepoints_per_partition: '1',
+  bsh_file: "export.bsh"
+  }
+
+registration: {
+  # "Single Channel" is not a valid choice for "Process_channel"
+  reg_process_channel: '"All channels"', 
+  reg_processing_channel: '"green"',
+  reg_interest_points_channel: '"beads"',
+  reg_radius_1: '2',
+  reg_radius_2: '3',
+  reg_threshold: '0.005',
+  initial_sigma: '1.8',
+  threshold_gaussian: '0.0080',
+  type_of_detection: '"Difference-of-Mean (Integral image based)"',
+  label_interest_points: '"beads"',
+  reg_process_timepoint: '"Single Timepoint (Select from List)"',
+  reg_process_angle: '"All angles"',
+  reg_process_illumination: '"All illuminations"',
+  subpixel_localization: '"3-dimensional quadratic fit"',
+  detection_min_max: "find_maxima",
+  type_of_registration: '"Register timepoints individually"',
+  algorithm: '"Fast 3d geometric hashing (rotation invariant)"',
+  transformation_model: "Affine",
+  allowed_error_for_ransac: '5',
+  significance: '10',
+  fix_tiles: '"Fix first tile"',
+  map_back_tiles: '"Map back to first tile using rigid model"',
+  model_to_regularize_with: "Rigid",
+  lambda: '0.10',
+  imglib_container: '"ArrayImg (faster)"',
+  bsh_file: "registration.bsh"
+  }
+
+xml_merge: {
+  bsh_file: "xml_merge.bsh"
+  }
+  
+timelapse: {
+  reference_timepoint: '0',
+  type_of_registration_timelapse: '"Match against one reference timepoint (no global optimization)"',
+  timelapse_process_timepoints: '"All Timepoints"',
+  bsh_file: "timelapse_registration.bsh"
+  }
+  
+Dublicate_transformations: {
+  source_dublication: "red",
+  target_dublication: "green",
+  bsh_file: "dublicate_channel.bsh"
+  }
+  
+fusion: {
+  bsh_file: "fusion.bsh",
+  downsample: '4',
+  fused_image: '"Append to current XML Project"',
+  imglib2_container_fusion: '"ArrayImg"',
+  imglib2_data_container: '"ArrayImg (faster)"',
+  interpolation: '"Linear Interpolation"',
+  minimal_x: '190',
+  minimal_y: '-16',
+  minimal_z: '-348',
+  maximal_x: '1019',
+  maximal_y: '1941',
+  maximal_z: '486',
+  pixel_type: '"16-bit unsigned integer"',
+  process_angle: '"All angles"',
+  process_channel: '"All channels"',
+  process_illumination: '"All illuminations"',
+  process_timepoint: '"Single Timepoint (Select from List)"',
+  process_views_in_paralell: '"All"',
+  xml_output: '"Save every XML with user-provided unique id"'
+  }
+
+external_transform: {
+  # channel setting: '"all_channels"'
+  channel_setting: '"green"',
+  transform_timepoint: '"All Timepoints"',
+  transform_angle: '"All angles"',
+  transform_channel: '"All channels"',
+  # illumination setting only one illumination side
+  transform_illumination: '"All illuminations"',
+  apply_transformation: '"Current view transformations (appends to current transforms)"',
+  define_mode_transform: '"Matrix"',
+  matrix_transform: '"0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0"',
+  transformation: '"Rigid"',
+  bsh_file: "transform.bsh"
+  }
+
+deconvolution: {
+  iterations: '1',
+  minimal_x_deco: '190',
+  minimal_y_deco: '-16',
+  minimal_z_deco: '-348',
+  maximal_x_deco: '1019',
+  maximal_y_deco: '1941',
+  maximal_z_deco: '486',
+  detections_to_extract_psf_for_channel: '"beads"',
+  process_timepoint: '"Single Timepoint (Select from List)"',
+  process_angle: '"All angles"',
+  process_channel: '"All channels"',
+  process_illumination: '"All illuminations"',
+  Tikhonov_parameter: '0.0006',
+  compute: '"in 512x512x512 blocks"',
+  compute_on: '"GPU (Nvidia CUDA via JNA)"',
+  imglib2_container: '"ArrayImg"',
+  osem_acceleration: '"1 (balanced)"',
+  psf_estimation: '"Extract from beads"',
+  psf_size_x: '19',
+  psf_size_y: '19',
+  psf_size_z: '25',
+  type_of_iteration: '"Efficient Bayesian - Optimization I (fast, precise)"',
+  bsh_file: "deconvolution_GPU.bsh"
+  }
+  
+hdf5_output: {
+  output_image_file_pattern: 'TP{{t}}_Chgreen_Ill0_Ang0,72,144,216,288.tif',
+  output_xml: '"fused_Single_Channel"',
+  output_hdf5_xml: '"hdf5_fused_Single_Channel"',
+  output_multiple_channels: '"NO (one channel)"',
+  output_timepoints: '0-4',
+  output_pixel_distance_x: 0.5718,
+  output_pixel_distance_y: 0.5718,
+  output_pixel_distance_z: 0.5718,
+  output_pixel_unit: 'um',
+  output_channels: "green",
+  output_data_type: "32Bit",
+  convert_32bit: '"[Use min/max of first image (might saturate intenities over time)]"',
+  output_type_of_dataset: '"Image Stacks (ImageJ Opener)"',
+  output_multiple_timepoints: '"YES (one file per time-point)"',
+  output_multiple_angles: '"NO (one angle)"',
+  output_illumination_directions: '"NO (one illumination direction)"',
+  output_imglib_container: '"ArrayImg (faster)"',
+  subsampling_output: '"{{ {{1,1,1}}, {{2,2,2}}, {{4,4,4}}, {{8,8,8}} }}"',
+  chunk_sizes_output: '"{{ {{16,16,16}}, {{16,16,16}}, {{16,16,16}}, {{16,16,16}} }}"',
+  # subsampling_output: '"{{ {{1,1,1}}, {{2,2,2}} }}"',
+  # chunk_sizes_output: '"{{ {{16,16,16}}, {{16,16,16}} }}"',
+  bsh_file_define: "define_output.bsh",
+  bsh_file_hdf5: "export_output.bsh"
+  }
+
diff --git a/spim_registration/timelapse/transform.bsh b/spim_registration/timelapse/transform.bsh
old mode 100644
new mode 100755
index 839a08521875b663810ef80a37742f9131c30a80..3e87082b23b8619a2efb4842681d3033e8b3bbf7
--- a/spim_registration/timelapse/transform.bsh
+++ b/spim_registration/timelapse/transform.bsh
@@ -1,3 +1,5 @@
+// is problematic needs to be adjusted for
+// multi channel and multi illumination datasets
 import ij.IJ;
 import ij.ImagePlus;
 import java.lang.Runtime;
@@ -11,13 +13,11 @@ System.out.println(runtime.availableProcessors() + " cores available for multi-t
 // Load Parameters form job file
 image_file_directory = System.getProperty( "image_file_directory" );
 merged_xml = System.getProperty( "merged_xml" );
-if ( ! merged_xml.endsWith(".xml") )
-    merged_xml = merged.xml + ".xml";
-    
 transform_angle = System.getProperty( "transform_angle" );
 transform_channel = System.getProperty( "transform_channel" );
 transform_illumination = System.getProperty( "transform_illumination" );
 transform_timepoint = System.getProperty( "transform_timepoint" );
+channel_setting = System.getProperty( "channel_setting" );
 transformation = System.getProperty( "transformation" );
 apply_transformation  = System.getProperty( "apply_transformation" );
 define_mode_transform = System.getProperty( "define_mode_transform" );
@@ -26,15 +26,16 @@ matrix_transform = System.getProperty( "matrix_transform" );
 // Print Parameters into output file
 
 System.out.println( "browse = " + image_file_directory );
-System.out.println( "select_xml = " + image_file_directory + merged_xml  );
+System.out.println( "select_xml = " + image_file_directory + merged_xml );
 System.out.println( "apply_to_angle = " + transform_angle );
 System.out.println( "apply_to_channel = " + transform_channel );
 System.out.println( "apply_to_illumination = " + transform_illumination );
 System.out.println( "apply_to_timepoint = " + transform_timepoint );
+System.out.println( "Channel_setting = " + channel_setting );
 System.out.println( "transformation = " + transformation );
 System.out.println( "apply = " + apply_transformation );
 System.out.println( "define = " + define_mode_transform );
-System.out.println( "all_timepoints_channel_0_illumination_0_all_angles = " + matrix_transform );
+System.out.println( "all_timepoints_channel_" + channel_setting + "_illumination_0_all_angles = " + matrix_transform );
 
 // Execute Fiji Plugin
 try {
@@ -50,12 +51,11 @@ IJ.run("Apply Transformations",
 	"define=" + define_mode_transform + " " + 
 	"same_transformation_for_all_timepoints " + 
 	"same_transformation_for_all_angles " +
-//	"all_timepoints_channel_0_illumination_0_all_angles=[0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0, 0.0, 0.0, 0.0, 0.5, 0.0]");
-	"all_timepoints_channel_0_illumination_0_all_angles=[" + matrix_transform + "]");
+	"all_timepoints_channel_" + channel_setting + "_illumination_0_all_angles=[" + matrix_transform + "]");
 }
 catch ( e ) { 
 
-    print( "[transform] caught exception: "+e );
+    print( "[external transformation] caught exception: "+e );
     //important to fail the process if exception occurs
     runtime.exit(1);
     
diff --git a/spim_registration/timelapse/xml_merge.bsh b/spim_registration/timelapse/xml_merge.bsh
old mode 100644
new mode 100755
index a3ab7dab127d6d4fad3f9d841f029aaa65630d5b..74949e34558d49d5ea8d1dea815d5e183cd0e9fe
--- a/spim_registration/timelapse/xml_merge.bsh
+++ b/spim_registration/timelapse/xml_merge.bsh
@@ -1,4 +1,6 @@
-import ij.IJ;
+// Load Fiji dependencies
+import ij.IJ; 		// calls imagej
+import ij.Prefs; 	// calls imagej settings
 import ij.ImagePlus;
 import java.lang.Runtime;
 import java.io.File;
@@ -7,16 +9,18 @@ import java.io.FilenameFilter;
 runtime = Runtime.getRuntime();
 System.out.println(runtime.availableProcessors() + " cores available for multi-threading");
 
+Prefs.setThreads(1); 	// defines the number of threads allowed 
+print("Threads: "+Prefs.getThreads()); // prints thread setting in output
 
 System.out.println( "Load Parameters:");
 
-	// Getting parameters from job file
+// Getting parameters from job file
 image_file_directory = System.getProperty( "image_file_directory" );
 
 merged_xml = System.getProperty( "merged_xml" );
 if ( ! merged_xml.endsWith(".xml") )
     merged_xml = merged.xml + ".xml";
-     
+
 // Printing parameters into output file
 System.out.println( "directory=" + image_file_directory );
 System.out.println( "merged_xml=" + merged_xml );
@@ -31,7 +35,8 @@ IJ.run("Merge Cluster Jobs",
 	"filename_contains=job_ " + 
 	"filename_also_contains=.xml " +
 	"display " +
-	"merged_xml=" + merged_xml);
+//	"delete_xml's " + 
+	"merged_xml=" + merged_xml + "");
 }
 catch ( e ) {