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 aae1edd108273f5c0373a786f85c77e709ca6786..555b1742666d9791de536e8219ca6154c3808a30 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
@@ -247,6 +247,10 @@ public class Job {
 		return haasClientSupplier.get().getChangedFiles(getId());
 	}
 
+	public void cancelJob() {
+		haasClientSupplier.get().cancelJob(jobId);
+	}
+
 	
 
 	
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 97c7d31ef4b95b06af252393f7e63a9d297df049..ee99ce1340dd6f746d13491da8a5f2431f1f0857 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
@@ -314,6 +314,14 @@ public class HaaSClient {
 	}
 	
 	
+	public void cancelJob(Long jobId) {
+		try {
+			getJobManagement().cancelJob(jobId, getSessionID());
+		} catch (RemoteException | ServiceException e) {
+			throw new HaaSClientException(e);
+		}
+	}
+
 	private void doSubmitJob(long jobId) throws RemoteException, ServiceException {
 		getJobManagement().submitJob(jobId, getSessionID());
 	}
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 54e47a725e4c1abb97015b31b8717e6524c83b0c..dadc29e2bf1132f0b81a2c78d38dbdd811612dfc 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
@@ -100,7 +100,7 @@ public class BenchmarkJobManager {
 			if (job.getState() == JobState.Finished) {
 				String filePattern = job.getProperty(SPIM_OUTPUT_FILENAME_PATTERN);
 				job.download(downloadFinishedData(filePattern), progress);
-			} else if (job.getState() == JobState.Failed) {
+			} else if (job.getState() == JobState.Failed ||  job.getState() == JobState.Canceled) {
 				job.download(downloadFailedData(), progress);
 			}
 			
@@ -214,6 +214,10 @@ public class BenchmarkJobManager {
 		public boolean remove() {
 			return job.remove();
 		}
+
+		public void cancelJob() {
+			job.cancelJob();
+		}
 		
 	}
 
@@ -289,9 +293,8 @@ public class BenchmarkJobManager {
 			Path path = getPathSafely(name);
 			if (path == null)
 				return false;
-			
 			return path.getFileName().toString().startsWith("snakejob.")
-					|| path.getParent().getFileName().toString().equals("logs");
+					|| path.getParent() != null && path.getParent().getFileName() != null && path.getParent().getFileName().toString().equals("logs");
 		};
 	}
 	
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 71dda4adab8df4e70b219d3806800c23bf823a5a..d08a89d16610446c5062092724d702cccdb38e17 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
@@ -102,6 +102,11 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
 			registry.get(job.getValue()).update();
 		}), job -> notNullValue(job, j -> j.getState() == JobState.Configuring || j.getState() == JobState.Finished));
 
+		menu.addItem("Cancel job", job -> executeWSCallAsync("Canceling job", p -> {
+			job.getValue().cancelJob();
+			registry.get(job.getValue()).update();
+		}), job -> notNullValue(job, j -> j.getState() == JobState.Running));
+
 		menu.addItem("Show progress", job -> {
 			try {
 				new SPIMPipelineProgressViewWindow(root, job.getValue()).setVisible(true);
@@ -115,7 +120,8 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
 		menu.addItem("Download result",
 				job -> executeWSCallAsync("Downloading data", p -> job.getValue().downloadData(p)),
 				job -> notNullValue(job,
-						j -> EnumSet.of(JobState.Failed, JobState.Finished).contains(j.getState()) && !j.downloaded()));
+						j -> EnumSet.of(JobState.Failed, JobState.Finished, JobState.Canceled).contains(j.getState())
+								&& !j.downloaded()));
 		menu.addItem("Download statistics",
 				job -> executeWSCallAsync("Downloading data", p -> job.getValue().downloadStatistics(p)),
 				job -> notNullValue(job, j -> j.getState() == JobState.Finished));
@@ -148,8 +154,11 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
 		FXFrame.Controller.executeAsync(executorServiceWS, (Callable<Void>) () -> {
 			ProgressDialog dialog = ModalDialogs.doModal(new ProgressDialog(root, title),
 					WindowConstants.DO_NOTHING_ON_CLOSE);
-			action.doAction(dialog);
-			dialog.done();
+			try {
+				action.doAction(dialog);
+			} finally {
+				dialog.done();
+			}
 			return null;
 		}, x -> {
 			if (update)