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 fc57f3e14defa8030552b4f74336a35e696b8e77..7a04defdd4bfa744f0675d447baf1adc8eaae751 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
@@ -6,6 +6,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Calendar;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.List;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
@@ -15,6 +16,7 @@ import java.util.stream.StreamSupport;
 import org.scijava.log.LogService;
 import org.scijava.plugin.Parameter;
 
+import cz.it4i.fiji.haas.JobManager.JobManager4Job;
 import cz.it4i.fiji.haas.JobManager.JobSynchronizableFile;
 import cz.it4i.fiji.haas_java_client.HaaSClient;
 import cz.it4i.fiji.haas_java_client.HaaSClient.UploadingFile;
@@ -48,8 +50,10 @@ public class Job {
 	
 	private PropertyHolder propertyHolder;
 
-	public Job(String name, Path basePath, Supplier<HaaSClient> haasClientSupplier) throws IOException {
-		this(haasClientSupplier);
+	private JobManager4Job jobManager;
+
+	public Job(JobManager4Job jobManager, String name, Path basePath, Supplier<HaaSClient> haasClientSupplier) throws IOException {
+		this(jobManager,haasClientSupplier);
 		HaaSClient client = this.haasClientSupplier.get();
 		long id = client.createJob(name, Collections.emptyList());
 		jobDir = basePath.resolve("" + id);
@@ -63,8 +67,8 @@ public class Job {
 		setProperty(JOB_NAME, name);
 	}
 
-	public Job(Path p, Supplier<HaaSClient> haasClientSupplier) {
-		this(haasClientSupplier);
+	public Job(JobManager4Job jobManager,Path p, Supplier<HaaSClient> haasClientSupplier) {
+		this(jobManager, haasClientSupplier);
 		jobDir = p;
 		propertyHolder = new PropertyHolder(jobDir.resolve(JOB_INFO_FILE));
 	}
@@ -86,8 +90,9 @@ public class Job {
 		client.submitJob(jobId);
 	}
 
-	private Job(Supplier<HaaSClient> haasClientSupplier) {
+	private Job(JobManager4Job jobManager, Supplier<HaaSClient> haasClientSupplier) {
 		this.haasClientSupplier = haasClientSupplier;
+		this.jobManager = jobManager;
 	}
 
 	
@@ -116,7 +121,6 @@ public class Job {
 	}
 
 	public JobState getState() {
-		updateJobInfo();
 		return getJobInfo().getState();
 	}
 
@@ -160,6 +164,23 @@ public class Job {
 		return jobDir;
 	}
 	
+	public boolean remove() {
+		boolean result;
+		if((result = jobManager.remove(this)) && Files.isDirectory(jobDir) ) {
+			List<Path> pathsToDelete;
+			try {
+				pathsToDelete = Files.walk(jobDir).sorted(Comparator.reverseOrder()).collect(Collectors.toList());
+				for(Path path : pathsToDelete) {
+				    Files.deleteIfExists(path);
+				}
+			} catch (IOException e) {
+				log.error(e.getMessage(), e);
+			}
+			
+		}
+		return result;
+	}
+	
 	private JobInfo getJobInfo() {
 		if (jobInfo == null) {
 			updateJobInfo();
@@ -219,4 +240,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 dfcf35493971f9c47eb75adae3ca419102d41bc6..0319efc9237dc0ff9eaca2f6c6f7132771baf7db 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
@@ -4,6 +4,7 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.stream.Collectors;
@@ -20,6 +21,10 @@ import net.imagej.updater.util.Progress;
 
 public class JobManager {
 
+	interface JobManager4Job {
+		boolean remove(Job job);
+	}
+	
 	@SuppressWarnings("unused")
 	private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.JobManager.class);
 
@@ -31,6 +36,14 @@ public class JobManager {
 
 	private Settings settings;
 
+	private JobManager4Job remover = new JobManager4Job() {
+		
+		@Override
+		public boolean remove(Job job) {
+			return jobs.remove(job);
+		}
+	};
+	
 	public JobManager(Path workDirectory, Settings settings) {
 		this.workDirectory = workDirectory;
 		this.settings = settings;
@@ -41,7 +54,7 @@ public class JobManager {
 		if (jobs == null) {
 			jobs = new LinkedList<>();
 		}
-		jobs.add(job = new Job(settings.getJobName(), workDirectory, this::getHaasClient));
+		jobs.add(job = new Job(remover, settings.getJobName(), workDirectory, this::getHaasClient));
 		return job;
 	}
 
@@ -57,14 +70,14 @@ public class JobManager {
 			jobs = new LinkedList<>();
 			try {
 				Files.list(this.workDirectory).filter(p -> Files.isDirectory(p) && Job.isJobPath(p)).forEach(p -> {
-						jobs.add(new Job(p, this::getHaasClient));
+						jobs.add(new Job(remover, p, this::getHaasClient));
 					
 				});
 			} catch (IOException e) {
-				throw new RuntimeException(e);
+				log.error(e.getMessage(),e);
 			}
 		}
-		return jobs.stream().collect(Collectors.toList());
+		return Collections.unmodifiableCollection(jobs);
 	}
 
 	public void downloadJob(Long id, Progress notifier) {
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 ada57f4df3f4bd9cf3fe995a7929e562607fbb2a..abd2d4ec3d4816db0201e8a5dcd67bdd4c796896 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
@@ -13,12 +13,14 @@ public class ObservableValueRegistry<T> {
 
 	private Function<T,UpdateStatus> updateFunction;
 	private Consumer<T> removeConsumer;
+	private Function<T, Object> stateProvider;
 	
 	
-	public ObservableValueRegistry(Function<T, UpdateStatus> updateFunction,
+	public ObservableValueRegistry(Function<T, UpdateStatus> updateFunction,Function<T,Object> stateProvider,
 			Consumer<T> removeConsumer) {
 		super();
 		this.updateFunction = updateFunction;
+		this.stateProvider = stateProvider;
 		this.removeConsumer = t-> {
 			removeConsumer.accept(t);
 			remove(t);
@@ -29,16 +31,16 @@ public class ObservableValueRegistry<T> {
 	private Map<T,UpdatableObservableValue<T>> map = new HashMap<>(); 
 	
 	public  ObservableValue<T> addIfAbsent(T value) {
-		UpdatableObservableValue<T> uov = map.computeIfAbsent(value, v-> new UpdatableObservableValue<T>(v, updateFunction));
+		UpdatableObservableValue<T> uov = map.computeIfAbsent(value, v-> new UpdatableObservableValue<T>(v, updateFunction, stateProvider));
 		return uov;
 	}
 	
-	public ObservableValue<T> get(T value) {
+	public UpdatableObservableValue<T> get(T value) {
 		return map.get(value);
 	}
 	
-	private ObservableValue<T> remove(T value) {
-		return map.get(value);
+	protected ObservableValue<T> remove(T value) {
+		return map.remove(value);
 	}
 	
 	public void update() {
@@ -48,4 +50,8 @@ public class ObservableValueRegistry<T> {
 			}
 		}
 	}
+	
+	protected void setUpdateFunction(Function<T, UpdateStatus> updateFunction) {
+		this.updateFunction = updateFunction;
+	}
 }
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
index 78acda8aa157379f6f30299a2e06635c76995a6e..1fbcf4eed3fb2bf331ab8d0e68c7463ddb379c5d 100644
--- 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
@@ -5,6 +5,9 @@ import java.util.LinkedList;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import javafx.event.EventHandler;
 import javafx.scene.control.ContextMenu;
 import javafx.scene.control.MenuItem;
@@ -12,6 +15,8 @@ import javafx.scene.control.TableView;
 import javafx.scene.input.ContextMenuEvent;
 
 public class TableViewContextMenu<T> {
+	@SuppressWarnings("unused")
+	private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.ui.TableViewContextMenu.class);
 	private Collection<P_MenuItem> items = new LinkedList<TableViewContextMenu<T>.P_MenuItem>();
 	private ContextMenu cm;
 	private TableView<T> tableView;
@@ -24,6 +29,7 @@ public class TableViewContextMenu<T> {
 			@Override
 			public void handle(ContextMenuEvent event) {
 				T selected = getSelectedItem();
+				
 				for (P_MenuItem item : items) {
 					item.updateEnable(selected);
 				}
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/UpdatableObservableValue.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/UpdatableObservableValue.java
index 41c9dedab6674af2303bd664c8a2f5ec23edb0d1..c1cb5c2295529e68bf04583ed6dee602bddaa7ec 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/UpdatableObservableValue.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/UpdatableObservableValue.java
@@ -4,46 +4,58 @@ import java.util.function.Function;
 
 import javafx.beans.value.ObservableValueBase;
 
-public class UpdatableObservableValue<T> extends ObservableValueBase<T>{
+public class UpdatableObservableValue<T> extends ObservableValueBase<T> {
 
 	public enum UpdateStatus {
-		Deleted,
-		Updated,
-		NotUpdated
+		Deleted, Updated, NotUpdated
 	}
-	
+
 	private T wrapped;
-	private Function<T,UpdateStatus> updateFunction;
-	
-	
-	public UpdatableObservableValue(T wrapped, Function<T, UpdateStatus> updateFunction) {
+	private Function<T, UpdateStatus> updateFunction;
+	private Object oldState;
+	private Function<T, Object> stateProvider;
+
+	public UpdatableObservableValue(T wrapped, Function<T, UpdateStatus> updateFunction,
+			Function<T, Object> stateProvider) {
 		super();
 		this.wrapped = wrapped;
 		this.updateFunction = updateFunction;
-		
+		this.stateProvider = stateProvider;
+		oldState = stateProvider.apply(wrapped);
 	}
 
 	@Override
 	public T getValue() {
-		
+
 		return wrapped;
 	}
 
 	public UpdateStatus update() {
 		UpdateStatus status = updateFunction.apply(wrapped);
+		Object state = stateProvider.apply(wrapped);
+		boolean fire = true;
 		switch (status) {
+		case NotUpdated:
+			fire = false;
+			if (oldState == null && state != null || oldState != null && (state == null || !oldState.equals(state))) {
+				fire = true;
+			}
 		case Updated:
-			fireValueChangedEvent();
+			oldState = state;
+			if (fire) {
+				fireValueChangedEvent();
+			}
 		default:
 			return status;
 		}
 
 	}
+
 	@Override
 	public int hashCode() {
 		return wrapped.hashCode();
 	}
-	
+
 	@Override
 	public boolean equals(Object obj) {
 		if (this == obj)
@@ -61,6 +73,5 @@ public class UpdatableObservableValue<T> extends ObservableValueBase<T>{
 			return false;
 		return true;
 	}
-	
-	
+
 }
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 473f25510165e0f98d88f9fcc7aeb0a347a9b4dd..c029a6e5956735e09d6869c64773f9ccc4347fec 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
@@ -199,6 +199,10 @@ public class BenchmarkJobManager {
 			String downloadedStr = job.getProperty(JOB_HAS_DATA_TO_DOWNLOAD_PROPERTY);
 			return downloadedStr != null && Boolean.parseBoolean(downloadedStr);
 		}
+
+		public boolean remove() {
+			return job.remove();
+		}
 	}
 
 	public BenchmarkJobManager(BenchmarkSPIMParameters params) throws IOException {
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 7606d57caa4eba642e00cdd97fab09108ea5665a..71dda4adab8df4e70b219d3806800c23bf823a5a 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
@@ -97,9 +97,10 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
 	private void initMenu() {
 		TableViewContextMenu<ObservableValue<BenchmarkJob>> menu = new TableViewContextMenu<>(jobs);
 		menu.addItem("Create job", x -> executeWSCallAsync("Creating job", p -> manager.createJob()), j -> true);
-		menu.addItem("Start job", job -> executeWSCallAsync("Starting job", p -> job.getValue().startJob(p)),
-				job -> notNullValue(job,
-						j -> j.getState() == JobState.Configuring || j.getState() == JobState.Finished));
+		menu.addItem("Start job", job -> executeWSCallAsync("Starting job", p -> {
+			job.getValue().startJob(p);
+			registry.get(job.getValue()).update();
+		}), job -> notNullValue(job, j -> j.getState() == JobState.Configuring || j.getState() == JobState.Finished));
 
 		menu.addItem("Show progress", job -> {
 			try {
@@ -123,7 +124,7 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
 				j -> new JobOutputView(root, executorServiceUI, j.getValue(), 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.getValue()), x -> true);
+		menu.addItem("Open", j -> open(j.getValue()), x -> notNullValue(x, j -> true));
 		menu.addItem("Update table", job -> updateJobs(), j -> true);
 
 	}
@@ -162,14 +163,13 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
 
 	private void updateJobs(boolean showProgress) {
 		executorServiceWS.execute(() -> {
+			Progress progress = showProgress
+					? ModalDialogs.doModal(new ProgressDialog(root, "Updating jobs"),
+							WindowConstants.DO_NOTHING_ON_CLOSE)
+					: new DummyProgress();
 
 			registry.update();
-			executorServiceUI.execute(() -> {
-				Progress progress = showProgress
-						? ModalDialogs.doModal(new ProgressDialog(root, "Updating jobs"),
-								WindowConstants.DO_NOTHING_ON_CLOSE)
-						: new DummyProgress();
-
+			executorServiceFX.execute(() -> {
 				try {
 					Collection<BenchmarkJob> jobs = manager.getJobs();
 					Set<ObservableValue<BenchmarkJob>> actual = new HashSet<>(this.jobs.getItems());
@@ -184,13 +184,12 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
 				}
 
 				progress.done();
-
 			});
 		});
 	}
 
 	private void initTable() {
-		registry = new ObservableBenchmarkJobRegistry(bj -> jobs.getItems().remove(registry.get(bj)));
+		registry = new ObservableBenchmarkJobRegistry(bj -> remove(bj));
 		setCellValueFactory(0, j -> j.getId() + "");
 		setCellValueFactory(1, j -> j.getState().toString());
 		setCellValueFactory(2, j -> j.getCreationTime().toString());
@@ -198,6 +197,12 @@ public class BenchmarkSPIMController implements FXFrame.Controller {
 		setCellValueFactory(4, j -> j.getEndTime().toString());
 	}
 
+	private void remove(BenchmarkJob bj) {
+
+		jobs.getItems().remove(registry.get(bj));
+		bj.remove();
+	}
+
 	private void setCellValueFactory(int index, Function<BenchmarkJob, String> mapper) {
 		FXFrame.Controller.setCellValueFactory(jobs, index, mapper);
 	}
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/ObservableBenchmarkJobRegistry.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/ObservableBenchmarkJobRegistry.java
index 93a0664514d743387e4a45486315ae69ed27221b..4c4b86316d97b743ce8128c45f94958bdadaf9dd 100644
--- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/ObservableBenchmarkJobRegistry.java
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/ObservableBenchmarkJobRegistry.java
@@ -11,7 +11,7 @@ import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager.BenchmarkJob;
 public class ObservableBenchmarkJobRegistry extends ObservableValueRegistry<BenchmarkJob> {
 
 	public ObservableBenchmarkJobRegistry(Consumer<BenchmarkJob> removeConsumer) {
-		super(t -> update(t), removeConsumer);
+		super(t -> update(t), t -> t.getState(), removeConsumer);
 	}
 
 	private static UpdateStatus update(BenchmarkJob t) {
@@ -20,7 +20,9 @@ public class ObservableBenchmarkJobRegistry extends ObservableValueRegistry<Benc
 		if (!Files.isDirectory(t.getDirectory())) {
 			return UpdateStatus.Deleted;
 		}
-		return oldState != t.getState() ? UpdateStatus.Updated : UpdateStatus.NotUpdated;
+		UpdateStatus result = oldState != t.getState() ? UpdateStatus.Updated : UpdateStatus.NotUpdated;
+
+		return result;
 	}
 
 }
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/ObservableTaskRegistry.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/ObservableTaskRegistry.java
index 595a057f5640d53d22c6d10745169da585a5e0ea..2ff86a61823ec4bc938bb8d28a8c17db6b99bcfd 100644
--- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/ObservableTaskRegistry.java
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/ObservableTaskRegistry.java
@@ -1,6 +1,7 @@
 package cz.it4i.fiji.haas_spim_benchmark.ui;
 
 import java.util.function.Consumer;
+import java.util.stream.Collectors;
 
 import cz.it4i.fiji.haas.ui.ObservableValueRegistry;
 import cz.it4i.fiji.haas.ui.UpdatableObservableValue.UpdateStatus;
@@ -11,7 +12,7 @@ import cz.it4i.fiji.haas_spim_benchmark.core.TaskComputation;
 public class ObservableTaskRegistry extends ObservableValueRegistry<Task> {
 
 	public ObservableTaskRegistry(Consumer<Task> removeConsumer) {
-		super(t -> update(t), removeConsumer);
+		super(t -> update(t),t->t.getComputations().stream().map(tc->tc.getState()).collect(Collectors.toList()), removeConsumer);
 	}
 
 	private static UpdateStatus update(Task t) {