diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/Job.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/Job.java
index cdcefc45f0bd0b8ef1673ffc5b7948a24bffde01..52b6e7d3859d5e0bfe5cf7d4312663122baa6d2b 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/Job.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/Job.java
@@ -5,12 +5,14 @@ import java.io.InputStream;
 import java.io.InterruptedIOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.Arrays;
 import java.util.Calendar;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
+import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -29,8 +31,10 @@ import cz.it4i.fiji.haas_java_client.ProgressNotifier;
 import cz.it4i.fiji.haas_java_client.TransferFileProgressForHaaSClient;
 import cz.it4i.fiji.haas_java_client.UploadingFile;
 import cz.it4i.fiji.scpclient.TransferFileProgress;
+
 /***
- * TASK - napojit na UI 
+ * TASK - napojit na UI
+ * 
  * @author koz01
  *
  */
@@ -52,13 +56,19 @@ public class Job {
 	private static final String JOB_INFO_FILENAME = ".jobinfo";
 
 	private static final String JOB_NEEDS_DOWNLOAD = "job.needs_download";
-	
+
 	private static final String JOB_CAN_BE_DOWNLOADED = "job.can_be_downloaded";
-	
+
 	private static final String JOB_IS_DOWNLOADED = "job.downloaded";
-	
+
 	private static final String JOB_IS_UPLOADED = "job.uploaded";
 
+	private static final String JOB_OUTPUT_DIRECTORY_PATH = "job.output_directory_path";
+
+	private static final String JOB_INPUT_DIRECTORY_PATH = "job.input_directory_path";
+
+	private static final String JOB_USE_DEMO_DATA = "job.use_demo_data";
+
 	private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.Job.class);
 
 	private Path jobDir;
