diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/JavaFXRoutines.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/JavaFXRoutines.java
index 636c4583731fe801217c1af599006cc2aef04e5e..c476384c79700501471a51b193a0ea5bfc185d04 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/JavaFXRoutines.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/ui/JavaFXRoutines.java
@@ -21,6 +21,7 @@ import javafx.scene.control.TableColumn;
 import javafx.scene.control.TableRow;
 import javafx.scene.control.TableView;
 import javafx.scene.paint.Color;
+import javafx.util.Callback;
 
 public interface JavaFXRoutines {
 
@@ -62,7 +63,15 @@ public interface JavaFXRoutines {
 			Function<U, V> mapper) {
 		((TableColumn<T, V>) tableView.getColumns().get(index))
 				.setCellValueFactory(f -> new ObservableValueAdapter<>(f.getValue(), mapper));
+	}
 
+	@SuppressWarnings("unchecked")
+	static public <T, V> void setCellValueFactoryForList(TableView<T> tableView,
+		int index,
+		Callback<TableColumn.CellDataFeatures<T, V>, ObservableValue<V>> callback)
+	{
+		((TableColumn<T, V>) tableView.getColumns().get(index)).setCellValueFactory(
+			callback);
 	}
 
 	static public RunnableFuture<Void> runOnFxThread(Runnable runnable) {
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/SPIMPipelineProgressViewController.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/SPIMPipelineProgressViewController.java
index 3279d61abc565f35f84f2e9a76a735c3c41f6399..e37ce5d0127b139bf05460dd2e7267df317e4dcf 100644
--- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/SPIMPipelineProgressViewController.java
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/SPIMPipelineProgressViewController.java
@@ -9,7 +9,6 @@ import java.util.Optional;
 import java.util.concurrent.Executor;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
-import java.util.function.Function;
 import java.util.stream.Collectors;
 
 import javax.swing.WindowConstants;
@@ -34,7 +33,6 @@ import cz.it4i.fiji.haas_spim_benchmark.core.SimpleObservableList;
 import cz.it4i.fiji.haas_spim_benchmark.core.SimpleObservableValue;
 import cz.it4i.fiji.haas_spim_benchmark.core.Task;
 import cz.it4i.fiji.haas_spim_benchmark.core.TaskComputation;
-import javafx.beans.value.ObservableValue;
 import javafx.collections.ListChangeListener;
 import javafx.fxml.FXML;
 import javafx.scene.control.TableColumn;
@@ -74,7 +72,7 @@ public class SPIMPipelineProgressViewController extends BorderPane implements Cl
 	}
 
 	@FXML
-	private TableView<ObservableValue<Task>> tasks;
+	private TableView<Task> tasks;
 
 	private SimpleObservableList<Task> observedValue;
 
@@ -134,54 +132,52 @@ public class SPIMPipelineProgressViewController extends BorderPane implements Cl
 		JavaFXRoutines.initRootAndController("SPIMPipelineProgressView.fxml", this);
 		tasks.setPrefWidth(PREFERRED_WIDTH);
 
-		TableViewContextMenu<ObservableValue<Task>> menu =
-			new TableViewContextMenu<>(this.tasks);
+		TableViewContextMenu<Task> menu = new TableViewContextMenu<>(this.tasks);
 		menu.addItem("Open view", (task, columnIndex) -> proof(task, columnIndex), (
 			x, columnIndex) -> check(x, columnIndex));
 	}
 
-	private boolean check(ObservableValue<Task> x, Integer columnIndex) {
-		boolean result = x != null && 0 < columnIndex &&columnIndex - 1 < x.getValue().getComputations().size();
+	private boolean check(Task x, Integer columnIndex) {
+		boolean result = x != null && 0 < columnIndex && columnIndex - 1 < x
+			.getComputations().size();
 		return result;
 	}
 
-	private void proof(ObservableValue<Task> task, int columnIndex) {
-		ModalDialogs.doModal(new TaskComputationWindow(root, task.getValue().getComputations().get(columnIndex - 1)),
-				WindowConstants.DISPOSE_ON_CLOSE);
+	private void proof(Task task, int columnIndex) {
+		ModalDialogs.doModal(new TaskComputationWindow(root, task.getComputations()
+			.get(columnIndex - 1)), WindowConstants.DISPOSE_ON_CLOSE);
 	}
 
 	private synchronized void fillTable() {
 		if (closed) {
 			return;
 		}
-		final List<Task> processedTasks = observedValue;
 
-		final Optional<List<TaskComputation>> optional = processedTasks.stream()
-			.map(task -> task.getComputations()).collect(Collectors
+		final Optional<List<TaskComputation>> optional = observedValue.stream().map(
+			task -> task.getComputations()).collect(Collectors
 				.<List<TaskComputation>> maxBy((a, b) -> a.size() - b.size()));
 		if (!optional.isPresent()) {
 			return;
 		}
 		final List<TaskComputation> computations = optional.get();
-		final List<ObservableValue<Task>> taskList = (processedTasks.stream().map(
-			task -> new SimpleObservableValue<>(task)).collect(Collectors.toList()));
+
 		executorFx.execute(() -> {
 			int i = 0;
-			JavaFXRoutines.setCellValueFactory(this.tasks, i++,
-				(Function<Task, String>) v -> Constants.BENCHMARK_TASK_NAME_MAP.get(v
-					.getDescription()));
+			JavaFXRoutines.setCellValueFactoryForList(this.tasks, i++,
+				f -> new SimpleObservableValue<>(Constants.BENCHMARK_TASK_NAME_MAP.get(f
+					.getValue().getDescription())));
 
 			double tableColumnWidth = computeTableColumnWidth(computations);
 			for (TaskComputation tc : computations) {
-				TableColumn<ObservableValue<Task>, String> tableCol;
+				TableColumn<Task, String> tableCol;
 				this.tasks.getColumns().add(tableCol = new TableColumn<>(columnHeader(
 					tc)));
 				int index = i++;
 				tableCol.setPrefWidth(tableColumnWidth);
 				constructCellFactory(index);
 			}
-			
-			this.tasks.getItems().addAll(taskList);
+
+			this.tasks.setItems(observedValue);
 		});
 	}
 
@@ -204,13 +200,14 @@ public class SPIMPipelineProgressViewController extends BorderPane implements Cl
 
 	@SuppressWarnings("unchecked")
 	private void constructCellFactory(int index) {
-		JavaFXRoutines.setCellValueFactory(this.tasks, index, (Function<Task, TaskComputation>) v -> {
-			if (v.getComputations().size() >= index) {
-				return v.getComputations().get(index - 1);
-			} 
+		JavaFXRoutines.setCellValueFactoryForList(this.tasks, index, f -> {
+			if (f.getValue().getComputations().size() >= index) {
+				return new SimpleObservableValue<>(f.getValue().getComputations().get(
+					index - 1));
+			}
 			return null;
 		});
-		((TableColumn<ObservableValue<Task>, TaskComputation>) this.tasks.getColumns().get(index))
+		((TableColumn<Task, TaskComputation>) this.tasks.getColumns().get(index))
 				.setCellFactory(column -> new TableCellAdapter<>((cell, val, empty) -> {
 					if (val == null || empty) {
 						cell.setText(EMPTY_VALUE);