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 0e92fe7ac30f71375f580d7eb682609c0310c744..38058e58e35ac021ab6a459c5344e9e21b53e7c3 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
@@ -9,6 +9,7 @@ import java.nio.file.StandardOpenOption;
 import java.util.Calendar;
 import java.util.Collections;
 import java.util.EnumSet;
+import java.util.List;
 import java.util.Properties;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
@@ -49,73 +50,47 @@ public class Job {
 	private Boolean needsDownload;
 	private JobInfo jobInfo;
 	private Long jobId;
-	private ProgressNotifier notifier;
+	
 
-	final private Progress dummy = new Progress() {
-
-		@Override
-		public void setTitle(String title) {
-		}
-
-		@Override
-		public void setItemCount(int count, int total) {
-		}
-
-		@Override
-		public void setCount(int count, int total) {
-		}
-
-		@Override
-		public void itemDone(Object item) {
-		}
-
-		@Override
-		public void done() {
-		}
-
-		@Override
-		public void addItem(Object item) {
-		}
-	};
 
 	private String name;
 
-	public Job(String name, Path basePath, Supplier<HaaSClient> haasClientSupplier, Progress progress)
+	public Job(String name, Path basePath, Supplier<HaaSClient> haasClientSupplier)
 			throws IOException {
-		this(haasClientSupplier, progress);
+		this(haasClientSupplier);
 		HaaSClient client = this.haasClientSupplier.get();
-		long id = client.createJob(name, Collections.emptyList(), notifier);
+		long id = client.createJob(name, Collections.emptyList());
 		jobDir = basePath.resolve("" + id);
 		this.name = name;
 		Files.createDirectory(jobDir);
-		updateState();
+		updateNeedsDownload();
 	}
 
-	public Job(Path p, Supplier<HaaSClient> haasClientSupplier, Progress progress) throws IOException {
-		this(haasClientSupplier, progress);
+	public Job(Path p, Supplier<HaaSClient> haasClientSupplier) throws IOException {
+		this(haasClientSupplier);
 		jobDir = p;
 		loadJobInfo();
-		updateState();
+		updateNeedsDownload();
 	}
 
-	public void uploadFiles(Iterable<UploadingFile> files) {
+	public void uploadFiles(Iterable<UploadingFile> files, Progress notifier) {
 		HaaSClient client = this.haasClientSupplier.get();
-		client.uploadFiles(jobId, files, notifier);
+
+		client.uploadFiles(jobId, files, new P_ProgressNotifierAdapter(notifier));
 	}
 
-	public void uploadFilesByName(Iterable<String> files) {
+	public void uploadFilesByName(Iterable<String> files, Progress notifier) {
 		Iterable<UploadingFile> uploadingFiles = StreamSupport.stream(files.spliterator(), false)
 				.map((String name) -> HaaSClient.getUploadingFile(jobDir.resolve(name))).collect(Collectors.toList());
-		uploadFiles(uploadingFiles);
+		uploadFiles(uploadingFiles, notifier);
 	}
 
 	public void submit() {
 		HaaSClient client = this.haasClientSupplier.get();
-		client.submitJob(jobId, notifier);
+		client.submitJob(jobId);
 	}
 
-	private Job(Supplier<HaaSClient> haasClientSupplier, Progress progress) throws IOException {
-		notifier = new P_ProgressNotifierAdapter(progress);
+	private Job(Supplier<HaaSClient> haasClientSupplier) throws IOException {
 		this.haasClientSupplier = haasClientSupplier;
 	}
 
@@ -130,16 +105,10 @@ public class Job {
 		return jobId;
 	}
 
-	synchronized public void updateState() throws IOException {
-		if (needsDownload == null
-				&& EnumSet.of(JobState.Failed, JobState.Finished, JobState.Canceled).contains(getState())) {
-			needsDownload = true;
-		}
-		saveJobinfo();
-	}
+	
 
-	public void download() {
-		download(x -> true, dummy);
+	public void download(Progress notifier) {
+		download(x -> true, notifier);
 	}
 
 	public Path storeDataInWorkdirectory(UploadingFile uploadingFile) throws IOException {
@@ -150,11 +119,11 @@ public class Job {
 		return result;
 	}
 
-	synchronized public void download(Predicate<String> predicate, Progress progress) {
+	synchronized public void download(Predicate<String> predicate, Progress notifier) {
 		if (!needsDownload()) {
 			throw new IllegalStateException("Job: " + getJobId() + " doesn't need download");
 		}
-		haasClientSupplier.get().download(getJobId(), jobDir, predicate, new P_ProgressNotifierAdapter(progress));
+		haasClientSupplier.get().download(getJobId(), jobDir, predicate, new P_ProgressNotifierAdapter(notifier));
 		needsDownload = false;
 		try {
 			saveJobinfo();
@@ -179,7 +148,7 @@ public class Job {
 		return jobInfo.getEndTime();
 	}
 
-	public Iterable<String> getOutput(Iterable<JobSynchronizableFile> output) {
+	public List<String> getOutput(Iterable<JobSynchronizableFile> output) {
 		HaaSClient.SynchronizableFiles taskFileOffset = new HaaSClient.SynchronizableFiles();
 		long taskId = (Long) getJobInfo().getTasks().toArray()[0];
 		output.forEach(file -> taskFileOffset.addFile(taskId, file.getType(), file.getOffset()));
@@ -200,6 +169,22 @@ public class Job {
 	public String getProperty(String name) throws IOException {
 		return loadPropertiesIfExists().getProperty(name);
 	}
+	
+	public void updateInfo() {
+		updateJobInfo();
+	}
+	
+	public Path getDirectory() {
+		return jobDir;
+	}
+
+	synchronized private void updateNeedsDownload() throws IOException {
+		if (needsDownload == null
+				&& EnumSet.of(JobState.Failed, JobState.Finished, JobState.Canceled).contains(getState())) {
+			needsDownload = true;
+		}
+		saveJobinfo();
+	}
 
 	private synchronized void saveJobinfo() throws IOException {
 		Properties prop = loadPropertiesIfExists();
@@ -244,6 +229,11 @@ public class Job {
 
 	private void updateJobInfo() {
 		jobInfo = haasClientSupplier.get().obtainJobInfo(getJobId());
+		try {
+			updateNeedsDownload();
+		} catch (IOException e) {
+			log.error(e.getMessage(), e);
+		}
 	}
 
 	private static boolean isValidPath(Path path) {
@@ -294,4 +284,6 @@ public class Job {
 
 	}
 
+	
+
 }
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 062f69260d4465940cce5e7d3599ddbfdaa64654..2b5d9913c8a98eb12aea9c969e014629b4c3eda5 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
@@ -8,6 +8,7 @@ import java.util.Calendar;
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
@@ -24,6 +25,7 @@ import net.imagej.updater.util.Progress;
 
 public class JobManager {
 
+	@SuppressWarnings("unused")
 	private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.JobManager.class);
 
 	private Path workDirectory;
@@ -34,33 +36,29 @@ public class JobManager {
 
 	private Settings settings;
 
-	public JobManager(Path workDirectory, Settings settings){
+	public JobManager(Path workDirectory, Settings settings) {
 		this.workDirectory = workDirectory;
 		this.settings = settings;
 	}
 
-	public JobInfo createJob(Progress progress) throws IOException {
+	public JobInfo createJob() throws IOException {
 		Job job;
-		if(jobs == null) {
+		if (jobs == null) {
 			jobs = new LinkedList<>();
 		}
-		jobs.add(job = new Job(settings.getJobName(), workDirectory, this::getHaasClient, progress));
+		jobs.add(job = new Job(settings.getJobName(), workDirectory, this::getHaasClient));
 		return new JobInfo(job) {
 			@Override
 			public JobState getState() {
-				try {
-					job.updateState();
-				} catch (IOException e) {
-					log.error(e.getMessage(), e);
-				}
+				job.updateInfo();
 				return super.getState();
 			}
 		};
 	}
 
-	public JobInfo startJob(Iterable<UploadingFile> files, Progress progress) throws IOException {
-		JobInfo result = createJob(progress);
-		result.uploadFiles(files);
+	public JobInfo startJob(Iterable<UploadingFile> files, Progress notifier) throws IOException {
+		JobInfo result = createJob();
+		result.uploadFiles(files, notifier);
 		result.submit();
 		return result;
 	}
@@ -69,12 +67,12 @@ public class JobManager {
 		return () -> jobs.stream().filter(j -> j.needsDownload()).map(j -> new JobInfo(j)).iterator();
 	}
 
-	public Collection<JobInfo> getJobs(Progress progress) throws IOException {
-		if(jobs == null) {
+	public Collection<JobInfo> getJobs() throws IOException {
+		if (jobs == null) {
 			jobs = new LinkedList<>();
 			Files.list(this.workDirectory).filter(p -> Files.isDirectory(p) && Job.isJobPath(p)).forEach(p -> {
 				try {
-					jobs.add(new Job(p, this::getHaasClient, progress));
+					jobs.add(new Job(p, this::getHaasClient));
 				} catch (IOException e) {
 					e.printStackTrace();
 				}
@@ -83,10 +81,10 @@ public class JobManager {
 		return jobs.stream().map(j -> new JobInfo(j)).collect(Collectors.toList());
 	}
 
-	public void downloadJob(Long id) {
+	public void downloadJob(Long id, Progress notifier) {
 		Iterator<Job> job = jobs.stream().filter(j -> j.getJobId() == id).iterator();
 		assert job.hasNext();
-		job.next().download();
+		job.next().download(notifier);
 
 	}
 
@@ -100,18 +98,21 @@ public class JobManager {
 		}
 		return haasClient;
 	}
-	
+
 	public static class JobSynchronizableFile {
 		private SynchronizableFileType type;
 		private long offset;
+
 		public JobSynchronizableFile(SynchronizableFileType type, long offset) {
 			super();
 			this.type = type;
 			this.offset = offset;
 		}
+
 		public SynchronizableFileType getType() {
 			return type;
 		}
+
 		public long getOffset() {
 			return offset;
 		}
@@ -125,12 +126,12 @@ public class JobManager {
 			this.job = job;
 		}
 
-		public void uploadFiles(Iterable<UploadingFile> files) {
-			job.uploadFiles(files);
+		public void uploadFiles(Iterable<UploadingFile> files, Progress notifier) {
+			job.uploadFiles(files,notifier);
 		}
-		
-		public void uploadFilesByName(Iterable<String> files) {
-			job.uploadFilesByName(files);
+
+		public void uploadFilesByName(Iterable<String> files, Progress notifier) {
+			job.uploadFilesByName(files, notifier);
 		}
 
 		public void submit() {
@@ -161,14 +162,14 @@ public class JobManager {
 			return getStringFromTimeSafely(job.getEndTime());
 		}
 
-		public void downloadData(Progress progress) {
-			downloadData(x->true, progress);
+		public void downloadData(Progress notifier) {
+			downloadData(x -> true, notifier);
 		}
-		
-		public void downloadData(Predicate<String> predicate, Progress progress) {
-			job.download(predicate,progress);
+
+		public void downloadData(Predicate<String> predicate, Progress notifier) {
+			job.download(predicate, notifier);
 			fireValueChangedEvent();
-			
+
 		}
 
 		public void waitForStart() {
@@ -176,8 +177,8 @@ public class JobManager {
 
 		}
 
-		public void updateInfo() throws IOException {
-			job.updateState();
+		public void updateInfo() {
+			job.updateInfo();
 		}
 
 		@Override
@@ -188,11 +189,11 @@ public class JobManager {
 		public Path storeDataInWorkdirectory(UploadingFile uploadingFile) throws IOException {
 			return job.storeDataInWorkdirectory(uploadingFile);
 		}
-		
-		public Iterable<String> getOutput(Iterable<JobSynchronizableFile> files) {
+
+		public List<String> getOutput(Iterable<JobSynchronizableFile> files) {
 			return job.getOutput(files);
 		}
-		
+
 		private String getStringFromTimeSafely(Calendar time) {
 			return time != null ? time.getTime().toString() : "N/A";
 		}
@@ -203,15 +204,16 @@ public class JobManager {
 
 		public void setProperty(String name, String value) throws IOException {
 			job.setProperty(name, value);
-			
+
 		}
 
 		public String getProperty(String name) throws IOException {
 			return job.getProperty(name);
 		}
 
-		
-		
+		public Path getDirectory() {
+			return job.getDirectory();
+		}
 
 	}
 
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/DummyProgress.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/DummyProgress.java
new file mode 100644
index 0000000000000000000000000000000000000000..d91a0beb69b97af2c4dbe4c9aa8ee3dd5a74991e
--- /dev/null
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/DummyProgress.java
@@ -0,0 +1,37 @@
+package cz.it4i.fiji.haas.ui;
+
+import net.imagej.updater.util.Progress;
+
+public class DummyProgress implements Progress {
+
+	@Override
+	public void setTitle(String title) {
+
+	}
+
+	@Override
+	public void setCount(int count, int total) {
+
+	}
+
+	@Override
+	public void addItem(Object item) {
+
+	}
+
+	@Override
+	public void setItemCount(int count, int total) {
+
+	}
+
+	@Override
+	public void itemDone(Object item) {
+
+	}
+
+	@Override
+	public void done() {
+
+	}
+
+}
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/FXFrame.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/FXFrame.java
index f3601be3950eeea7c3e7bd1d741b731bb988bd75..d52a841d02d62a04709a509316187212a1faddab 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/FXFrame.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/FXFrame.java
@@ -3,21 +3,35 @@ package cz.it4i.fiji.haas.ui;
 import java.awt.Dimension;
 import java.awt.Frame;
 import java.awt.Window;
+import java.awt.im.InputMethodRequests;
 import java.io.IOException;
 import java.net.URL;
 import java.util.function.Consumer;
 
 import javax.swing.JDialog;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import javafx.application.Platform;
 import javafx.embed.swing.JFXPanel;
 import javafx.fxml.FXMLLoader;
 import javafx.scene.Parent;
 import javafx.scene.Scene;
 
-
 public class FXFrame<C extends FXFrame.Controller> extends JDialog {
 
+	@SuppressWarnings("unused")
+	private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.ui.FXFrame.class);
+
+	static public void runOnFxThread(Runnable runnable) {
+		if (Platform.isFxApplicationThread()) {
+			runnable.run();
+		} else {
+			Platform.runLater(runnable);
+		}
+	}
+
 	public interface Controller {
 		void init(Window frame);
 	}
@@ -42,18 +56,12 @@ public class FXFrame<C extends FXFrame.Controller> extends JDialog {
 	 */
 	protected void init(Consumer<C> controlerInit) {
 		this.controlerInit = controlerInit;
-		this.fxPanel = new JFXPanel();
+		this.fxPanel = new P_JFXPanel();
 		Platform.setImplicitExit(false);
 		this.add(this.fxPanel);
 
 		// The call to runLater() avoid a mix between JavaFX thread and Swing thread.
-		Platform.runLater(new Runnable() {
-			@Override
-			public void run() {
-				initFX(fxPanel);
-			}
-
-		});
+		runOnFxThread(() -> initFX(fxPanel));
 
 	}
 
@@ -69,10 +77,6 @@ public class FXFrame<C extends FXFrame.Controller> extends JDialog {
 			loader.setLocation(res);
 			Parent rootLayout = (Parent) loader.load();
 
-			// Get the controller and add an ImageJ context to it.
-			controller = loader.<C>getController();
-			controlerInit.accept(controller);
-			controller.init(this);
 			// Show the scene containing the root layout.
 			Scene scene = new Scene(rootLayout);
 			this.fxPanel.setScene(scene);
@@ -85,6 +89,10 @@ public class FXFrame<C extends FXFrame.Controller> extends JDialog {
 			this.fxPanel.setPreferredSize(dim);
 			// this.setSize((int) scene.getWidth(), (int) scene.getHeight());
 			this.pack();
+			// Get the controller and add an ImageJ context to it.
+			controller = loader.<C>getController();
+			controlerInit.accept(controller);
+			controller.init(this);
 
 		} catch (IOException e) {
 			e.printStackTrace();
@@ -92,4 +100,22 @@ public class FXFrame<C extends FXFrame.Controller> extends JDialog {
 
 	}
 
+	private static class P_JFXPanel extends JFXPanel {
+		private static final long serialVersionUID = 1L;
+
+		
+		@Override
+		public synchronized InputMethodRequests getInputMethodRequests() {
+			try {
+				return super.getInputMethodRequests();
+			} catch(NullPointerException e) {
+				//IGNORE FIX ISSUE https://bugs.openjdk.java.net/browse/JDK-8098836
+				return null;
+			}
+		}
+		
+		
+			
+	};
+
 }
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ModalDialogs.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ModalDialogs.java
index de2a03a50f10377d00c540e7bb6f0e1b3440ab83..1a1cb4b54bf5eb3011c92704f1c77346b1dbe065 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ModalDialogs.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ModalDialogs.java
@@ -1,12 +1,19 @@
 package cz.it4i.fiji.haas.ui;
 
+import java.util.concurrent.CompletableFuture;
+
 import javax.swing.JDialog;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 public class ModalDialogs {
+	@SuppressWarnings("unused")
+	private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.ui.ModalDialogs.class);
 	public static <T extends JDialog>T doModal(T dialog, int operation) {
 		dialog.setModal(true);
 		dialog.setDefaultCloseOperation(operation);
-		new Thread(()->dialog.setVisible(true)).start();
+		CompletableFuture.runAsync(()->dialog.setVisible(true));
 		return dialog;
 	}
 }
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ProgressDialog.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ProgressDialog.java
index acd8050822221d2b14cec5c934b6129e4c539d73..6b7b453d5c418640bf3c111a0b2a0e75f7ccb5e0 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ProgressDialog.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/ProgressDialog.java
@@ -1,5 +1,4 @@
- package cz.it4i.fiji.haas.ui;
-
+package cz.it4i.fiji.haas.ui;
 
 import java.awt.Adjustable;
 import java.awt.Container;
@@ -20,17 +19,22 @@ import javax.swing.JProgressBar;
 import javax.swing.JScrollPane;
 import javax.swing.ScrollPaneConstants;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import net.imagej.ui.swing.updater.SwingTools;
 import net.imagej.updater.util.Progress;
 import net.imagej.updater.util.UpdateCanceledException;
 
 /**
-* TODO
-* 
-* @author Johannes Schindelin
-*/
+ * TODO
+ * 
+ * @author Johannes Schindelin
+ */
 @SuppressWarnings("serial")
 public class ProgressDialog extends JDialog implements Progress {
+	@SuppressWarnings("unused")
+	private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.ui.ProgressDialog.class);
 
 	JProgressBar progress;
 	JButton detailsToggle;
@@ -47,7 +51,7 @@ public class ProgressDialog extends JDialog implements Progress {
 	}
 
 	public ProgressDialog(final Window owner, final String title) {
-		super(owner);
+		super(owner, title);
 
 		final Container root = getContentPane();
 		root.setLayout(new BoxLayout(root, BoxLayout.Y_AXIS));
@@ -75,14 +79,12 @@ public class ProgressDialog extends JDialog implements Progress {
 				ProgressDialog.this.dispose();
 			}
 		});
-		buttons.add(cancel);
+		// buttons.add(cancel);
 		buttons.setMaximumSize(buttons.getMinimumSize());
 		root.add(buttons);
 
 		details = new Details();
-		detailsScrollPane =
-			new JScrollPane(details,
-				ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
+		detailsScrollPane = new JScrollPane(details, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
 				ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED);
 		detailsScrollPane.getVerticalScrollBar().addAdjustmentListener(new AdjustmentListener() {
 
@@ -98,7 +100,8 @@ public class ProgressDialog extends JDialog implements Progress {
 		detailsScrollPane.setVisible(false);
 		root.add(detailsScrollPane);
 
-		if (title != null) setTitle(title);
+		if (title != null)
+			setTitle(title);
 		pack();
 
 		if (owner != null) {
@@ -108,15 +111,15 @@ public class ProgressDialog extends JDialog implements Progress {
 				size.width = o.width / 2;
 				setSize(size);
 			}
-			setLocation(owner.getX() + (o.width - size.width) / 2, owner.getY() +
-				(o.height - size.height) / 2);
+			setLocation(owner.getX() + (o.width - size.width) / 2, owner.getY() + (o.height - size.height) / 2);
 		}
 
 		final KeyAdapter keyAdapter = new KeyAdapter() {
 
 			@Override
 			public void keyReleased(final KeyEvent e) {
-				if (e.getKeyCode() == KeyEvent.VK_ESCAPE) cancel();
+				if (e.getKeyCode() == KeyEvent.VK_ESCAPE)
+					cancel();
 			}
 		};
 		root.addKeyListener(keyAdapter);
@@ -124,7 +127,8 @@ public class ProgressDialog extends JDialog implements Progress {
 		cancel.addKeyListener(keyAdapter);
 
 		setLocationRelativeTo(null);
-		if (title != null) setVisible(true);
+		if (title != null)
+			setVisible(true);
 	}
 
 	public void cancel() {
@@ -132,7 +136,8 @@ public class ProgressDialog extends JDialog implements Progress {
 	}
 
 	protected void checkIfCanceled() {
-		if (canceled) throw new UpdateCanceledException();
+		if (canceled)
+			throw new UpdateCanceledException();
 	}
 
 	@Override
@@ -147,9 +152,10 @@ public class ProgressDialog extends JDialog implements Progress {
 		SwingTools.invokeOnEDT(new Runnable() {
 			@Override
 			public void run() {
-				if (detailsScrollPane.isVisible() || latestDetail == null) progress
-					.setString(title);
-				else progress.setString(title + ": " + latestDetail.getString());
+				if (detailsScrollPane.isVisible() || latestDetail == null)
+					progress.setString(title);
+				else
+					progress.setString(title + ": " + latestDetail.getString());
 			}
 		});
 		repaint();
@@ -158,7 +164,8 @@ public class ProgressDialog extends JDialog implements Progress {
 	@Override
 	public void setCount(final int count, final int total) {
 		checkIfCanceled();
-		if (updatesTooFast()) return;
+		if (updatesTooFast())
+			return;
 		SwingTools.invokeOnEDT(new Runnable() {
 			@Override
 			public void run() {
@@ -173,7 +180,8 @@ public class ProgressDialog extends JDialog implements Progress {
 	public void addItem(final Object item) {
 		checkIfCanceled();
 		details.addDetail(item.toString());
-		if (itemUpdatesTooFast() && !detailsScrollPane.isVisible()) return;
+		if (itemUpdatesTooFast() && !detailsScrollPane.isVisible())
+			return;
 		setTitle();
 		validate();
 		repaint();
@@ -182,7 +190,8 @@ public class ProgressDialog extends JDialog implements Progress {
 	@Override
 	public void setItemCount(final int count, final int total) {
 		checkIfCanceled();
-		if (itemUpdatesTooFast()) return;
+		if (itemUpdatesTooFast())
+			return;
 		SwingTools.invokeOnEDT(new Runnable() {
 			@Override
 			public void run() {
@@ -196,7 +205,9 @@ public class ProgressDialog extends JDialog implements Progress {
 	@Override
 	public void itemDone(final Object item) {
 		checkIfCanceled();
-		if (itemUpdatesTooFast() && !detailsScrollPane.isVisible()) return;
+		if (itemUpdatesTooFast() && !detailsScrollPane.isVisible())
+			return;
+		
 		SwingTools.invokeOnEDT(new Runnable() {
 			@Override
 			public void run() {
@@ -207,7 +218,8 @@ public class ProgressDialog extends JDialog implements Progress {
 
 	@Override
 	public void done() {
-		if (latestDetail != null) latestDetail.setValue(latestDetail.getMaximum());
+		if (latestDetail != null)
+			latestDetail.setValue(latestDetail.getMaximum());
 		SwingTools.invokeOnEDT(new Runnable() {
 			@Override
 			public void run() {
@@ -228,7 +240,8 @@ public class ProgressDialog extends JDialog implements Progress {
 				setTitle();
 
 				final Dimension dimension = getSize();
-				if (toggleHeight == -1) toggleHeight = dimension.height + 100;
+				if (toggleHeight == -1)
+					toggleHeight = dimension.height + 100;
 				setSize(new Dimension(dimension.width, toggleHeight));
 				toggleHeight = dimension.height;
 			}
@@ -260,13 +273,15 @@ public class ProgressDialog extends JDialog implements Progress {
 	}
 
 	protected boolean updatesTooFast() {
-		if (System.currentTimeMillis() - latestUpdate < 50) return true;
+		if (System.currentTimeMillis() - latestUpdate < 50)
+			return true;
 		latestUpdate = System.currentTimeMillis();
 		return false;
 	}
 
 	protected boolean itemUpdatesTooFast() {
-		if (System.currentTimeMillis() - itemLatestUpdate < 50) return true;
+		if (System.currentTimeMillis() - itemLatestUpdate < 50)
+			return true;
 		itemLatestUpdate = System.currentTimeMillis();
 		return false;
 	}
@@ -277,4 +292,3 @@ public class ProgressDialog extends JDialog implements Progress {
 		dialog.setVisible(true);
 	}
 }
-
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/TableViewContextMenu.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/TableViewContextMenu.java
new file mode 100644
index 0000000000000000000000000000000000000000..78acda8aa157379f6f30299a2e06635c76995a6e
--- /dev/null
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/TableViewContextMenu.java
@@ -0,0 +1,65 @@
+package cz.it4i.fiji.haas.ui;
+
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+import javafx.event.EventHandler;
+import javafx.scene.control.ContextMenu;
+import javafx.scene.control.MenuItem;
+import javafx.scene.control.TableView;
+import javafx.scene.input.ContextMenuEvent;
+
+public class TableViewContextMenu<T> {
+	private Collection<P_MenuItem> items = new LinkedList<TableViewContextMenu<T>.P_MenuItem>();
+	private ContextMenu cm;
+	private TableView<T> tableView;
+
+	public TableViewContextMenu(TableView<T> tableView) {
+		this.cm = new ContextMenu();
+		this.tableView = tableView;
+		tableView.setContextMenu(cm);
+		tableView.setOnContextMenuRequested(new EventHandler<ContextMenuEvent>() {
+			@Override
+			public void handle(ContextMenuEvent event) {
+				T selected = getSelectedItem();
+				for (P_MenuItem item : items) {
+					item.updateEnable(selected);
+				}
+			}
+		});
+	}
+
+	public void addItem(String text, Consumer<T> eventHandler, Predicate<T> enableHandler) {
+		items.add(new P_MenuItem(text, eventHandler, enableHandler));
+	}
+
+	private T getSelectedItem() {
+		T result = null;
+		if (tableView.getSelectionModel().getSelectedCells().size() >= 0) {
+			result = tableView.getSelectionModel().getSelectedItem();
+		}
+		return result;
+	}
+
+	private class P_MenuItem {
+
+		private MenuItem item;
+		private Predicate<T> enableHandler;
+
+		public P_MenuItem(String text, Consumer<T> eventHandler, Predicate<T> enableHandler) {
+			super();
+			this.enableHandler = enableHandler;
+			item = new MenuItem(text);
+			item.setOnAction(e -> eventHandler.accept(getSelectedItem()));
+			cm.getItems().add(item);
+		}
+
+		public void updateEnable(T selected) {
+			item.setDisable(!enableHandler.test(selected));
+		}
+
+	}
+
+}
diff --git a/haas-java-client/.classpath b/haas-java-client/.classpath
index af1430be15836d78425a795565a49fcd23d562b4..8433ca6cd09c102eb627ee07ccba5210fb875e64 100644
--- a/haas-java-client/.classpath
+++ b/haas-java-client/.classpath
@@ -22,5 +22,15 @@
 			<attribute name="maven.pomderived" value="true"/>
 		</attributes>
 	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
+	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources">
+		<attributes>
+			<attribute name="maven.pomderived" value="true"/>
+		</attributes>
+	</classpathentry>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>
diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/.gitignore b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/.gitignore
index 702c8b4dfc8d2cf814f8eaa495f6397ba279a113..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644
--- a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/.gitignore
+++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/.gitignore
@@ -1 +0,0 @@
-/Constants.java
diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Configuration.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Configuration.java
new file mode 100644
index 0000000000000000000000000000000000000000..363f497302a446de7e8ca749e8eda894cf8911dd
--- /dev/null
+++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Configuration.java
@@ -0,0 +1,26 @@
+package cz.it4i.fiji.haas_java_client;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Properties;
+
+public class Configuration {
+
+	private Properties properties;
+	
+	public Configuration(String configFile) {
+		try(InputStream is = this.getClass().getClassLoader().getResourceAsStream(configFile)) {
+			if(is == null) {
+				throw new IllegalArgumentException("Resource " + configFile + " does not exists. Copy " + configFile + ".template and fill it, please!");
+			}
+			this.properties = new Properties();
+			this.properties.load(is);
+		} catch (IOException e) {
+			throw new RuntimeException(e);
+		}
+	}
+	
+	protected String getValue(String key) {
+		return this.properties.getProperty(key);
+	}
+}
diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Constants.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Constants.java
new file mode 100644
index 0000000000000000000000000000000000000000..35f602ac95f040ba9912f83bc9596754673025be
--- /dev/null
+++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Constants.java
@@ -0,0 +1,28 @@
+package cz.it4i.fiji.haas_java_client;
+
+class Constants extends Configuration{
+
+	
+	public Constants() {
+		super("configuration.properties");
+	}
+
+	public String getUserName() {
+		return getValue("USER_NAME");
+	}
+
+	public String getPhone() {
+		return getValue("PHONE");
+	}
+
+	public String getPassword() {
+		return getValue("PASSWORD");
+	}
+
+	public String getEmail() {
+		return getValue("EMAIL");
+	}
+	
+	
+	
+}
\ No newline at end of file
diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Constants.java.templ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Constants.java.templ
deleted file mode 100644
index e2d5e13f220e429b17f68193ceb9cb5041fd6caf..0000000000000000000000000000000000000000
--- a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/Constants.java.templ
+++ /dev/null
@@ -1,8 +0,0 @@
-package cz.it4i.fiji.haas_java_client;
-
-interface Constants {
-	String USER_NAME = "";
-	String PASSWORD = "";
-	String EMAIL = "";
-	String PHONE = "";
-}
\ No newline at end of file
diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSClient.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSClient.java
index daa379cfe2eb74610c5daefa40ba5593934348ab..a08e3a1626fbed22b99a2ba35378354ddbb5a3e9 100644
--- a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSClient.java
+++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSClient.java
@@ -162,17 +162,18 @@ public class HaaSClient {
 	}
 
 	public long start(Iterable<Path> files, String name, Collection<Entry<String, String>> templateParameters) {
-		Iterable<UploadingFile> uploadingFiles = StreamSupport.stream(files.spliterator(), false).map(HaaSClient::getUploadingFile).collect(Collectors.toList());
+		Iterable<UploadingFile> uploadingFiles = StreamSupport.stream(files.spliterator(), false)
+				.map(HaaSClient::getUploadingFile).collect(Collectors.toList());
 		return start(uploadingFiles, name, templateParameters, dummyNotifier);
 	}
 
-	public long start(Iterable<UploadingFile> files, String name,
-			Collection<Entry<String, String>> templateParameters, ProgressNotifier notifier) {
+	public long start(Iterable<UploadingFile> files, String name, Collection<Entry<String, String>> templateParameters,
+			ProgressNotifier notifier) {
 		notifier.setTitle("Starting job");
 		try {
-			long jobId = doCreateJob(name, templateParameters, notifier);
+			long jobId = doCreateJob(name, templateParameters);
 			doUploadFiles(jobId, files, notifier);
-			doSubmitJob(jobId, notifier);
+			doSubmitJob(jobId);
 			return jobId;
 		} catch (ServiceException | JSchException | IOException e) {
 			throw new RuntimeException(e);
@@ -180,10 +181,9 @@ public class HaaSClient {
 
 	}
 
-	public long createJob(String name, Collection<Entry<String, String>> templateParameters,
-			ProgressNotifier notifier) {
+	public long createJob(String name, Collection<Entry<String, String>> templateParameters) {
 		try {
-			return doCreateJob(name, templateParameters, notifier);
+			return doCreateJob(name, templateParameters);
 		} catch (RemoteException | ServiceException e) {
 			throw new RuntimeException(e);
 		}
@@ -197,9 +197,9 @@ public class HaaSClient {
 		}
 	}
 
-	public void submitJob(long jobId, ProgressNotifier notifier) {
+	public void submitJob(long jobId) {
 		try {
-			doSubmitJob(jobId, notifier);
+			doSubmitJob(jobId);
 		} catch (RemoteException | ServiceException e) {
 			throw new RuntimeException(e);
 		}
@@ -262,7 +262,8 @@ public class HaaSClient {
 			FileTransferMethodExt ft = getFileTransfer().getFileTransferMethod(jobId, getSessionID());
 			try (ScpClient scpClient = getScpClient(ft)) {
 				String[] filesArray = getFileTransfer().listChangedFilesForJob(jobId, getSessionID());
-				Collection<String> files = Arrays.asList(filesArray).stream().filter(function).collect(Collectors.toList());
+				Collection<String> files = Arrays.asList(filesArray).stream().filter(function)
+						.collect(Collectors.toList());
 				List<Long> fileSizes = getSizes(
 						files.stream().map(filename -> "'" + ft.getSharedBasepath() + "/" + filename + "'").collect(
 								Collectors.toList()),
@@ -335,10 +336,8 @@ public class HaaSClient {
 		};
 	}
 
-	private void doSubmitJob(long jobId, ProgressNotifier notifier) throws RemoteException, ServiceException {
+	private void doSubmitJob(long jobId) throws RemoteException, ServiceException {
 		getJobManagement().submitJob(jobId, getSessionID());
-		notifier.itemDone(getNotificationItem4JobId(jobId));
-		notifier.done();
 	}
 
 	private void doUploadFiles(long jobId, Iterable<UploadingFile> files, ProgressNotifier notifier)
@@ -368,20 +367,15 @@ public class HaaSClient {
 		getFileTransfer().endFileTransfer(jobId, fileTransfer, getSessionID());
 	}
 
-	private long doCreateJob(String name, Collection<Entry<String, String>> templateParameters,
-			ProgressNotifier notifier) throws RemoteException, ServiceException {
+	private long doCreateJob(String name, Collection<Entry<String, String>> templateParameters)
+			throws RemoteException, ServiceException {
 		TaskSpecificationExt taskSpec = createTaskSpecification(name, templateId, templateParameters);
 		JobSpecificationExt jobSpecification = createJobSpecification(name, Arrays.asList(taskSpec));
 		SubmittedJobInfoExt job = getJobManagement().createJob(jobSpecification, getSessionID());
-		notifier.addItem(getNotificationItem4JobId(job.getId()));
 		return job.getId();
 	}
 
-	private String getNotificationItem4JobId(long jobId) {
-		return String.format("Created job: %d\n", jobId);
-	}
-
-		private List<Long> getSizes(List<String> asList, ScpClient scpClient, ProgressNotifier notifier)
+	private List<Long> getSizes(List<String> asList, ScpClient scpClient, ProgressNotifier notifier)
 			throws JSchException, IOException {
 		List<Long> result = new LinkedList<>();
 
diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/TestingConstants.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/TestingConstants.java
index 6b91d662a3f7e041a4e9c6dc29693f387ddd7456..389ebe716048fbbcbe0f683c3908ad6b3a415db9 100644
--- a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/TestingConstants.java
+++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/TestingConstants.java
@@ -1,32 +1,29 @@
 package cz.it4i.fiji.haas_java_client;
 
 interface TestingConstants {
-	String USER_NAME = "testuser";
-	String PASSWORD = "57f9caaf84";
-	String EMAIL = "jan.kozusznik@vsb.cz";
-	String PHONE = "999111000";
 	
 	static Settings getSettings(long templateId, int timeOut, long clusterNodeType, String projectId) {
+		Constants constants = new Constants();
 		return new Settings() {
 			
 			@Override
 			public String getUserName() {
-				return USER_NAME;
+				return  constants.getUserName();
 			}
 			
 			@Override
 			public String getPhone() {
-				return PHONE;
+				return constants.getPhone();
 			}
 			
 			@Override
 			public String getPassword() {
-				return PASSWORD;
+				return constants.getPassword();
 			}
 			
 			@Override
 			public String getEmail() {
-				return EMAIL;
+				return constants.getEmail();
 			}
 
 			@Override
diff --git a/haas-java-client/src/main/resources/.gitignore b/haas-java-client/src/main/resources/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b5285f5f9fb3ae9423696a524c0fcf6c5a8d5d0c
--- /dev/null
+++ b/haas-java-client/src/main/resources/.gitignore
@@ -0,0 +1 @@
+/configuration.properties
diff --git a/haas-java-client/src/main/resources/configuration.properties.template b/haas-java-client/src/main/resources/configuration.properties.template
new file mode 100644
index 0000000000000000000000000000000000000000..892ed0d0a691608a7070d5beb4c3c8e539c074ef
--- /dev/null
+++ b/haas-java-client/src/main/resources/configuration.properties.template
@@ -0,0 +1,4 @@
+USER_NAME=
+PASSWORD=
+EMAIL=
+PHONE=
\ No newline at end of file
diff --git a/haas-java-client/src/test/resources/.gitignore b/haas-java-client/src/test/resources/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b5285f5f9fb3ae9423696a524c0fcf6c5a8d5d0c
--- /dev/null
+++ b/haas-java-client/src/test/resources/.gitignore
@@ -0,0 +1 @@
+/configuration.properties
diff --git a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/.gitignore b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/Constants.java b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/Constants.java
new file mode 100644
index 0000000000000000000000000000000000000000..984071e8fd57bc3f8c3e2fcf500987ed3ffd3066
--- /dev/null
+++ b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/Constants.java
@@ -0,0 +1,31 @@
+package cz.it4i.fiji.haas_snakemake_spim;
+
+import cz.it4i.fiji.haas_java_client.Configuration;
+
+public class Constants extends Configuration {
+
+	public Constants() {
+		super("configuration.properties");
+	}
+
+	public String getProjectId() {
+		return getValue("PROJECT_ID");
+	}
+
+	public String getPassword() {
+		return getValue("PASSWORD");
+	}
+
+	public String getUserName() {
+		return getValue("USER_NAME");
+	}
+
+	public String getPhone() {
+		return getValue("PHONE");
+	}
+
+	public String getEmail() {
+		return getValue("EMAIL");
+	}
+
+}
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/TestingConstants.template b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/TestingConstants.java
similarity index 64%
rename from haas-imagej-client/src/main/java/cz/it4i/fiji/haas/TestingConstants.template
rename to haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/TestingConstants.java
index 6e89e500814d9ffd5ecef6a5d6dd6e9aaa0f9c56..a82879df1059f432a7eed31781d79a7a1936ceb8 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/TestingConstants.template
+++ b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/TestingConstants.java
@@ -1,39 +1,36 @@
-package cz.it4i.fiji.haas;
+package cz.it4i.fiji.haas_snakemake_spim;
 
 import cz.it4i.fiji.haas_java_client.Settings;
 
-interface TestingConstants {
-	String USER_NAME = <user name to haas>;
-	String PASSWORD = <password to haas>;
-	String EMAIL = ;
-	String PHONE = ;
-	
+public interface TestingConstants {
 	
 	static Settings getSettings() {
+		Constants constants = new Constants();
 		long templateId = 2l;
 		int timeOut = 9600; 
 		long clusterNodeType = 6l;
-		String projectId = "DD-17-31";
+		
+	
 		return new Settings() {
 			
 			@Override
 			public String getUserName() {
-				return USER_NAME;
+				return constants.getUserName();
 			}
 			
 			@Override
 			public String getPhone() {
-				return PHONE;
+				return constants.getPhone();
 			}
 			
 			@Override
 			public String getPassword() {
-				return PASSWORD;
+				return constants.getPassword();
 			}
 			
 			@Override
 			public String getEmail() {
-				return EMAIL;
+				return constants.getEmail();
 			}
 
 			@Override
@@ -53,7 +50,12 @@ interface TestingConstants {
 
 			@Override
 			public String getProjectId() {
-				return projectId;
+				return constants.getProjectId();
+			}
+
+			@Override
+			public String getJobName() {
+				return "HaaS-Snakemake-SPIM";
 			}
 		};
 	}
diff --git a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/commands/CheckStatusOfHaaS.java b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/commands/CheckStatusOfHaaS.java
index 3ea5e71cd4fb5da950249b31f1ffd429bce20977..28961641813b04c9b9ee8f359c500197489c93ae 100644
--- a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/commands/CheckStatusOfHaaS.java
+++ b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/commands/CheckStatusOfHaaS.java
@@ -19,10 +19,11 @@ import org.scijava.ui.UIService;
 import org.scijava.widget.UIComponent;
 
 import cz.it4i.fiji.haas.JobManager;
-import cz.it4i.fiji.haas.TestingConstants;
 import cz.it4i.fiji.haas.JobManager.JobInfo;
+import cz.it4i.fiji.haas.ui.DummyProgress;
 import cz.it4i.fiji.haas.ui.ModalDialogs;
 import cz.it4i.fiji.haas.ui.ProgressDialog;
+import cz.it4i.fiji.haas_snakemake_spim.TestingConstants;
 import cz.it4i.fiji.haas_snakemake_spim.ui.CheckStatusOfHaaSWindow;
 import net.imagej.ImageJ;
 
@@ -59,16 +60,11 @@ public class CheckStatusOfHaaS implements Command {
 				window = ModalDialogs.doModal(new CheckStatusOfHaaSWindow(getFrame(), context),WindowConstants.DISPOSE_ON_CLOSE);
 				ProgressDialog dialog = ModalDialogs.doModal(new ProgressDialog(window),WindowConstants.DO_NOTHING_ON_CLOSE);
 				dialog.setTitle("Downloading info about jobs");
-				Collection<JobInfo> jobs = jobManager.getJobs(dialog);
+				Collection<JobInfo> jobs = jobManager.getJobs();
 				int count = 0;
 				for (JobInfo ji : jobs) {
 					String item;
 					dialog.addItem(item = "job id:" + ji.getId());
-					try {
-						ji.updateInfo();
-					} catch (IOException e) {
-						log.error(e);
-					}
 					window.addJob(ji);
 					dialog.itemDone(item);
 					dialog.setCount(count, jobs.size());
@@ -98,7 +94,7 @@ public class CheckStatusOfHaaS implements Command {
 	private void downloadAll() {
 		for (JobInfo id : jobManager.getJobsNeedingDownload()) {
 			System.out.println("Job " + id.getId() + " needs download");
-			jobManager.downloadJob(id.getId());
+			jobManager.downloadJob(id.getId(), new DummyProgress());
 		}
 	}
 
diff --git a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/commands/RunWithHaaS.java b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/commands/RunWithHaaS.java
index 3576aa7f8b4b2a25a425ec11f9d29c9c604ab25f..8fc4df618bac9bdbeef26bc3a4ff3777df3967fc 100644
--- a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/commands/RunWithHaaS.java
+++ b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/commands/RunWithHaaS.java
@@ -21,10 +21,10 @@ import org.scijava.ui.UIService;
 import org.scijava.widget.UIComponent;
 
 import cz.it4i.fiji.haas.JobManager;
-import cz.it4i.fiji.haas.TestingConstants;
 import cz.it4i.fiji.haas.ui.ModalDialogs;
 import cz.it4i.fiji.haas.ui.ProgressDialog;
 import cz.it4i.fiji.haas_java_client.HaaSClient;
+import cz.it4i.fiji.haas_snakemake_spim.TestingConstants;
 import net.imagej.ImageJ;
 
 /**
@@ -56,9 +56,13 @@ public class RunWithHaaS implements Command {
 	public void run() {
 		try {
 			jobManager = new JobManager(getWorkingDirectoryPath(), TestingConstants.getSettings());
+			ProgressDialog dialog = ModalDialogs.doModal(new ProgressDialog(getFrame(), "Starting job"),
+					WindowConstants.DO_NOTHING_ON_CLOSE);
+
 			jobManager.startJob(
 					getContent(dataDirectory).stream().map(HaaSClient::getUploadingFile).collect(Collectors.toList()),
-					ModalDialogs.doModal(new ProgressDialog(getFrame()), WindowConstants.DO_NOTHING_ON_CLOSE));
+					dialog);
+			dialog.done();
 		} catch (IOException e) {
 			log.error(e);
 		}
diff --git a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/ui/.gitignore b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/ui/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..702c8b4dfc8d2cf814f8eaa495f6397ba279a113
--- /dev/null
+++ b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/ui/.gitignore
@@ -0,0 +1 @@
+/Constants.java
diff --git a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/ui/CheckStatusOfHaaSController.java b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/ui/CheckStatusOfHaaSController.java
index 4763b20336d312ac689c0b3bb8405f72dc1ed6b5..38092ad763dcea820b46ae9e882b6e27b710a8a0 100644
--- a/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/ui/CheckStatusOfHaaSController.java
+++ b/haas-snakemake-spim/src/main/java/cz/it4i/fiji/haas_snakemake_spim/ui/CheckStatusOfHaaSController.java
@@ -22,8 +22,9 @@ import javafx.scene.control.MenuItem;
 import javafx.scene.control.TableColumn;
 import javafx.scene.control.TableView;
 import javafx.scene.input.ContextMenuEvent;
+import net.imagej.updater.util.Progress;
 
-public class CheckStatusOfHaaSController implements FXFrame.Controller{
+public class CheckStatusOfHaaSController implements FXFrame.Controller {
 
 	@Parameter
 	private LogService logService;
@@ -42,14 +43,15 @@ public class CheckStatusOfHaaSController implements FXFrame.Controller{
 	}
 
 	public void init(Window root) {
+		this.root = root;
 		initTable();
 		initMenu();
-		this.root = root;
 	}
 
 	private void downloadData(ActionEvent event) {
-		Platform.runLater(() -> jobs.getSelectionModel().getSelectedItem()
-				.downloadData(ModalDialogs.doModal(new ProgressDialog(root), WindowConstants.DO_NOTHING_ON_CLOSE)));
+		Progress progress = ModalDialogs.doModal(new ProgressDialog(root, "Downloading data"), WindowConstants.DO_NOTHING_ON_CLOSE);
+		Platform.runLater(() -> jobs.getSelectionModel().getSelectedItem().downloadData(progress));
+		progress.done();
 	}
 
 	private void initMenu() {
diff --git a/haas-snakemake-spim/src/main/resources/.gitignore b/haas-snakemake-spim/src/main/resources/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b5285f5f9fb3ae9423696a524c0fcf6c5a8d5d0c
--- /dev/null
+++ b/haas-snakemake-spim/src/main/resources/.gitignore
@@ -0,0 +1 @@
+/configuration.properties
diff --git a/haas-snakemake-spim/src/main/resources/configuration.properties.template b/haas-snakemake-spim/src/main/resources/configuration.properties.template
new file mode 100644
index 0000000000000000000000000000000000000000..5db03d89f48785d3b2c31be4322b12aced25d6b1
--- /dev/null
+++ b/haas-snakemake-spim/src/main/resources/configuration.properties.template
@@ -0,0 +1,5 @@
+PROJECT_ID=DD-17-31
+USER_NAME=
+PASSWORD=
+EMAIL=
+PHONE=
\ No newline at end of file
diff --git a/haas-spim-benchmark/pom.xml b/haas-spim-benchmark/pom.xml
index 9a7a84fb8b45c33872e5cc4b1a9df97c7527248e..1dd914065cd78b18f350bb346d1cb29e3beaf6e4 100644
--- a/haas-spim-benchmark/pom.xml
+++ b/haas-spim-benchmark/pom.xml
@@ -61,7 +61,13 @@
 		<system>None</system>
 	</ciManagement>
 
+	<properties>
+		<license.licenseName>cc0</license.licenseName>
+		<license.copyrightOwners>N/A</license.copyrightOwners>
+		<license.projectName>Plugins for running SPIM automated workflow by
+			IT4I HaaS.</license.projectName>
 
+	</properties>
 	<repositories>
 		<repository>
 			<id>imagej.public</id>
@@ -73,8 +79,9 @@
 		<dependency>
 			<groupId>net.imagej</groupId>
 			<artifactId>imagej</artifactId>
+			<scope>compile</scope>
 		</dependency>
-		
+
 		<dependency>
 			<groupId>cz.it4i.fiji</groupId>
 			<artifactId>haas-imagej-client</artifactId>
@@ -91,4 +98,7 @@
 			<artifactId>slf4j-simple</artifactId>
 		</dependency>
 	</dependencies>
-</project>
\ No newline at end of file
+	<build>
+		
+	</build>
+</project>
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/BenchmarkSPIMParametersImpl.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/BenchmarkSPIMParametersImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..70ece8d7350cd6baa982801e87aa21650655112d
--- /dev/null
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/BenchmarkSPIMParametersImpl.java
@@ -0,0 +1,41 @@
+package cz.it4i.fiji.haas_spim_benchmark.commands;
+
+import java.nio.file.Path;
+
+import cz.it4i.fiji.haas_java_client.Configuration;
+import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkSPIMParameters;
+
+class BenchmarkSPIMParametersImpl extends Configuration implements BenchmarkSPIMParameters{
+
+	private Path workingDirectory;
+	
+	public BenchmarkSPIMParametersImpl(Path workingDirectory) {
+		super("configuration.properties");
+		this.workingDirectory = workingDirectory;
+	}
+
+	@Override
+	public Path workingDirectory() {
+		return workingDirectory;
+	}
+
+	@Override
+	public String username() {
+		return getValue("USER_NAME");
+	}
+
+	@Override
+	public String password() {
+		return getValue("PASSWORD");
+	}
+
+	@Override
+	public String phone() {
+		return getValue("PHONE");
+	}
+
+	@Override
+	public String email() {
+		return getValue("EMAIL");
+	}
+}
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/ManageSPIMBenchmark.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/ManageSPIMBenchmark.java
new file mode 100644
index 0000000000000000000000000000000000000000..75eab35b14172e2c2a52df7984e6dfa3c1c239bf
--- /dev/null
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/ManageSPIMBenchmark.java
@@ -0,0 +1,78 @@
+package cz.it4i.fiji.haas_spim_benchmark.commands;
+
+import java.awt.Frame;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Paths;
+
+import javax.swing.WindowConstants;
+
+import org.scijava.Context;
+import org.scijava.command.Command;
+import org.scijava.plugin.Parameter;
+import org.scijava.plugin.Plugin;
+import org.scijava.ui.ApplicationFrame;
+import org.scijava.ui.UIService;
+import org.scijava.widget.UIComponent;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import cz.it4i.fiji.haas.ui.ModalDialogs;
+import cz.it4i.fiji.haas_spim_benchmark.ui.BenchmarkSPIMWindow;
+import net.imagej.ImageJ;
+
+/**
+ * 
+ * @author koz01
+ *
+ */
+@Plugin(type = Command.class, headless = false, menuPath = "Plugins>SPIM benchmark")
+public class ManageSPIMBenchmark implements Command {
+
+	private static Logger log = LoggerFactory
+			.getLogger(cz.it4i.fiji.haas_spim_benchmark.commands.ManageSPIMBenchmark.class);
+
+	@Parameter(label = "Work directory", persist = true, style = "directory")
+	private File workDirectory;
+
+	@Parameter
+	private UIService uiService;
+
+	@Parameter
+	private Context context;
+
+	@Override
+	public void run() {
+		try {
+			ModalDialogs.doModal(
+					new BenchmarkSPIMWindow(getFrame(), new BenchmarkSPIMParametersImpl(Paths.get(workDirectory.getPath()))),
+					WindowConstants.DISPOSE_ON_CLOSE);
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			log.error(e.getMessage(), e);
+		}
+
+	}
+
+	private Frame getFrame() {
+		ApplicationFrame af = uiService.getDefaultUI().getApplicationFrame();
+		if (af instanceof Frame) {
+			return (Frame) af;
+		} else if (af instanceof UIComponent) {
+			Object component = ((UIComponent<?>) af).getComponent();
+			if (component instanceof Frame) {
+				return (Frame) component;
+			}
+		}
+		return null;
+	}
+
+	public static void main(final String... args) {
+		// Launch ImageJ as usual.
+		final ImageJ ij = new ImageJ();
+		ij.launch(args);
+
+		ij.command().run(ManageSPIMBenchmark.class, true);
+	}
+
+}
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/package-info.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/package-info.java
new file mode 100644
index 0000000000000000000000000000000000000000..dcfbfc4ce8e10a519f9405f30cd0c0b801db3800
--- /dev/null
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/commands/package-info.java
@@ -0,0 +1,8 @@
+/**
+ * 
+ */
+/**
+ * @author koz01
+ *
+ */
+package cz.it4i.fiji.haas_spim_benchmark.commands;
\ No newline at end of file
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 26e65fd2383d11ec62863db01cdf811cfed7e34d..375a00fbcb06bc230b287d3413ac4c9963665560 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
@@ -6,91 +6,167 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Predicate;
 import java.util.stream.Collectors;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.yaml.snakeyaml.Yaml;
 
 import cz.it4i.fiji.haas.JobManager;
-import cz.it4i.fiji.haas.TestingConstants;
-import cz.it4i.fiji.haas.UploadingFileFromResource;
 import cz.it4i.fiji.haas.JobManager.JobInfo;
 import cz.it4i.fiji.haas.JobManager.JobSynchronizableFile;
+import cz.it4i.fiji.haas.UploadingFileFromResource;
 import cz.it4i.fiji.haas_java_client.HaaSClient;
 import cz.it4i.fiji.haas_java_client.JobState;
+import cz.it4i.fiji.haas_java_client.Settings;
+import javafx.beans.value.ObservableValueBase;
 import net.imagej.updater.util.Progress;
 
 public class BenchmarkJobManager {
-	private static final String SPIM_OUTPUT_FILENAME_PATTERN = "spim.outputFilenamePattern";
-	private static final int HAAS_TEMPLATE_ID = 4;
-	private static final String CONFIG_YAML = "config.yaml";
-	private JobManager jobManager;
-	private Progress progress;
-	private Map<Long, JobInfo> jobs = new HashMap<>();
+	
+	@SuppressWarnings("unused")
+	private static Logger log = LoggerFactory
+			.getLogger(cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager.class);
+	
+	public final class Job extends ObservableValueBase<Job> {
+		private JobInfo jobInfo;
+
+		private JobState oldState;
+		public Job(JobInfo ji) {
+			super();
+			this.jobInfo = ji;
+		}
 
-	public BenchmarkJobManager(Path workDirectory, Progress progress) throws IOException {
-		jobManager = new JobManager(workDirectory, TestingConstants.getSettings(HAAS_TEMPLATE_ID, 6));
-		this.progress = progress;
-	}
+		public void startJob(Progress progress) throws IOException {
+			jobInfo.uploadFilesByName(Arrays.asList(CONFIG_YAML), progress);
+			String outputName = getOutputName(jobInfo.openLocalFile(CONFIG_YAML));
+			jobInfo.submit();
+			jobInfo.setProperty(SPIM_OUTPUT_FILENAME_PATTERN, outputName);
+		}
 
-	public long createJob() throws IOException {
-		JobInfo jobInfo = jobManager.createJob(progress);
-		jobInfo.storeDataInWorkdirectory(getUploadingFile());
-		return indexJob(jobInfo);
-	}
+		public JobState getState() {
+			return oldState = jobInfo.getState();
+		}
 
-	public void startJob(long jobId) throws IOException {
-		JobInfo jobInfo = jobs.get(jobId);
-		jobInfo.uploadFilesByName(Arrays.asList(CONFIG_YAML));
-		String outputName = getOutputName(jobInfo.openLocalFile(CONFIG_YAML));
-		jobInfo.submit();
-		jobInfo.setProperty(SPIM_OUTPUT_FILENAME_PATTERN, outputName);
-	}
+		public void downloadData(Progress progress) throws IOException {
+			JobInfo ji = jobInfo;
+			if (ji.needsDownload()) {
+				if (ji.getState() == JobState.Finished) {
+					String filePattern = ji.getProperty(SPIM_OUTPUT_FILENAME_PATTERN);
+					ji.downloadData(downloadFinishedData(filePattern), progress);
+				} else if (ji.getState() == JobState.Failed) {
+					ji.downloadData(downloadFailedData(), progress);
+				}
+			}
 
-	public Collection<Long> getJobs() throws IOException {
-		return jobManager.getJobs(progress).stream().map(this::indexJob).collect(Collectors.toList());
-	}
+		}
 
-	public JobState getState(long jobId) {
-		return jobs.get(jobId).getState();
-	}
+		public List<String> getOutput(List<JobSynchronizableFile> files) {
+			return jobInfo.getOutput(files);
+		}
+
+		public long getId() {
+			return jobInfo.getId();
+		}
+
+		public String getCreationTime() {
+			return jobInfo.getCreationTime();
+		}
+
+		public String getStartTime() {
+			return jobInfo.getStartTime();
+		}
+
+		public String getEndTime() {
+			return jobInfo.getEndTime();
+		}
+
+		@Override
+		public Job getValue() {
+			return this;
+		}
+
+		@Override
+		public int hashCode() {
+			return jobInfo.getId().hashCode();
+		}
+
+		@Override
+		public boolean equals(Object obj) {
+			if (obj instanceof Job) {
+				Job job = (Job) obj;
+				return job.getId() == getId();
 
-	public void downloadData(long jobId) throws IOException {
-		JobInfo ji = jobs.get(jobId);
-		if (ji.needsDownload()) {
-			if (ji.getState() == JobState.Finished) {
-				String filePattern = ji.getProperty(SPIM_OUTPUT_FILENAME_PATTERN);
-				ji.downloadData(downloadFinishedData(filePattern), progress);
-			} else if (ji.getState() == JobState.Failed) {
-				ji.downloadData(downloadFailedData(), progress);
 			}
+			return false;
+		}
+
+		public void update(Job job) {
+			jobInfo = job.jobInfo;
+			if (jobInfo.getState() != oldState) {
+				fireValueChangedEvent();
+			}
+		}
+
+	
+		
+		public boolean downloaded() {
+			return !jobInfo.needsDownload();
+		}
+
+		public Job update() {
+			jobInfo.updateInfo();
+			return this;
+		}
+
+		public Path getDirectory() {
+			return jobInfo.getDirectory();
 		}
+	}
+
+	private static final String HAAS_JOB_NAME = "HaaSSPIMBenchmark";
+	private static final int HAAS_CLUSTER_NODE_TYPE = 6;
+	private static final int HAAS_TEMPLATE_ID = 4;
+	private static final String HAAS_PROJECT_ID = "DD-17-31";
+	private static final int HAAS_TIMEOUT = 9600;
+
+	private static final String SPIM_OUTPUT_FILENAME_PATTERN = "spim.outputFilenamePattern";
+	private static final String CONFIG_YAML = "config.yaml";
 
+	private JobManager jobManager;
+	
+	public BenchmarkJobManager(BenchmarkSPIMParameters params) throws IOException {
+		jobManager = new JobManager(params.workingDirectory(), constructSettingsFromParams(params));
 	}
 
-	public Iterable<String> getOutput(long jobId, List<JobSynchronizableFile> files) {
-		return jobs.get(jobId).getOutput(files);
+	public Job createJob() throws IOException {
+		JobInfo jobInfo = jobManager.createJob();
+		jobInfo.storeDataInWorkdirectory(getUploadingFile());
+		return convertJob(jobInfo);
+	}
+
+	public Collection<Job> getJobs() throws IOException {
+		
+		return jobManager.getJobs().stream().map(this::convertJob).collect(Collectors.toList());
 	}
 
 	private HaaSClient.UploadingFile getUploadingFile() {
 		return new UploadingFileFromResource("", CONFIG_YAML);
 	}
 
-	private long indexJob(JobInfo jobInfo) {
-		jobs.put(jobInfo.getId(), jobInfo);
-		return jobInfo.getId();
+	private Job convertJob(JobInfo jobInfo) {
+		return new Job(jobInfo);
 	}
 
-	@SuppressWarnings("rawtypes")
 	private String getOutputName(InputStream openLocalFile) throws IOException {
 		try (InputStream is = openLocalFile) {
 			Yaml yaml = new Yaml();
 
-			Map map = yaml.load(is);
-			String result = (String) ((Map) map.get("common")).get("hdf5_xml_filename");
+			Map<String, Map<String, String>> map = yaml.load(is);
+			String result = map.get("common").get("hdf5_xml_filename");
 			if (result == null) {
 				throw new IllegalArgumentException("hdf5_xml_filename not found");
 			}
@@ -122,4 +198,55 @@ public class BenchmarkJobManager {
 					|| p.getParent().getFileName().toString().equals("logs");
 		};
 	}
+
+	private static Settings constructSettingsFromParams(BenchmarkSPIMParameters params) {
+		// TODO Auto-generated method stub
+		return new Settings() {
+
+			@Override
+			public String getUserName() {
+				return params.username();
+			}
+
+			@Override
+			public int getTimeout() {
+				return HAAS_TIMEOUT;
+			}
+
+			@Override
+			public long getTemplateId() {
+				return HAAS_TEMPLATE_ID;
+			}
+
+			@Override
+			public String getProjectId() {
+				return HAAS_PROJECT_ID;
+			}
+
+			@Override
+			public String getPhone() {
+				return params.phone();
+			}
+
+			@Override
+			public String getPassword() {
+				return params.password();
+			}
+
+			@Override
+			public String getJobName() {
+				return HAAS_JOB_NAME;
+			}
+
+			@Override
+			public String getEmail() {
+				return params.email();
+			}
+
+			@Override
+			public long getClusterNodeType() {
+				return HAAS_CLUSTER_NODE_TYPE;
+			}
+		};
+	}
 }
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/BenchmarkSPIMParameters.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/BenchmarkSPIMParameters.java
new file mode 100644
index 0000000000000000000000000000000000000000..abbafc2c0db434162b7166c36d457086e896512c
--- /dev/null
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/BenchmarkSPIMParameters.java
@@ -0,0 +1,11 @@
+package cz.it4i.fiji.haas_spim_benchmark.core;
+
+import java.nio.file.Path;
+
+public interface BenchmarkSPIMParameters {
+	Path workingDirectory();
+	String username();
+	String password();
+	String phone();
+	String email();
+}
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/Constants.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/Constants.java
new file mode 100644
index 0000000000000000000000000000000000000000..367ef54df3ca69b2dc82e879f4c0088737adf470
--- /dev/null
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/core/Constants.java
@@ -0,0 +1,5 @@
+package cz.it4i.fiji.haas_spim_benchmark.core;
+
+public interface Constants {
+	long HAAS_UPDATE_TIMEOUT = 1000;
+}
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIM.fxml b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIM.fxml
index 07201409776731fd9033a79207a24241f760665b..27eff777e379056574c46ec623441f321a668d56 100644
--- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIM.fxml
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIM.fxml
@@ -4,7 +4,7 @@
 <?import javafx.scene.control.TableView?>
 <?import javafx.scene.layout.BorderPane?>
 
-<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="912.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="cz.it4i.fiji.haas_snakemake_spim.ui.CheckStatusOfHaaSController">
+<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="912.0" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="cz.it4i.fiji.haas_spim_benchmark.ui.BenchmarkSPIMController">
    <center>
       <TableView fx:id="jobs" prefHeight="400.0" prefWidth="675.0" BorderPane.alignment="CENTER">
         <columns>
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 8e8feade02c1274450e3cb2ac47e5d06d852db25..9010a3b02a52cf5ba5c70e42bca2078ab235cfbd 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
@@ -1,15 +1,192 @@
 package cz.it4i.fiji.haas_spim_benchmark.ui;
 
+import java.awt.Desktop;
 import java.awt.Window;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.io.IOException;
+import java.util.EnumSet;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.stream.Collectors;
 
+import javax.swing.WindowConstants;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import cz.it4i.fiji.haas.ui.DummyProgress;
 import cz.it4i.fiji.haas.ui.FXFrame;
+import cz.it4i.fiji.haas.ui.ModalDialogs;
+import cz.it4i.fiji.haas.ui.ObservableValueAdapter;
+import cz.it4i.fiji.haas.ui.ProgressDialog;
+import cz.it4i.fiji.haas.ui.TableViewContextMenu;
+import cz.it4i.fiji.haas_java_client.JobState;
+import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager;
+import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager.Job;
+import cz.it4i.fiji.haas_spim_benchmark.core.Constants;
+import javafx.fxml.FXML;
+import javafx.scene.control.TableColumn;
+import javafx.scene.control.TableView;
+import net.imagej.updater.util.Progress;
+
+public class BenchmarkSPIMController implements FXFrame.Controller {
+
+	private static boolean notNullValue(Job j, Predicate<Job> pred) {
+		if (j == null) {
+			return false;
+		} else {
+			return pred.test(j);
+		}
+	}
+
+	@FXML
+	private TableView<Job> jobs;
+
+	private BenchmarkJobManager manager;
+
+	private Window root;
+
+	private ExecutorService executorService;
 
-public class BenchmarkSPIMController implements FXFrame.Controller{
+	private Timer timer;
+
+	private static Logger log = LoggerFactory
+			.getLogger(cz.it4i.fiji.haas_spim_benchmark.ui.BenchmarkSPIMController.class);
 
 	@Override
 	public void init(Window frame) {
-		// TODO Auto-generated method stub
-		
+		executorService = Executors.newSingleThreadExecutor();
+		timer = new Timer();
+		timer.scheduleAtFixedRate(new TimerTask() {
+			@Override
+			public void run() {
+				updateJobs(false);
+			}
+		}, Constants.HAAS_UPDATE_TIMEOUT, Constants.HAAS_UPDATE_TIMEOUT);
+		root = frame;
+		initTable();
+		initMenu();
+		updateJobs();
+		root.addWindowListener(new WindowAdapter() {
+			@Override
+			public void windowClosed(WindowEvent e) {
+				super.windowClosed(e);
+				dispose();
+			}
+		});
+	}
+
+	public void setManager(BenchmarkJobManager manager) {
+		this.manager = manager;
+
 	}
 
+	private void initMenu() {
+		TableViewContextMenu<Job> menu = new TableViewContextMenu<>(jobs);
+		menu.addItem("Create job", x -> executeJobActionAsync("Creating job", p -> manager.createJob()), j -> true);
+		menu.addItem("Start job", job -> executeJobActionAsync("Starting job", p -> job.startJob(p)),
+				job -> notNullValue(job, j -> j.getState() == JobState.Configuring));
+		menu.addItem("Download", job -> executeJobActionAsync("Downloading data", p -> job.downloadData(p)),
+				job -> notNullValue(job,
+						j -> EnumSet.of(JobState.Failed, JobState.Finished).contains(j.getState()) && !j.downloaded()));
+		menu.addItem("Show output", j -> new JobOutputView(root, executorService, j, Constants.HAAS_UPDATE_TIMEOUT),
+				job -> notNullValue(job,
+						j -> EnumSet.of(JobState.Failed, JobState.Finished, JobState.Running).contains(j.getState())));
+		menu.addItem("Open", j->open(j), x->true);
+		menu.addItem("Update table", job -> updateJobs(), j -> true);
+
+	}
+
+	private void open(Job j) {
+		executorService.execute(() -> {
+		Desktop desktop = Desktop.getDesktop();
+		try {
+			desktop.open(j.getDirectory().toFile());
+		} catch (IOException e) {
+			log.error(e.getMessage(), e);
+		}});
+	}
+
+	private void executeJobActionAsync(String title, P_JobAction action) {
+		executorService.execute(() -> {
+			try {
+				ProgressDialog dialog = ModalDialogs.doModal(new ProgressDialog(root, title),
+						WindowConstants.DO_NOTHING_ON_CLOSE);
+				action.doAction(dialog);
+				dialog.done();
+				updateJobs();
+			} catch (IOException e) {
+				log.error(e.getMessage(), e);
+			}
+		});
+	}
+
+	private void updateJobs() {
+		updateJobs(true);
+	}
+
+	private void updateJobs(boolean showProgress) {
+		executorService.execute(() -> {
+			Progress progress = showProgress
+					? ModalDialogs.doModal(new ProgressDialog(root, "Updating jobs"),
+							WindowConstants.DO_NOTHING_ON_CLOSE)
+					: new DummyProgress();
+
+			Set<Job> old = new HashSet<Job>(jobs.getItems());
+			Map<Job, Job> actual;
+			try {
+				actual = manager.getJobs().stream().map(job -> job.update())
+						.collect(Collectors.toMap(job -> job, job -> job));
+			} catch (IOException e) {
+				throw new RuntimeException(e);
+			}
+			for (Job job : old) {
+				if (!actual.containsKey(job)) {
+					jobs.getItems().remove(job);
+				} else {
+					job.update(actual.get(job));
+				}
+			}
+			progress.done();
+			FXFrame.runOnFxThread(() -> {
+				for (Job job : actual.keySet()) {
+					if (!old.contains(job)) {
+						jobs.getItems().add(job);
+					}
+				}
+			});
+		});
+	}
+
+	private void initTable() {
+		setCellValueFactory(0, j -> j.getId() + "");
+		setCellValueFactory(1, j -> j.getState().toString());
+		setCellValueFactory(2, j -> j.getCreationTime().toString());
+		setCellValueFactory(3, j -> j.getStartTime().toString());
+		setCellValueFactory(4, j -> j.getEndTime().toString());
+	}
+
+	@SuppressWarnings("unchecked")
+	private void setCellValueFactory(int index, Function<Job, String> mapper) {
+		((TableColumn<Job, String>) jobs.getColumns().get(index))
+				.setCellValueFactory(f -> new ObservableValueAdapter<Job, String>(f.getValue(), mapper));
+
+	}
+
+	private interface P_JobAction {
+		public void doAction(Progress p) throws IOException;
+	}
+
+	private void dispose() {
+		executorService.shutdown();
+		timer.cancel();
+	}
 }
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIMWindow.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIMWindow.java
index 206e707499937f08a6cfba9bfa30f77c6657d0be..b15fadcdc0d6ec5ef6c79c59d235a534f0899b5d 100644
--- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIMWindow.java
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIMWindow.java
@@ -1,16 +1,21 @@
 package cz.it4i.fiji.haas_spim_benchmark.ui;
 
 import java.awt.Frame;
+import java.io.IOException;
 
 import cz.it4i.fiji.haas.ui.FXFrame;
+import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager;
+import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkSPIMParameters;
 
 public class BenchmarkSPIMWindow extends FXFrame<BenchmarkSPIMController> {
 
 	private static final long serialVersionUID = 1L;
 
-	public BenchmarkSPIMWindow(Frame applicationFrame) {
+	public BenchmarkSPIMWindow(Frame applicationFrame, BenchmarkSPIMParameters params) throws IOException {
 		super(applicationFrame, "/cz/it4i/fiji/haas_spim_benchmark/ui/BenchmarkSPIM.fxml");
-		init(x->{});
+		BenchmarkJobManager manager = new BenchmarkJobManager(params);
+		init(controller->controller.setManager(manager));
 	}
 
+	
 }
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/JobOutputView.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/JobOutputView.java
new file mode 100644
index 0000000000000000000000000000000000000000..3da6d260f6756ce10a0dfaf76611d2c21de87e1e
--- /dev/null
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/JobOutputView.java
@@ -0,0 +1,102 @@
+package cz.it4i.fiji.haas_spim_benchmark.ui;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Window;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.util.Arrays;
+import java.util.Timer;
+import java.util.TimerTask;
+import java.util.concurrent.ExecutorService;
+
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.JTextArea;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import cz.it4i.fiji.haas.JobManager.JobSynchronizableFile;
+import cz.it4i.fiji.haas_java_client.SynchronizableFileType;
+import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager.Job;
+
+public class JobOutputView {
+	@SuppressWarnings("unused")
+	private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas_spim_benchmark.ui.JobOutputView.class);
+	private Timer timer;
+	private JDialog theDialog;
+	private JTextArea theText;
+	private Job job;
+	private ExecutorService executor;
+	private long readedChars = 0;
+
+	public JobOutputView(Window parent, ExecutorService executor, Job job, long refreshTimeout) {
+		this.job = job;
+		this.executor = executor;
+		constructFrame(parent);
+		parent.addWindowListener(new WindowAdapter() {
+			@Override
+			public void windowClosed(WindowEvent e) {
+				dispose();
+			}
+		});
+		timer = new Timer();
+		timer.schedule(new TimerTask() {
+			@Override
+			public void run() {
+				updateView();
+			}
+		}, refreshTimeout, refreshTimeout);
+		updateView();
+	}
+
+	private void dispose() {
+		timer.cancel();
+		theDialog.dispose();
+	}
+
+	private void constructFrame(Window parent) {
+		theDialog = new JDialog(parent, "Output of job: " + (job!=null?job.getId():"N/A"));
+		theDialog.setPreferredSize(new Dimension(500, 500));
+		theDialog.setLocation(550, 400);
+		JPanel jPanel = new JPanel(new BorderLayout());
+		theDialog.setContentPane(jPanel);
+        //Create the text area used for output.  Request
+        //enough space for 5 rows and 30 columns.
+        theText = new JTextArea(5, 30);
+        theText.setEditable(false);
+        JScrollPane scrollPane = new JScrollPane(theText);
+
+        //Lay out the main panel.
+        jPanel.setPreferredSize(new Dimension(450, 130));
+        jPanel.add(scrollPane, BorderLayout.CENTER);
+		
+		theDialog.pack();
+		theDialog.addWindowListener(new WindowAdapter() {
+			@Override
+			public void windowClosing(WindowEvent e) {
+				super.windowClosing(e);
+				dispose();
+			}
+		});
+		theDialog.setVisible(true);
+	}
+
+	private void updateView() {
+		executor.execute(() -> {
+			JobSynchronizableFile file = new JobSynchronizableFile(SynchronizableFileType.StandardErrorFile,
+					readedChars);
+			String output;
+			if (job != null) {
+				output = job.getOutput(Arrays.asList(file)).get(0);
+			} else {
+				output = "This is testing line\n";
+			}
+			readedChars += output.length();
+			theText.append(output);
+			theText.setCaretPosition(theText.getDocument().getLength());
+		});
+	}
+}
diff --git a/haas-spim-benchmark/src/main/resources/.gitignore b/haas-spim-benchmark/src/main/resources/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b5285f5f9fb3ae9423696a524c0fcf6c5a8d5d0c
--- /dev/null
+++ b/haas-spim-benchmark/src/main/resources/.gitignore
@@ -0,0 +1 @@
+/configuration.properties
diff --git a/haas-spim-benchmark/src/main/resources/configuration.properties.template b/haas-spim-benchmark/src/main/resources/configuration.properties.template
new file mode 100644
index 0000000000000000000000000000000000000000..892ed0d0a691608a7070d5beb4c3c8e539c074ef
--- /dev/null
+++ b/haas-spim-benchmark/src/main/resources/configuration.properties.template
@@ -0,0 +1,4 @@
+USER_NAME=
+PASSWORD=
+EMAIL=
+PHONE=
\ No newline at end of file
diff --git a/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/.gitignore b/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/BenchmarkSPIMParametersImpl.java b/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/BenchmarkSPIMParametersImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..f9af043a0662da9ee9b5ada72d093ac70d35737d
--- /dev/null
+++ b/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/BenchmarkSPIMParametersImpl.java
@@ -0,0 +1,48 @@
+package cz.it4i.fiji.haas;
+
+import java.nio.file.Path;
+
+import cz.it4i.fiji.haas_java_client.Configuration;
+import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkSPIMParameters;
+
+class BenchmarkSPIMParametersImpl extends Configuration implements BenchmarkSPIMParameters{
+
+	String USER_NAME = "testuser";
+	String PASSWORD = "57f9caaf84";
+
+	String EMAIL = "aaa@vsb.cz";
+	String PHONE = "123456789";
+	
+	
+	private Path workingDirectory;
+	
+	public BenchmarkSPIMParametersImpl(Path workingDirectory) {
+		super("configuration.properties");
+		this.workingDirectory = workingDirectory;
+	}
+
+	@Override
+	public Path workingDirectory() {
+		return workingDirectory;
+	}
+
+	@Override
+	public String username() {
+		return getValue("USER_NAME");
+	}
+
+	@Override
+	public String password() {
+		return getValue("PASSWORD");
+	}
+
+	@Override
+	public String phone() {
+		return getValue("PHONE");
+	}
+
+	@Override
+	public String email() {
+		return getValue("EMAIL");
+	}
+}
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 3a36e0e82d5df1cbd9fd9d3624a35318068d76b4..15c76cad21e1c948a5024d2551232a2952b50ee3 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
@@ -9,73 +9,50 @@ import java.util.Arrays;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import cz.it4i.fiji.haas.JobManager.JobSynchronizableFile;
+import cz.it4i.fiji.haas.ui.DummyProgress;
 import cz.it4i.fiji.haas_java_client.JobState;
 import cz.it4i.fiji.haas_java_client.SynchronizableFileType;
 import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager;
-import net.imagej.updater.util.Progress;
+import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager.Job;
+import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkSPIMParameters;
 
 public class RunBenchmark {
 	private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.RunBenchmark.class);
 
 	public static class CreateJob {
 		public static void main(String[] args) throws IOException {
-			Path p = Paths.get("/tmp/benchmark");
-			if (!Files.exists(p)) {
-				Files.createDirectory(p);
-			}
-			BenchmarkJobManager benchmarkJobManager = new BenchmarkJobManager(p, new P_Progress());
-			long ji = benchmarkJobManager.createJob();
-			log.info("job: " + ji + " created.");
+			BenchmarkJobManager benchmarkJobManager = new BenchmarkJobManager(getBenchmarkSPIMParameters());
+			Job ji = benchmarkJobManager.createJob();
+			log.info("job: " + ji.getId() + " created.");
 		}
 	}
 
 	public static class ProcessJobs {
 		public static void main(String[] args) throws IOException {
-			Path p = Paths.get("/tmp/benchmark");
-			if (!Files.exists(p)) {
-				Files.createDirectory(p);
-			}
-			BenchmarkJobManager benchmarkJobManager = new BenchmarkJobManager(p, new P_Progress());
-			for (long jobId : benchmarkJobManager.getJobs()) {
+			BenchmarkJobManager benchmarkJobManager = new BenchmarkJobManager(getBenchmarkSPIMParameters());
+			for (Job job : benchmarkJobManager.getJobs()) {
 				JobState state;
-				log.info("job: " + jobId + " hasStatus " + (state = benchmarkJobManager.getState(jobId)));
+				log.info("job: " + job.getId() + " hasStatus " + (state = job.getState()));
 				if (state == JobState.Configuring) {
-					benchmarkJobManager.startJob(jobId);
+					job.startJob(new DummyProgress());
 				} else if (state != JobState.Running && state != JobState.Queued) {
-					benchmarkJobManager.downloadData(jobId);
+					job.downloadData(new DummyProgress());
 				} else if (state == JobState.Running) {
-					log.info(benchmarkJobManager.getOutput(jobId,Arrays.asList(
-							new JobManager.JobSynchronizableFile(SynchronizableFileType.StandardErrorFile, 0))).iterator().next());
-				} 
+					JobSynchronizableFile file = new JobSynchronizableFile(SynchronizableFileType.StandardErrorFile, 0);
+					log.info(job.getOutput(Arrays.asList(file)).iterator().next());
+				}
 			}
 		}
 	}
 
-	private static class P_Progress implements Progress {
-
-		@Override
-		public void setTitle(String title) {
-		}
+	
 
-		@Override
-		public void setCount(int count, int total) {
+	private static BenchmarkSPIMParameters getBenchmarkSPIMParameters() throws IOException {
+		Path p = Paths.get("/tmp/benchmark");
+		if (!Files.exists(p)) {
+			Files.createDirectory(p);
 		}
-
-		@Override
-		public void addItem(Object item) {
-		}
-
-		@Override
-		public void setItemCount(int count, int total) {
-		}
-
-		@Override
-		public void itemDone(Object item) {
-		}
-
-		@Override
-		public void done() {
-		}
-
+		return new BenchmarkSPIMParametersImpl(p);
 	}
 }
diff --git a/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/RunView.java b/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/RunView.java
new file mode 100644
index 0000000000000000000000000000000000000000..0ffd4000e349a5801f5b58b9630e7e75be87cea1
--- /dev/null
+++ b/haas-spim-benchmark/src/test/java/cz/it4i/fiji/haas/RunView.java
@@ -0,0 +1,13 @@
+package cz.it4i.fiji.haas;
+
+import java.util.concurrent.Executors;
+
+import javax.swing.JFrame;
+
+import cz.it4i.fiji.haas_spim_benchmark.ui.JobOutputView;
+
+public class RunView {
+	public static void main(String[] args) {
+		new JobOutputView(new JFrame(), Executors.newSingleThreadExecutor(), null, 3000);
+	}
+}
diff --git a/java-scpclient/src/test/java/TestSCP.java b/java-scpclient/src/test/java/TestSCP.java
index 5c20cd53e61f46a0e06f76b1ca474e52d7efc68e..6762e37bdb19ce65089570420175d5dc1355139d 100644
--- a/java-scpclient/src/test/java/TestSCP.java
+++ b/java-scpclient/src/test/java/TestSCP.java
@@ -1,5 +1,4 @@
 import java.io.IOException;
-import java.nio.file.Paths;
 
 import com.jcraft.jsch.JSchException;
 
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..04d107ebb35ec5f9c2122eb7050b5cebb8437d4e
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,34 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
+                             http://maven.apache.org/maven-v4_0_0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <groupId>cz.it4i.fiji</groupId>
+    <artifactId>haas-parent</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>Multi Chapter Simple Parent Project</name>
+    <packaging>pom</packaging>
+    <modules>
+        <module>java-scpclient</module>
+	<module>haas-java-client</module>
+        <module>haas-imagej-client</module>
+	<module>haas-spim-benchmark</module>
+
+    </modules>
+
+    <build>
+        <pluginManagement>
+            <plugins>
+                <plugin>
+                    <groupId>org.apache.maven.plugins</groupId>
+                    <artifactId>maven-compiler-plugin</artifactId>
+                    <configuration>
+                        <source>1.5</source>
+                        <target>1.5</target>
+                    </configuration>
+                </plugin>
+            </plugins>
+        </pluginManagement>
+    </build>
+
+</project>