@@ -66,41 +76,50 @@ public class Job {
 	private final Supplier<HaaSClient> haasClientSupplier;
 
 	private JobInfo jobInfo;
-	
+
 	private Long jobId;
-	
+
 	private PropertyHolder propertyHolder;
-	
+
 	private final JobManager4Job jobManager;
-	
+
 	private Synchronization synchronization;
+
+	private Path inputDirectory;
+
+	private Path outputDirectory;
+
+	private boolean useDemoData;
+
 	
-	
-	public Job(JobManager4Job jobManager, String name, Path basePath, Supplier<HaaSClient> haasClientSupplier)
+
+	public Job(JobManager4Job jobManager, String name, Path basePath, Supplier<HaaSClient> haasClientSupplier,
+			Function<Path, Path> inputDirectoryProvider, Function<Path, Path> outputDirectoryProvider)
 			throws IOException {
 		this(jobManager, haasClientSupplier);
 		HaaSClient client = getHaaSClient();
 		long id = client.createJob(name, Collections.emptyList());
-		setJobDirectory(basePath.resolve("" + id));
+		setJobDirectory(basePath.resolve("" + id), inputDirectoryProvider, outputDirectoryProvider);
 		propertyHolder = new PropertyHolder(jobDir.resolve(JOB_INFO_FILENAME));
-		Files.createDirectory(jobDir);
+		Files.createDirectory(this.jobDir);
+		storeInputOutputDirectory();
 		setName(name);
-		
+
 	}
 
 	public Job(JobManager4Job jobManager, Path jobDirectory, Supplier<HaaSClient> haasClientSupplier) {
 		this(jobManager, haasClientSupplier);
-		setJobDirectory(jobDirectory);
-		propertyHolder = new PropertyHolder(jobDir.resolve(JOB_INFO_FILENAME));
+		propertyHolder = new PropertyHolder(jobDirectory.resolve(JOB_INFO_FILENAME));
+		useDemoData = getSafeBoolean(propertyHolder.getValue(JOB_USE_DEMO_DATA));
+		setJobDirectory(jobDirectory, jd -> useDemoData ? null : getDataDirectory(JOB_INPUT_DIRECTORY_PATH, jd),
+				jd -> getDataDirectory(JOB_OUTPUT_DIRECTORY_PATH, jd));
 	}
 
-	
 	private Job(JobManager4Job jobManager, Supplier<HaaSClient> haasClientSupplier) {
 		this.haasClientSupplier = haasClientSupplier;
 		this.jobManager = jobManager;
 	}
 
-
 	public void startUploadData() {
 		setProperty(JOB_NEEDS_UPLOAD, true);
 		try {
@@ -127,7 +146,7 @@ public class Job {
 				.collect(Collectors.toList());
 		synchronization.startDownload(files);
 	}
-	
+
 	public void stopDownloadData() {
 		setProperty(JOB_NEEDS_DOWNLOAD, false);
 		try {
@@ -137,14 +156,12 @@ public class Job {
 			throw new RuntimeException(e);
 		}
 	}
-	
+
 	public synchronized void resumeUpload() {
 		if (needsUpload()) {
 			synchronization.resumeUpload();
 		}
 	}
-	
-	
 
 	public synchronized void resumeDownload() {
 		if (needsDownload()) {
@@ -152,11 +169,10 @@ public class Job {
 		}
 	}
 
-	
 	public boolean canBeDownloaded() {
 		return Boolean.parseBoolean(getProperty(JOB_CAN_BE_DOWNLOADED));
 	}
-	
+
 	public void setUploaded(boolean b) {
 		setProperty(JOB_IS_UPLOADED, b);
 	}
@@ -164,23 +180,23 @@ public class Job {
 	public void setDownloaded(boolean b) {
 		setProperty(JOB_IS_DOWNLOADED, b);
 	}
-	
+
 	public boolean isUploaded() {
-		return  getSafeBoolean(getProperty(JOB_IS_UPLOADED));
+		return getSafeBoolean(getProperty(JOB_IS_UPLOADED));
 	}
 
 	public boolean isDownloaded() {
 		return getSafeBoolean(getProperty(JOB_IS_DOWNLOADED));
 	}
-	
+
 	public boolean needsDownload() {
 		return Boolean.parseBoolean(getProperty(JOB_NEEDS_DOWNLOAD));
 	}
-	
+
 	public boolean needsUpload() {
 		return Boolean.parseBoolean(getProperty(JOB_NEEDS_UPLOAD));
 	}
-	
+
 	public void uploadFile(String file, ProgressNotifier notifier) {
 		uploadFiles(Arrays.asList(file), notifier);
 	}
@@ -224,14 +240,16 @@ public class Job {
 		setCanBeDownloaded(true);
 	}
 
-	
-
 	synchronized public long getId() {
 		if (jobId == null) {
 			jobId = getJobId(jobDir);
 		}
 		return jobId;
 	}
+	
+	public boolean isUseDemoData() {
+		return useDemoData;
+	}
 
 	public Path storeDataInWorkdirectory(UploadingFile uploadingFile) throws IOException {
 		Path result;
@@ -242,8 +260,10 @@ public class Job {
 	}
 
 	synchronized public void download(Predicate<String> predicate, ProgressNotifier notifier) {
-		List<String> files = getHaaSClient().getChangedFiles(jobId).stream().filter(predicate).collect(Collectors.toList());
-		try (HaaSFileTransfer transfer =  haasClientSupplier.get().startFileTransfer(getId(), HaaSClient.DUMMY_TRANSFER_FILE_PROGRESS)) {
+		List<String> files = getHaaSClient().getChangedFiles(jobId).stream().filter(predicate)
+				.collect(Collectors.toList());
+		try (HaaSFileTransfer transfer = haasClientSupplier.get().startFileTransfer(getId(),
+				HaaSClient.DUMMY_TRANSFER_FILE_PROGRESS)) {
 			List<Long> fileSizes;
 			try {
 				fileSizes = transfer.obtainSize(files);
@@ -369,20 +389,44 @@ public class Job {
 	public void setUploadNotifier(ProgressNotifier notifier) {
 		synchronization.setUploadNotifier(notifier);
 	}
-	
+
 	public void close() {
 		synchronization.close();
 	}
 
+	private void storeInputOutputDirectory() {
+		if (inputDirectory == null) {
+			useDemoData = true;
+			propertyHolder.setValue(JOB_USE_DEMO_DATA, "" + useDemoData);
+		} else {
+			storeDataDirectory(JOB_INPUT_DIRECTORY_PATH, inputDirectory);
+		}
+		storeDataDirectory(JOB_OUTPUT_DIRECTORY_PATH, outputDirectory);
+	}
+
+	private void storeDataDirectory(String directoryPropertyName, Path directory) {
+		if (!jobDir.equals(directory)) {
+			propertyHolder.setValue(directoryPropertyName, directory.toString());
+		}
+	}
+
+	private Path getDataDirectory(String typeOfDirectory, Path jobDirectory) {
+		String directory = propertyHolder.getValue(typeOfDirectory);
+		return directory != null ? Paths.get(directory) : jobDirectory;
+	}
+
 	private boolean getSafeBoolean(String value) {
 		return value != null ? Boolean.parseBoolean(value) : false;
 	}
 
-	private void setJobDirectory(Path jobDirectory) {
+	private void setJobDirectory(Path jobDirectory, Function<Path, Path> inputDirectoryProvider,
+			Function<Path, Path> outputDirectoryProvider) {
 		this.jobDir = jobDirectory;
+
 		try {
 			this.synchronization = new Synchronization(() -> startFileTransfer(HaaSClient.DUMMY_TRANSFER_FILE_PROGRESS),
-					jobDir, () -> {
+					jobDir, this.inputDirectory = inputDirectoryProvider.apply(jobDir),
+					this.outputDirectory = outputDirectoryProvider.apply(jobDir), () -> {
 						setProperty(JOB_NEEDS_UPLOAD, false);
 						setUploaded(true);
 					}, () -> {
@@ -396,14 +440,10 @@ public class Job {
 		}
 	}
 
-
-
-	private HaaSFileTransfer startFileTransfer( TransferFileProgress progress) {
+	private HaaSFileTransfer startFileTransfer(TransferFileProgress progress) {
 		return haasClientSupplier.get().startFileTransfer(getId(), progress);
 	}
 
-	
-
 	private void setName(String name) {
 		setProperty(JOB_NAME, name);
 	}
@@ -426,7 +466,7 @@ public class Job {
 	private static long getJobId(Path path) {
 		return Long.parseLong(path.getFileName().toString());
 	}
-	
+
 	private void setCanBeDownloaded(boolean b) {
 		setProperty(JOB_CAN_BE_DOWNLOADED, b);
 	}
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/JobManager.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/JobManager.java
index 6fa051107af09860f470925b192cb89feba77721..46f2d65f7099cf1e020de1bec579919ecebe4828 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/JobManager.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/JobManager.java
@@ -7,6 +7,7 @@ import java.nio.file.Path;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
+import java.util.function.Function;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -45,10 +46,12 @@ public class JobManager implements Closeable {
 		this.settings = settings;
 	}
 
-	public Job createJob() throws IOException {
+	public Job createJob(Function<Path, Path> inputDirectoryProvider, Function<Path, Path> outputDirectoryProvider)
+			throws IOException {
 		Job result;
 		initJobsIfNecessary();
-		jobs.add(result = new Job(remover, settings.getJobName(), workDirectory, this::getHaasClient));
+		jobs.add(result = new Job(remover, settings.getJobName(), workDirectory, this::getHaasClient,
+				inputDirectoryProvider, outputDirectoryProvider));
 		return result;
 	}
 
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/Synchronization.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/Synchronization.java
index 5e17ff9db7f13120247a1f4c460ca06886732abb..14c581b98ae17965e549280432393a7f03579982 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/Synchronization.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/Synchronization.java
@@ -6,12 +6,12 @@ import java.io.InterruptedIOException;
 import java.nio.file.DirectoryStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.nio.file.Paths;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.function.Function;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 import java.util.stream.StreamSupport;
@@ -24,20 +24,22 @@ import cz.it4i.fiji.haas_java_client.ProgressNotifier;
 import cz.it4i.fiji.haas_java_client.UploadingFile;
 import cz.it4i.fiji.haas_java_client.UploadingFileImpl;
 
-public class Synchronization implements Closeable{
+public class Synchronization implements Closeable {
 
 	public static final Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.data_transfer.Synchronization.class);
-	
+
 	private static final String FILE_INDEX_TO_UPLOAD_FILENAME = ".toUploadFiles";
-	
+
 	private static final String FILE_INDEX_TO_DOWNLOAD_FILENAME = ".toDownloadFiles";
-	
+
 	private static final String FILE_INDEX_DOWNLOADED_FILENAME = ".downloaded";
-	
+
 	private final Path workingDirectory;
-	
-	private final Function<String,Path> pathResolver;
-	
+
+	private final Path inputDirectory;
+
+	private final Path outputDirectory;
+
 	private final PersistentIndex<Path> filesDownloaded;
 
 	private final PersistentSynchronizationProcess<Path> uploadProcess;
@@ -45,14 +47,22 @@ public class Synchronization implements Closeable{
 	private final P_PersistentDownloadProcess downloadProcess;
 
 	private final ExecutorService service;
+
+//	public Synchronization(Supplier<HaaSFileTransfer> fileTransferSupplier, Path workingDirectory,
+//			Runnable uploadFinishedNotifier, Runnable downloadFinishedNotifier) throws IOException {
+//		this(fileTransferSupplier, workingDirectory, workingDirectory, workingDirectory, uploadFinishedNotifier,
+//				downloadFinishedNotifier);
+//	}
 	
-	public Synchronization(Supplier<HaaSFileTransfer> fileTransferSupplier, Path workingDirectory,
-			 Runnable uploadFinishedNotifier, Runnable downloadFinishedNotifier) throws IOException {
-		this.service = Executors.newFixedThreadPool(2);
+	public Synchronization(Supplier<HaaSFileTransfer> fileTransferSupplier, Path workingDirectory, Path inputDirectory,
+			Path outputDirectory, Runnable uploadFinishedNotifier, Runnable downloadFinishedNotifier)
+			throws IOException {
 		this.workingDirectory = workingDirectory;
-		this.pathResolver = name -> workingDirectory.resolve(name);
+		this.inputDirectory = inputDirectory;
+		this.outputDirectory = outputDirectory;
+		this.service = Executors.newFixedThreadPool(2);
 		this.filesDownloaded = new PersistentIndex<>(workingDirectory.resolve(FILE_INDEX_DOWNLOADED_FILENAME),
-				pathResolver);
+				name -> Paths.get(name));
 		this.uploadProcess = createUploadProcess(fileTransferSupplier, service, uploadFinishedNotifier);
 		this.downloadProcess = createDownloadProcess(fileTransferSupplier, service, downloadFinishedNotifier);
 	}
@@ -60,16 +70,16 @@ public class Synchronization implements Closeable{
 	public synchronized void setUploadNotifier(ProgressNotifier notifier) {
 		uploadProcess.setNotifier(notifier);
 	}
-	
+
 	public void setDownloadNotifier(ProgressNotifier notifier) {
 		downloadProcess.setNotifier(notifier);
-		
+
 	}
 
 	public synchronized void startUpload() throws IOException {
 		uploadProcess.start();
 	}
-	
+
 	public void stopUpload() throws IOException {
 		uploadProcess.stop();
 	}
@@ -77,16 +87,16 @@ public class Synchronization implements Closeable{
 	public void resumeUpload() {
 		uploadProcess.resume();
 	}
-	
+
 	public synchronized void startDownload(Collection<String> files) throws IOException {
 		this.downloadProcess.setItems(files);
 		this.downloadProcess.start();
 	}
-	
+
 	public synchronized void stopDownload() throws IOException {
 		this.downloadProcess.stop();
 	}
-	
+
 	public synchronized void resumeDownload() {
 		this.downloadProcess.resume();
 	}
@@ -99,23 +109,24 @@ public class Synchronization implements Closeable{
 	}
 
 	private boolean canUpload(Path file) {
-		
+
 		return !file.getFileName().toString().matches("[.][^.]+") && !filesDownloaded.contains(file);
 	}
 
 	private PersistentSynchronizationProcess<Path> createUploadProcess(Supplier<HaaSFileTransfer> fileTransferSupplier,
 			ExecutorService service, Runnable uploadFinishedNotifier) throws IOException {
 		return new PersistentSynchronizationProcess<Path>(service, fileTransferSupplier, uploadFinishedNotifier,
-				workingDirectory.resolve(FILE_INDEX_TO_UPLOAD_FILENAME), pathResolver) {
+				workingDirectory.resolve(FILE_INDEX_TO_UPLOAD_FILENAME), name -> inputDirectory.resolve(name)) {
 
 			@Override
 			protected Iterable<Path> getItems() throws IOException {
-				try(DirectoryStream<Path> ds = Files.newDirectoryStream(workingDirectory,Synchronization.this::canUpload)) {
-					return StreamSupport.stream(ds.spliterator(), false).collect(Collectors.toList()); 
+				try (DirectoryStream<Path> ds = Files.newDirectoryStream(inputDirectory,
+						Synchronization.this::canUpload)) {
+					return StreamSupport.stream(ds.spliterator(), false).collect(Collectors.toList());
 				}
-				
+
 			}
-	
+
 			@Override
 			protected void processItem(HaaSFileTransfer tr, Path p) throws InterruptedIOException {
 				UploadingFile uf = new UploadingFileImpl(p);
@@ -124,29 +135,28 @@ public class Synchronization implements Closeable{
 
 			@Override
 			protected long getTotalSize(Iterable<Path> items, HaaSFileTransfer tr) {
-				return StreamSupport.stream(items.spliterator(), false).map(p->{
+				return StreamSupport.stream(items.spliterator(), false).map(p -> {
 					try {
 						return Files.size(p);
 					} catch (IOException e) {
 						log.error(e.getMessage(), e);
-						return 0; 
+						return 0;
 					}
-				}).collect(Collectors.summingLong(val->val.longValue()));
+				}).collect(Collectors.summingLong(val -> val.longValue()));
 			}
 		};
 	}
 
-	private P_PersistentDownloadProcess createDownloadProcess(
-			Supplier<HaaSFileTransfer> fileTransferSupplier,  ExecutorService service,
-			Runnable uploadFinishedNotifier) throws IOException {
-		
+	private P_PersistentDownloadProcess createDownloadProcess(Supplier<HaaSFileTransfer> fileTransferSupplier,
+			ExecutorService service, Runnable uploadFinishedNotifier) throws IOException {
+
 		return new P_PersistentDownloadProcess(service, fileTransferSupplier, uploadFinishedNotifier);
 	}
-	
-	private class P_PersistentDownloadProcess extends PersistentSynchronizationProcess<String>{
+
+	private class P_PersistentDownloadProcess extends PersistentSynchronizationProcess<String> {
 
 		private Collection<String> items = Collections.emptyList();
-		
+
 		public P_PersistentDownloadProcess(ExecutorService service, Supplier<HaaSFileTransfer> fileTransferSupplier,
 				Runnable processFinishedNotifier) throws IOException {
 			super(service, fileTransferSupplier, processFinishedNotifier,
@@ -156,7 +166,7 @@ public class Synchronization implements Closeable{
 		private synchronized void setItems(Collection<String> items) {
 			this.items = new LinkedList<>(items);
 		}
-		
+
 		@Override
 		protected synchronized Iterable<String> getItems() throws IOException {
 			return items;
@@ -164,19 +174,20 @@ public class Synchronization implements Closeable{
 
 		@Override
 		protected void processItem(HaaSFileTransfer tr, String file) throws InterruptedIOException {
-			filesDownloaded.insert(workingDirectory.resolve(file));
+			filesDownloaded.insert(outputDirectory.resolve(file));
 			try {
 				filesDownloaded.storeToWorkingFile();
 			} catch (IOException e) {
 				log.error(e.getMessage(), e);
 			}
-			tr.download(file, workingDirectory);
+			tr.download(file, outputDirectory);
 		}
 
 		@Override
 		protected long getTotalSize(Iterable<String> items, HaaSFileTransfer tr) throws InterruptedIOException {
-			return tr.obtainSize( StreamSupport.stream(items.spliterator(), false).collect(Collectors.toList())).stream().collect(Collectors.summingLong(val->val));
+			return tr.obtainSize(StreamSupport.stream(items.spliterator(), false).collect(Collectors.toList())).stream()
+					.collect(Collectors.summingLong(val -> val));
 		}
-		
+
 	}
 }
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ObservableValueRegistry.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ObservableValueRegistry.java
index 54af7f42dc79c816fa6f4716f2e9c7fe2aae54be..e55921801fb2a36ca79c4e5e1723bc6df02f3317 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ObservableValueRegistry.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ObservableValueRegistry.java
@@ -30,16 +30,16 @@ public abstract class ObservableValueRegistry<K, V extends UpdatableObservableVa
 		};
 	}
 	
-	public V addIfAbsent(K key) {
+	public synchronized V addIfAbsent(K key) {
 		V uov = map.computeIfAbsent(key, k -> constructObservableValue(k));
 		return uov;
 	}
 	
-	public V get(K key) {
+	public synchronized V get(K key) {
 		return map.get(key);
 	}
 
-	public Collection<V> getAllItems() {
+	public synchronized Collection<V> getAllItems() {
 		return map.values().stream().map(val -> val).collect(Collectors.toList());
 	}
 	
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/BenchmarkJobManager.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/BenchmarkJobManager.java
index 83e26cf44be4662fd4cd8029f496a0b792ad4cd6..51fc01a75cc3a78b5aa363bc0b5cbfb6092d8b56 100644
--- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/BenchmarkJobManager.java
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/BenchmarkJobManager.java
@@ -28,6 +28,7 @@ import java.util.Map;
 import java.util.Scanner;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.Executor;
+import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -48,9 +49,8 @@ import cz.it4i.fiji.haas_java_client.SynchronizableFileType;
 import cz.it4i.fiji.haas_java_client.UploadingFile;
 import net.imagej.updater.util.Progress;
 
-public class BenchmarkJobManager implements Closeable{
+public class BenchmarkJobManager implements Closeable {
 
-	
 	private static Logger log = LoggerFactory
 			.getLogger(cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager.class);
 
@@ -59,7 +59,11 @@ public class BenchmarkJobManager implements Closeable{
 	public final class BenchmarkJob implements HaaSOutputHolder {
 
 		private final Job job;
-		
+
+		public boolean isUseDemoData() {
+			return job.isUseDemoData();
+		}
+
 		private final List<Task> tasks;
 		private final List<BenchmarkError> nonTaskSpecificErrors;
 		private final SPIMComputationAccessor computationAccessor;
@@ -84,14 +88,14 @@ public class BenchmarkJobManager implements Closeable{
 		}
 
 		public synchronized void startJob(Progress progress) throws IOException {
-			job.uploadFile(Constants.CONFIG_YAML,  new P_ProgressNotifierAdapter(progress));
+			job.uploadFile(Constants.CONFIG_YAML, new P_ProgressNotifierAdapter(progress));
 			String outputName = getOutputName(job.openLocalFile(Constants.CONFIG_YAML));
 			verifiedState = null;
 			verifiedStateProcessed = false;
 			running = null;
 			job.submit();
 			job.setProperty(SPIM_OUTPUT_FILENAME_PATTERN, outputName);
-		
+
 		}
 
 		public JobState getState() {
@@ -106,7 +110,6 @@ public class BenchmarkJobManager implements Closeable{
 			job.stopUploadData();
 		}
 
-		
 		public synchronized CompletableFuture<JobState> getStateAsync(Executor executor) {
 			if (running != null) {
 				return running;
@@ -121,12 +124,12 @@ public class BenchmarkJobManager implements Closeable{
 		public void startDownload() throws IOException {
 			if (job.getState() == JobState.Finished) {
 				String filePattern = job.getProperty(SPIM_OUTPUT_FILENAME_PATTERN);
-				job.startDownload(downloadFinishedData(filePattern) );
+				job.startDownload(downloadFinishedData(filePattern));
 			} else if (job.getState() == JobState.Failed || job.getState() == JobState.Canceled) {
 				job.startDownload(downloadFailedData());
 			}
 		}
-		
+
 		public boolean canBeDownloaded() {
 			return job.canBeDownloaded();
 		}
@@ -250,6 +253,7 @@ public class BenchmarkJobManager implements Closeable{
 		public boolean needsUpload() {
 			return job.needsUpload();
 		}
+		
 
 		@Override
 		public String toString() {
@@ -413,7 +417,8 @@ public class BenchmarkJobManager implements Closeable{
 		private SPIMComputationAccessor getComputationAccessor() {
 			SPIMComputationAccessor result = new SPIMComputationAccessor() {
 
-				private final HaaSOutputHolder outputOfSnakemake = new HaaSOutputHolderImpl(list -> job.getOutput(list));
+				private final HaaSOutputHolder outputOfSnakemake = new HaaSOutputHolderImpl(
+						list -> job.getOutput(list));
 
 				@Override
 				public List<String> getActualOutput(List<SynchronizableFileType> content) {
@@ -454,9 +459,12 @@ public class BenchmarkJobManager implements Closeable{
 		jobManager = new JobManager(params.workingDirectory(), constructSettingsFromParams(params));
 	}
 
-	public BenchmarkJob createJob() throws IOException {
-		Job job = jobManager.createJob();
-		job.storeDataInWorkdirectory(getUploadingFile());
+	public BenchmarkJob createJob(Function<Path, Path> inputDirectoryProvider,
+			Function<Path, Path> outputDirectoryProvider) throws IOException {
+		Job job = jobManager.createJob(inputDirectoryProvider, outputDirectoryProvider);
+		if (job.isUseDemoData()) {
+			job.storeDataInWorkdirectory(getConfigYamlFile());
+		}
 		return convertJob(job);
 	}
 
@@ -570,7 +578,7 @@ public class BenchmarkJobManager implements Closeable{
 		jobManager.close();
 	}
 
-	private UploadingFile getUploadingFile() {
+	private UploadingFile getConfigYamlFile() {
 		return new UploadingFileFromResource("", Constants.CONFIG_YAML);
 	}
 
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIMController.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIMController.java
index bda229a11188a8d8a4ee9e7efd5ff52259de970e..3aed3b9a2ca36f6ff7d58e7389a6f6690d8243ad 100644
--- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIMController.java
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIMController.java
@@ -3,6 +3,7 @@ package cz.it4i.fiji.haas_spim_benchmark.ui;
 import java.awt.Desktop;
 import java.awt.Window;
 import java.io.IOException;
+import java.nio.file.Path;
 import java.util.EnumSet;
 import java.util.HashSet;
 import java.util.LinkedList;
@@ -50,21 +51,21 @@ public class BenchmarkSPIMController extends BorderPane implements CloseableCont
 	private TableView<ObservableBenchmarkJob> jobs;
 
 	private final BenchmarkJobManager manager;
-	
+
 	private final ExecutorService executorServiceJobState = Executors.newWorkStealingPool();
-	
+
 	private final Executor executorServiceFX = new FXFrameExecutorService();
-	
+
 	private Window root;
 
 	private ExecutorService executorServiceUI;
-	
+
 	private ExecutorService executorServiceWS;
-	
+
 	private Timer timer;
-	
+
 	private ObservableBenchmarkJobRegistry registry;
-	
+
 	private static Logger log = LoggerFactory
 			.getLogger(cz.it4i.fiji.haas_spim_benchmark.ui.BenchmarkSPIMController.class);
 
@@ -102,7 +103,7 @@ public class BenchmarkSPIMController extends BorderPane implements CloseableCont
 
 	private void initMenu() {
 		TableViewContextMenu<ObservableBenchmarkJob> menu = new TableViewContextMenu<>(jobs);
-		menu.addItem("Create job", x -> executeWSCallAsync("Creating job", p -> manager.createJob()), j -> true);
+		menu.addItem("Create job", x -> askForCreateJob(), j -> true);
 		menu.addItem("Start job", job -> executeWSCallAsync("Starting job", p -> {
 			job.getValue().startJob(p);
 			job.getValue().update();
@@ -112,7 +113,8 @@ public class BenchmarkSPIMController extends BorderPane implements CloseableCont
 		menu.addItem("Cancel job", job -> executeWSCallAsync("Canceling job", p -> {
 			job.getValue().cancelJob();
 			job.getValue().update();
-		}), job -> JavaFXRoutines.notNullValue(job, j -> j.getState() == JobState.Running || j.getState() == JobState.Queued ));
+		}), job -> JavaFXRoutines.notNullValue(job,
+				j -> j.getState() == JobState.Running || j.getState() == JobState.Queued));
 
 		menu.addItem("Execution details", job -> {
 			try {
@@ -127,15 +129,15 @@ public class BenchmarkSPIMController extends BorderPane implements CloseableCont
 		menu.addItem("Upload data", job -> executeWSCallAsync("Uploading data", p -> job.getValue().startUpload()),
 				job -> executeWSCallAsync("Stop uploading data", p -> job.getValue().stopUpload()),
 				job -> JavaFXRoutines.notNullValue(job,
-						j -> !EnumSet.of(JobState.Running, JobState.Disposed).contains(j.getState())),
+						j -> !j.isUseDemoData() && !EnumSet.of(JobState.Running, JobState.Disposed).contains(j.getState())),
 				job -> job.getUploadProgress().isWorking());
-		
 		menu.addItem("Download result",
 				job -> executeWSCallAsync("Downloading data", p -> job.getValue().startDownload()),
 				job -> executeWSCallAsync("Stop downloading data", p -> job.getValue().stopDownload()),
-				job -> JavaFXRoutines.notNullValue(job,
-						j -> EnumSet.of(JobState.Failed, JobState.Finished, JobState.Canceled).contains(j.getState())
-								&& j.canBeDownloaded()),
+				job -> JavaFXRoutines
+						.notNullValue(job,
+								j -> EnumSet.of(JobState.Failed, JobState.Finished, JobState.Canceled)
+										.contains(j.getState()) && j.canBeDownloaded()),
 				job -> job.getDownloadProgress().isWorking());
 
 		menu.addItem("Download statistics",
@@ -155,6 +157,24 @@ public class BenchmarkSPIMController extends BorderPane implements CloseableCont
 		registry.update();
 	}
 
+	private void askForCreateJob() {
+		NewJobWindow newJobWindow = new NewJobWindow(null);
+		ModalDialogs.doModal(newJobWindow, WindowConstants.DISPOSE_ON_CLOSE);
+		newJobWindow.setCreatePressedNotifier(() -> executeWSCallAsync("Creating job", false,p -> doCreateJob(wd -> newJobWindow.getInputDirectory(wd), wd -> newJobWindow.getOutputDirectory(wd))));
+
+	}
+
+	private void doCreateJob(Function<Path,Path> inputProvider, Function<Path,Path> outputProvider) throws IOException {
+		BenchmarkJob bj = manager.createJob(inputProvider, outputProvider);
+		ObservableBenchmarkJob obj = registry.addIfAbsent(bj);
+		addJobToItems(obj);
+		jobs.refresh();
+	}
+
+	private synchronized void addJobToItems(ObservableBenchmarkJob obj) {
+		jobs.getItems().add(obj);
+	}
+
 	private void open(BenchmarkJob j) {
 		executorServiceUI.execute(() -> {
 			Desktop desktop = Desktop.getDesktop();
@@ -181,8 +201,9 @@ public class BenchmarkSPIMController extends BorderPane implements CloseableCont
 			}
 			return null;
 		}, x -> {
-			if (update)
+			if (update) {
 				updateJobs();
+			}
 		});
 	}
 
@@ -208,11 +229,11 @@ public class BenchmarkSPIMController extends BorderPane implements CloseableCont
 				}
 				registry.update();
 				Set<ObservableValue<BenchmarkJob>> actual = new HashSet<>(this.jobs.getItems());
-				
+
 				executorServiceFX.execute(() -> {
 					for (ObservableBenchmarkJob value : registry.getAllItems()) {
 						if (!actual.contains(value)) {
-							this.jobs.getItems().add(value);
+							addJobToItems(value);
 						}
 					}
 				});
@@ -258,12 +279,10 @@ public class BenchmarkSPIMController extends BorderPane implements CloseableCont
 	@SuppressWarnings("unchecked")
 	private void setCellValueFactoryCompletable(int index, Function<BenchmarkJob, CompletableFuture<String>> mapper) {
 		JavaFXRoutines.setCellValueFactory(jobs, index, mapper);
-		((TableColumn<ObservableBenchmarkJob, CompletableFuture<String>>) jobs.getColumns().get(index))
-				.setCellFactory(
-						column -> new JavaFXRoutines.TableCellAdapter<ObservableBenchmarkJob, CompletableFuture<String>>(
-								new JavaFXRoutines.FutureValueUpdater<ObservableBenchmarkJob, String, CompletableFuture<String>>(
-										new JavaFXRoutines.StringValueUpdater<ObservableBenchmarkJob>(),
-										executorServiceFX)));
+		((TableColumn<ObservableBenchmarkJob, CompletableFuture<String>>) jobs.getColumns().get(index)).setCellFactory(
+				column -> new JavaFXRoutines.TableCellAdapter<ObservableBenchmarkJob, CompletableFuture<String>>(
+						new JavaFXRoutines.FutureValueUpdater<ObservableBenchmarkJob, String, CompletableFuture<String>>(
+								new JavaFXRoutines.StringValueUpdater<ObservableBenchmarkJob>(), executorServiceFX)));
 	}
 
 	private interface P_JobAction {
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/NewJobController.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/NewJobController.java
new file mode 100644
index 0000000000000000000000000000000000000000..f896bbbe7ce3ffe19bcfb074724a3269e1c70e38
--- /dev/null
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/NewJobController.java
@@ -0,0 +1,183 @@
+package cz.it4i.fiji.haas_spim_benchmark.ui;
+
+import java.awt.Window;
+import java.io.File;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import cz.it4i.fiji.haas.ui.CloseableControl;
+import cz.it4i.fiji.haas.ui.FXFrame;
+import cz.it4i.fiji.haas.ui.InitiableControl;
+import cz.it4i.fiji.haas.ui.JavaFXRoutines;
+import javafx.beans.value.ObservableValue;
+import javafx.fxml.FXML;
+import javafx.scene.Parent;
+import javafx.scene.control.Alert;
+import javafx.scene.control.Alert.AlertType;
+import javafx.scene.control.Button;
+import javafx.scene.control.RadioButton;
+import javafx.scene.control.TextField;
+import javafx.scene.control.Toggle;
+import javafx.scene.control.ToggleGroup;
+import javafx.scene.layout.BorderPane;
+import javafx.stage.DirectoryChooser;
+
+public class NewJobController extends BorderPane implements CloseableControl, InitiableControl {
+
+	public enum DataLocation {
+		DEMONSTRATION_ON_SERVER, WORK_DIRECTORY, CUSTOM_DIRECTORY
+	}
+
+	private static final Runnable EMPTY_NOTIFIER = () -> {
+	};
+
+	@SuppressWarnings("unused")
+	private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas_spim_benchmark.ui.NewJobController.class);
+
+	@FXML
+	private Button bt_create;
+
+	@FXML
+	private ToggleGroup tg_inputDataLocation;
+
+	@FXML
+	private ToggleGroup tg_outputDataLocation;
+
+	@FXML
+	private RadioButton rb_ownInput;
+
+	@FXML
+	private RadioButton rb_ownOutput;
+
+	@FXML
+	private TextField et_inputDirectory;
+
+	@FXML
+	private TextField et_outputDirectory;
+
+	private DataLocation inputDataLocation;
+
+	private DataLocation outputDataLocation;
+
+	private FXFrame<?> ownerWindow;
+
+	private Runnable createPressedNotifier;
+
+	@FXML
+	private Button bt_selectInput;
+
+	@FXML
+	private Button bt_selectOutput;
+	
+	public NewJobController() {
+		JavaFXRoutines.initRootAndController("NewJobView.fxml", this);
+		getStylesheets().add(getClass().getResource("NewJobView.css").toExternalForm());
+		bt_create.setOnMouseClicked(X -> createPressed());
+		tg_inputDataLocation.selectedToggleProperty().addListener((v, old, n) -> selected(v, old, n, rb_ownInput));
+		tg_outputDataLocation.selectedToggleProperty().addListener((v, o, n) -> selected(v, o, n, rb_ownOutput));
+		initSelectButton(et_inputDirectory, bt_selectInput);
+		initSelectButton(et_outputDirectory, bt_selectOutput);
+	}
+
+	@Override
+	public void close() {
+	}
+
+	@Override
+	public void init(Window parameter) {
+		ownerWindow = (FXFrame<?>) parameter;
+	}
+
+	public Path getInputDirectory(Path workingDirectory) {
+		return getDirectory(inputDataLocation, et_inputDirectory.getText(), workingDirectory);
+	}
+
+	public Path getOutputDirectory(Path workingDirectory) {
+		return getDirectory(outputDataLocation, et_outputDirectory.getText(), workingDirectory);
+	}
+
+	public void setCreatePressedNotifier(Runnable createPressedNotifier) {
+		if (createPressedNotifier != null) {
+			this.createPressedNotifier = createPressedNotifier;
+		} else {
+			this.createPressedNotifier = EMPTY_NOTIFIER;
+		}
+	}
+
+	private void initSelectButton(TextField textField, Button button) {
+		button.setOnAction(x -> {
+			Path p = Paths.get(textField.getText());
+			DirectoryChooser dch = new DirectoryChooser();
+			if (Files.exists(p)) {
+				dch.setInitialDirectory(p.toAbsolutePath().toFile());
+			}
+			File result = dch.showDialog(ownerWindow.getFxPanel().getScene().getWindow());
+			if (result != null) {
+				textField.setText(result.toString());
+			}
+		});
+	}
+
+	private Path getDirectory(DataLocation dataLocation, String selectedDirectory, Path workingDirectory) {
+		switch (dataLocation) {
+		case DEMONSTRATION_ON_SERVER:
+			return null;
+		case WORK_DIRECTORY:
+			return workingDirectory;
+		case CUSTOM_DIRECTORY:
+			return Paths.get(selectedDirectory).toAbsolutePath();
+		default:
+			throw new UnsupportedOperationException("Not support " + dataLocation);
+		}
+	}
+
+	private void createPressed() {
+		obtainValues();
+		if (checkDirectoryLocationIfNeeded()) {
+			ownerWindow.setVisible(false);
+			ownerWindow.dispose();
+			createPressedNotifier.run();
+		}
+	}
+
+	private boolean checkDirectoryLocationIfNeeded() {
+		return checkDataLocationValue(inputDataLocation, et_inputDirectory.getText(), "input")
+				&& checkDataLocationValue(outputDataLocation, et_outputDirectory.getText(), "output");
+
+	}
+
+	private boolean checkDataLocationValue(DataLocation dataLocation, String directory, String type) {
+		Path directoryPath = Paths.get(directory);
+		if (dataLocation == DataLocation.CUSTOM_DIRECTORY && (!Files.exists(directoryPath) || directory.isEmpty())) {
+			Alert alert = new Alert(AlertType.WARNING);
+			alert.setTitle("Invalid input provided");
+			alert.setHeaderText(null);
+			String message = !directory.isEmpty() ? "Directory %s for %s not exists"
+					: "Directory for %2$s is not selected.";
+			alert.setContentText(String.format(message, directoryPath.toAbsolutePath(), type));
+			alert.showAndWait();
+			return false;
+		}
+		return true;
+	}
+
+	private void obtainValues() {
+		inputDataLocation = obtainDataLocation(tg_inputDataLocation);
+		outputDataLocation = obtainDataLocation(tg_outputDataLocation);
+	}
+
+	private DataLocation obtainDataLocation(ToggleGroup group) {
+		int backawardOrderOfSelected = group.getToggles().size()
+				- group.getToggles().indexOf(group.getSelectedToggle());
+		return DataLocation.values()[DataLocation.values().length - backawardOrderOfSelected];
+	}
+
+	private void selected(ObservableValue<? extends Toggle> v, Toggle o, Toggle n, Parent disableIfNotSelected) {
+		disableIfNotSelected.getChildrenUnmodifiable().forEach(node -> node.setDisable(n != disableIfNotSelected));
+	}
+
+}
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/NewJobWindow.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/NewJobWindow.java
new file mode 100644
index 0000000000000000000000000000000000000000..7d62083e06f1ff9712c663c13e2f1a9098805f64
--- /dev/null
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/NewJobWindow.java
@@ -0,0 +1,34 @@
+package cz.it4i.fiji.haas_spim_benchmark.ui;
+
+import java.awt.Window;
+import java.nio.file.Path;
+
+import cz.it4i.fiji.haas.ui.FXFrame;
+
+public class NewJobWindow extends FXFrame<NewJobController>{
+
+	private static final long serialVersionUID = 1L;
+	
+
+	
+	public NewJobWindow(Window parentWindow) {
+		super(parentWindow,()->{
+			return new NewJobController();
+			
+		});
+		setTitle("Create job");
+	}
+	
+	public Path getInputDirectory(Path workingDirectory) {
+		return getFxPanel().getControl().getInputDirectory(workingDirectory);
+	}
+	
+	public Path getOutputDirectory(Path workingDirectory) {
+		return getFxPanel().getControl().getOutputDirectory(workingDirectory);
+	}
+
+
+	public void setCreatePressedNotifier(Runnable runnable) {
+		getFxPanel().getControl().setCreatePressedNotifier(runnable);
+	}
+}
\ No newline at end of file
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIM.fxml b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIM.fxml
similarity index 100%
rename from haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIM.fxml
rename to haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIM.fxml
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/JobDetail.fxml b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/JobDetail.fxml
similarity index 100%
rename from haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/JobDetail.fxml
rename to haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/JobDetail.fxml
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/LogView.fxml b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/LogView.fxml
similarity index 100%
rename from haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/LogView.fxml
rename to haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/LogView.fxml
diff --git a/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/NewJobView.css b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/NewJobView.css
new file mode 100644
index 0000000000000000000000000000000000000000..65d090c4224334c3948f7fa8749306f4dbf5fc8d
--- /dev/null
+++ b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/NewJobView.css
@@ -0,0 +1,4 @@
+{
+	-fx-padding: 3 3 3 3;
+	
+}
\ No newline at end of file
diff --git a/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/NewJobView.fxml b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/NewJobView.fxml
new file mode 100644
index 0000000000000000000000000000000000000000..344e6488da521cba151f50e777b62333b2890d88
--- /dev/null
+++ b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/NewJobView.fxml
@@ -0,0 +1,105 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import javafx.geometry.Insets?>
+<?import javafx.scene.control.Button?>
+<?import javafx.scene.control.Label?>
+<?import javafx.scene.control.RadioButton?>
+<?import javafx.scene.control.TextField?>
+<?import javafx.scene.control.TitledPane?>
+<?import javafx.scene.control.ToggleGroup?>
+<?import javafx.scene.layout.AnchorPane?>
+<?import javafx.scene.layout.BorderPane?>
+<?import javafx.scene.layout.HBox?>
+<?import javafx.scene.layout.VBox?>
+
+<fx:root maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" type="BorderPane" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="cz.it4i.fiji.haas_spim_benchmark.ui.NewJobController">
+   <center>
+      <VBox BorderPane.alignment="CENTER">
+         <children>
+            <TitledPane animated="false" collapsible="false" text="Input">
+               <content>
+                  <AnchorPane>
+                     <children>
+                        <VBox>
+                           <children>
+                              <RadioButton mnemonicParsing="false" selected="true">
+                                 <toggleGroup>
+                                    <ToggleGroup fx:id="tg_inputDataLocation" />
+                                 </toggleGroup>
+                                 <graphic>
+                                    <Label maxHeight="1.7976931348623157E308" text="Demonstration data on IT4I cluster" />
+                                 </graphic>
+                              </RadioButton>
+                              <RadioButton maxHeight="1.7976931348623157E308" mnemonicParsing="false" toggleGroup="$tg_inputDataLocation">
+                                 <graphic>
+                                    <Label maxHeight="1.7976931348623157E308" text="Job subdirectory" />
+                                 </graphic>
+                              </RadioButton>
+                              <RadioButton fx:id="rb_ownInput" mnemonicParsing="false" toggleGroup="$tg_inputDataLocation">
+                                 <graphic>
+                                    <HBox disable="true">
+                                       <children>
+                                          <TextField fx:id="et_inputDirectory" prefWidth="350.0" />
+                                          <Button fx:id="bt_selectInput" mnemonicParsing="false" text="Select" />
+                                       </children>
+                                    </HBox>
+                                 </graphic>
+                              </RadioButton>
+                           </children>
+                        </VBox>
+                     </children>
+                  </AnchorPane>
+               </content>
+            </TitledPane>
+            <TitledPane animated="false" collapsible="false" text="Output">
+               <content>
+                  <AnchorPane minHeight="0.0" minWidth="0.0">
+                     <children>
+                        <VBox>
+                           <children>
+                              <HBox>
+                                 <children>
+                                    <RadioButton maxHeight="1.7976931348623157E308" mnemonicParsing="false" selected="true">
+                                       <toggleGroup>
+                                          <ToggleGroup fx:id="tg_outputDataLocation" />
+                                       </toggleGroup>
+                                       <graphic>
+                                          <Label maxHeight="1.7976931348623157E308" text="Job subdirectory" />
+                                       </graphic>
+                                    </RadioButton>
+                                 </children>
+                              </HBox>
+                              <HBox>
+                                 <children>
+                                    <RadioButton fx:id="rb_ownOutput" mnemonicParsing="false" toggleGroup="$tg_outputDataLocation">
+                                       <graphic>
+                                          <HBox disable="true">
+                                             <children>
+                                                <TextField fx:id="et_outputDirectory" prefWidth="350.0" />
+                                                <Button fx:id="bt_selectOutput" mnemonicParsing="false" text="Select" />
+                                             </children>
+                                          </HBox>
+                                       </graphic>
+                                    </RadioButton>
+                                 </children>
+                              </HBox>
+                           </children>
+                        </VBox>
+                     </children>
+                  </AnchorPane>
+               </content>
+            </TitledPane>
+         </children>
+      </VBox>
+   </center>
+   <bottom>
+      <BorderPane BorderPane.alignment="CENTER">
+         <right>
+            <Button fx:id="bt_create" mnemonicParsing="false" prefHeight="22.0" prefWidth="71.0" text="Create" BorderPane.alignment="CENTER">
+               <BorderPane.margin>
+                  <Insets right="3.0" />
+               </BorderPane.margin></Button>
+         </right>
+      </BorderPane>
+   </bottom>
+</fx:root>
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/RemoteFilesInfo.fxml b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/RemoteFilesInfo.fxml
similarity index 100%
rename from haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/RemoteFilesInfo.fxml
rename to haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/RemoteFilesInfo.fxml
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/SPIMPipelineProgressView.fxml b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/SPIMPipelineProgressView.fxml
similarity index 100%
rename from haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/SPIMPipelineProgressView.fxml
rename to haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/SPIMPipelineProgressView.fxml
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/TaskComputationView.fxml b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/TaskComputationView.fxml
similarity index 100%
rename from haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/TaskComputationView.fxml
rename to haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/TaskComputationView.fxml
diff --git a/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/package-info.java b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..6dfa85ade2c7142fecfd098fd7beb11247a7b690
--- /dev/null
+++ b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/package-info.java
@@ -0,0 +1,8 @@
+/**
+ * 
+ */
+/**
+ * @author koz01
+ *
+ */
+package cz.it4i.fiji.haas_spim_benchmark.ui;
\ No newline at end of file
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/style.css b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/style.css
similarity index 100%
rename from haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/style.css
rename to haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/style.css
diff --git a/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/NewJobWindowShow.java b/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/NewJobWindowShow.java
new file mode 100644
index 0000000000000000000000000000000000000000..525b110ddbb9e0078993902b8c67bbb0e88cf03e
--- /dev/null
+++ b/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/NewJobWindowShow.java
@@ -0,0 +1,11 @@
+package cz.it4i.fiji.haas;
+
+import java.io.IOException;
+
+import cz.it4i.fiji.haas_spim_benchmark.ui.NewJobWindow;
+
+public class NewJobWindowShow {
+	public static void main(String[] args) throws IOException {
+		new NewJobWindow(null).setVisible(true);
+	}
+}
diff --git a/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/RunBenchmark.java b/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/RunBenchmark.java
index 6a5fbd4be91416c77fad569cb74753ad4a8ded8d..42c914a7275466e6ab55db05f3571db0e33fc608 100644
--- a/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/RunBenchmark.java
+++ b/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/RunBenchmark.java
@@ -20,7 +20,7 @@ public class RunBenchmark {
 	public static class CreateJob {
 		public static void main(String[] args) throws IOException {
 			BenchmarkJobManager benchmarkJobManager = new BenchmarkJobManager(getBenchmarkSPIMParameters());
-			BenchmarkJob ji = benchmarkJobManager.createJob();
+			BenchmarkJob ji = benchmarkJobManager.createJob(jd -> jd, jd -> jd);
 			log.info("job: " + ji.getId() + " created.");
 		}
 	}
@@ -42,8 +42,6 @@ public class RunBenchmark {
 		}
 	}
 
-	
-
 	private static BenchmarkSPIMParameters getBenchmarkSPIMParameters() throws IOException {
 		Path p = Paths.get("/tmp/benchmark");
 		if (!Files.exists(p)) {