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 cebf0413a7105738a3f1efa9e52b6117f5fcfc50..bfeb1da43d8ead3e7d91b20bbb03cd62b3cdb7a8 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
@@ -1,3 +1,4 @@
+
 package cz.it4i.fiji.haas;
 
 import java.io.IOException;
@@ -24,6 +25,7 @@ import org.slf4j.LoggerFactory;
 import cz.it4i.fiji.haas.JobManager.JobManager4Job;
 import cz.it4i.fiji.haas.JobManager.JobSynchronizableFile;
 import cz.it4i.fiji.haas.data_transfer.Synchronization;
+import cz.it4i.fiji.haas_java_client.FileTransferInfo;
 import cz.it4i.fiji.haas_java_client.HaaSClient;
 import cz.it4i.fiji.haas_java_client.HaaSFileTransfer;
 import cz.it4i.fiji.haas_java_client.JobInfo;
@@ -408,57 +410,72 @@ public class Job {
 		return outputDirectory;
 	}
 
+	public List<FileTransferInfo> getFileTransferInfo() {
+		return synchronization.getFileTransferInfo();
+	}
+
 	private void storeInputOutputDirectory() {
 		if (inputDirectory == null) {
 			useDemoData = true;
 			propertyHolder.setValue(JOB_USE_DEMO_DATA, "" + useDemoData);
-		} else {
+		}
+		else {
 			storeDataDirectory(JOB_INPUT_DIRECTORY_PATH, inputDirectory);
 		}
 		storeDataDirectory(JOB_OUTPUT_DIRECTORY_PATH, outputDirectory);
 	}
 
-	private void storeDataDirectory(String directoryPropertyName, Path directory) {
+	private void storeDataDirectory(final String directoryPropertyName,
+		final Path directory)
+	{
 		if (!jobDir.equals(directory)) {
 			propertyHolder.setValue(directoryPropertyName, directory.toString());
 		}
 	}
 
-	private Path getDataDirectory(String typeOfDirectory, Path jobDirectory) {
-		String directory = propertyHolder.getValue(typeOfDirectory);
+	private Path getDataDirectory(final String typeOfDirectory,
+		final Path jobDirectory)
+	{
+		final String directory = propertyHolder.getValue(typeOfDirectory);
 		return directory != null ? Paths.get(directory) : jobDirectory;
 	}
 
-	private boolean getSafeBoolean(String value) {
+	private boolean getSafeBoolean(final String value) {
 		return value != null ? Boolean.parseBoolean(value) : false;
 	}
 
-	private void setJobDirectory(Path jobDirectory, Function<Path, Path> inputDirectoryProvider,
-			Function<Path, Path> outputDirectoryProvider) {
+	private void setJobDirectory(final Path jobDirectory,
+		final Function<Path, Path> inputDirectoryProvider,
+		final Function<Path, Path> outputDirectoryProvider)
+	{
 		this.jobDir = jobDirectory;
 
 		try {
-			this.synchronization = new Synchronization(() -> startFileTransfer(HaaSClient.DUMMY_TRANSFER_FILE_PROGRESS),
-					jobDir, this.inputDirectory = inputDirectoryProvider.apply(jobDir),
-					this.outputDirectory = outputDirectoryProvider.apply(jobDir), () -> {
-						setProperty(JOB_NEEDS_UPLOAD, false);
-						setUploaded(true);
-					}, () -> {
-						setDownloaded(true);
-						setProperty(JOB_NEEDS_DOWNLOAD, false);
-						setCanBeDownloaded(false);
-					}, p -> jobManager.canUpload(Job.this, p));
-		} catch (IOException e) {
+			this.synchronization = new Synchronization(() -> startFileTransfer(
+				HaaSClient.DUMMY_TRANSFER_FILE_PROGRESS), jobDir, this.inputDirectory =
+					inputDirectoryProvider.apply(jobDir), this.outputDirectory =
+						outputDirectoryProvider.apply(jobDir), () -> {
+							setProperty(JOB_NEEDS_UPLOAD, false);
+							setUploaded(true);
+						}, () -> {
+							setDownloaded(true);
+							setProperty(JOB_NEEDS_DOWNLOAD, false);
+							setCanBeDownloaded(false);
+						}, p -> jobManager.canUpload(Job.this, p));
+		}
+		catch (final IOException e) {
 			log.error(e.getMessage(), e);
 			throw new RuntimeException(e);
 		}
 	}
 
-	private HaaSFileTransfer startFileTransfer(TransferFileProgress progress) {
+	private HaaSFileTransfer startFileTransfer(
+		final TransferFileProgress progress)
+	{
 		return haasClientSupplier.get().startFileTransfer(getId(), progress);
 	}
 
-	private void setName(String name) {
+	private void setName(final String name) {
 		setProperty(JOB_NAME, name);
 	}
 
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/PersistentIndex.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/PersistentIndex.java
index 0a3049c93589c41392f4aa3463a21ac2ae7ab9a9..87128623dd443042d8a1ea2c88de42b01c466256 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/PersistentIndex.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/PersistentIndex.java
@@ -1,3 +1,4 @@
+
 package cz.it4i.fiji.haas.data_transfer;
 
 import java.io.BufferedReader;
@@ -5,8 +6,8 @@ import java.io.BufferedWriter;
 import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
+import java.util.Collections;
 import java.util.LinkedHashSet;
-import java.util.Queue;
 import java.util.Set;
 import java.util.function.Function;
 
@@ -45,10 +46,10 @@ public class PersistentIndex<T> {
 		indexedFiles.remove(p);
 	}
 
-	public synchronized void fillQueue(Queue<T> toUpload) {
-		toUpload.addAll(indexedFiles);
+	public synchronized Set<T> getIndexedItems() {
+		return Collections.unmodifiableSet(indexedFiles);
 	}
-	
+
 	public synchronized void clear() throws IOException {
 		indexedFiles.clear();
 		storeToWorkingFile();
@@ -60,7 +61,7 @@ public class PersistentIndex<T> {
 
 	private void loadFromWorkingFile() throws IOException {
 		indexedFiles.clear();
-		if(Files.exists(workingFile)) {
+		if (Files.exists(workingFile)) {
 			try (BufferedReader br = Files.newBufferedReader(workingFile)) {
 				String line;
 				while (null != (line = br.readLine())) {
@@ -74,5 +75,4 @@ public class PersistentIndex<T> {
 		indexedFiles.add(fromStringConvertor.apply(line));
 	}
 
-	
 }
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/PersistentSynchronizationProcess.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/PersistentSynchronizationProcess.java
index 62fc6f9181f2a0ab4e8adebe5570ecc86d288949..e1ad9758dc6ec55b43bbc1b559d1be64078224d3 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/PersistentSynchronizationProcess.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/PersistentSynchronizationProcess.java
@@ -88,10 +88,14 @@ public abstract class PersistentSynchronizationProcess<T> {
 	}
 
 	public void resume() {
-		index.fillQueue(toProcessQueue);
+		toProcessQueue.addAll(index.getIndexedItems());
 		runner.runIfNotRunning(this::doProcess);
 	}
 
+	public Set<T> getIndexedItems() {
+		return index.getIndexedItems();
+	}
+
 	public void setNotifier(ProgressNotifier notifier) {
 		this.notifier = notifier;
 	}
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/Synchronization.java b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/Synchronization.java
index 115e1d4489efb78de011f1d7c243bcdd3a8611ac..6f66da29169add2569667031f9bf43d40d39632e 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/Synchronization.java
+++ b/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/Synchronization.java
@@ -1,3 +1,4 @@
+
 package cz.it4i.fiji.haas.data_transfer;
 
 import java.io.Closeable;
@@ -10,6 +11,7 @@ import java.nio.file.Paths;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
+import java.util.List;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -21,6 +23,8 @@ import java.util.stream.StreamSupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import cz.it4i.fiji.haas_java_client.FileTransferInfo;
+import cz.it4i.fiji.haas_java_client.FileTransferState;
 import cz.it4i.fiji.haas_java_client.HaaSFileTransfer;
 import cz.it4i.fiji.haas_java_client.ProgressNotifier;
 import cz.it4i.fiji.haas_java_client.UploadingFile;
@@ -31,9 +35,9 @@ public class Synchronization implements Closeable {
 	public static final Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.data_transfer.Synchronization.class);
 
 	private static final String FILE_INDEX_TO_UPLOAD_FILENAME = ".toUploadFiles";
-
-	private static final String FILE_INDEX_TO_DOWNLOAD_FILENAME = ".toDownloadFiles";
-
+	private static final String FILE_INDEX_UPLOADED_FILENAME = ".uploaded";
+	private static final String FILE_INDEX_TO_DOWNLOAD_FILENAME =
+		".toDownloadFiles";
 	private static final String FILE_INDEX_DOWNLOADED_FILENAME = ".downloaded";
 
 	private final Path workingDirectory;
@@ -44,6 +48,8 @@ public class Synchronization implements Closeable {
 
 	private final PersistentIndex<Path> filesDownloaded;
 
+	private final PersistentIndex<Path> filesUploaded;
+
 	private final PersistentSynchronizationProcess<Path> uploadProcess;
 
 	private final P_PersistentDownloadProcess downloadProcess;
@@ -59,10 +65,14 @@ public class Synchronization implements Closeable {
 		this.inputDirectory = inputDirectory;
 		this.outputDirectory = outputDirectory;
 		this.service = Executors.newFixedThreadPool(2);
-		this.filesDownloaded = new PersistentIndex<>(workingDirectory.resolve(FILE_INDEX_DOWNLOADED_FILENAME),
-				name -> Paths.get(name));
-		this.uploadProcess = createUploadProcess(fileTransferSupplier, service, uploadFinishedNotifier);
-		this.downloadProcess = createDownloadProcess(fileTransferSupplier, service, downloadFinishedNotifier);
+		this.filesDownloaded = new PersistentIndex<>(workingDirectory.resolve(
+			FILE_INDEX_DOWNLOADED_FILENAME), name -> Paths.get(name));
+		this.filesUploaded = new PersistentIndex<>(workingDirectory.resolve(
+			FILE_INDEX_UPLOADED_FILENAME), name -> Paths.get(name));
+		this.uploadProcess = createUploadProcess(fileTransferSupplier, service,
+			uploadFinishedNotifier);
+		this.downloadProcess = createDownloadProcess(fileTransferSupplier, service,
+			downloadFinishedNotifier);
 		this.uploadFilter = uploadFilter;
 	}
 
@@ -100,6 +110,17 @@ public class Synchronization implements Closeable {
 		this.downloadProcess.resume();
 	}
 
+	public List<FileTransferInfo> getFileTransferInfo() {
+		final List<FileTransferInfo> list = new LinkedList<>();
+		filesUploaded.getIndexedItems().forEach(ii -> {
+			list.add(new FileTransferInfo(ii, FileTransferState.Finished));
+		});
+		uploadProcess.getIndexedItems().forEach(ii -> {
+			list.add(new FileTransferInfo(ii, FileTransferState.Queuing));
+		});
+		return list;
+	}
+
 	@Override
 	public void close() {
 		service.shutdown();
@@ -127,9 +148,18 @@ public class Synchronization implements Closeable {
 			}
 
 			@Override
-			protected void processItem(HaaSFileTransfer tr, Path p) throws InterruptedIOException {
-				UploadingFile uf = new UploadingFileImpl(p);
+			protected void processItem(final HaaSFileTransfer tr, final Path p)
+				throws InterruptedIOException
+			{
+				final UploadingFile uf = new UploadingFileImpl(p);
 				tr.upload(uf);
+				filesUploaded.insert(inputDirectory.resolve(p.toString()));
+				try {
+					filesUploaded.storeToWorkingFile();
+				}
+				catch (final IOException e) {
+					log.error(e.getMessage(), e);
+				}
 			}
 
 			@Override
@@ -172,14 +202,17 @@ public class Synchronization implements Closeable {
 		}
 
 		@Override
-		protected void processItem(HaaSFileTransfer tr, String file) throws InterruptedIOException {
+		protected void processItem(final HaaSFileTransfer tr, final String file)
+			throws InterruptedIOException
+		{
+			tr.download(file, outputDirectory);
 			filesDownloaded.insert(outputDirectory.resolve(file));
 			try {
 				filesDownloaded.storeToWorkingFile();
-			} catch (IOException e) {
+			}
+			catch (final IOException e) {
 				log.error(e.getMessage(), e);
 			}
-			tr.download(file, outputDirectory);
 		}
 
 		@Override
diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/FileTransferInfo.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/FileTransferInfo.java
new file mode 100644
index 0000000000000000000000000000000000000000..93dc63db8883cafdd73b10503a128537267d392a
--- /dev/null
+++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/FileTransferInfo.java
@@ -0,0 +1,25 @@
+
+package cz.it4i.fiji.haas_java_client;
+
+import java.nio.file.Path;
+
+public class FileTransferInfo {
+
+	private final Path path;
+
+	private final FileTransferState state;
+
+	public FileTransferInfo(final Path path, final FileTransferState state) {
+		this.path = path;
+		this.state = state;
+	}
+
+	public String getPathAsString() {
+		return path.toString();
+	}
+
+	public FileTransferState getState() {
+		return state;
+	}
+
+}
diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/FileTransferState.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/FileTransferState.java
new file mode 100644
index 0000000000000000000000000000000000000000..d71ab297b9c52e25ec1274e4136e3444cdb11a22
--- /dev/null
+++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/FileTransferState.java
@@ -0,0 +1,5 @@
+package cz.it4i.fiji.haas_java_client;
+
+public enum FileTransferState {
+		Unknown, Queuing, InProcess, Finished;
+}
\ No newline at end of file
diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSFileTransferImp.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSFileTransferImp.java
index d16b1a35be3a0cd7108b2bc0ee6078e8b763da42..ace1f918ff12b9144c186b9a3a3e5128567ec25c 100644
--- a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSFileTransferImp.java
+++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSFileTransferImp.java
@@ -1,5 +1,8 @@
+
 package cz.it4i.fiji.haas_java_client;
 
+import com.jcraft.jsch.JSchException;
+
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -12,8 +15,6 @@ import java.util.stream.Collectors;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.jcraft.jsch.JSchException;
-
 import cz.it4i.fiji.haas_java_client.proxy.FileTransferMethodExt;
 import cz.it4i.fiji.scpclient.ScpClient;
 import cz.it4i.fiji.scpclient.TransferFileProgress;
@@ -39,34 +40,47 @@ class HaaSFileTransferImp implements HaaSFileTransfer {
 	}
 
 	@Override
-	public void upload(UploadingFile file) throws InterruptedIOException{
-		String destFile = "'" + ft.getSharedBasepath() + "/" + file.getName() + "'";
+	public void upload(final UploadingFile file) throws InterruptedIOException {
+		final String destFile = "'" + ft.getSharedBasepath() + "/" + file
+			.getName() + "'";
 		try (InputStream is = file.getInputStream()) {
-			boolean result = scpClient.upload(is, destFile, file.getLength(), file.getLastTime(), progress);
-			if (!result) {
-				throw new HaaSClientException("Uploading of " + file + " to " + destFile + " failed");
+			if (!scpClient.upload(is, destFile, file.getLength(), file.getLastTime(),
+				progress))
+			{
+				throw new HaaSClientException("Uploading of " + file + " to " +
+					destFile + " failed");
 			}
-		} catch(InterruptedIOException e) {
+		}
+		catch (final InterruptedIOException e) {
 			throw e;
-		} catch (JSchException | IOException e) {
+		}
+		catch (JSchException | IOException e) {
 			throw new HaaSClientException(e);
 		}
 	}
 
 	@Override
-	public void download(String fileName, Path workDirectory) throws InterruptedIOException{
+	public void download(String fileName, final Path workDirectory)
+		throws InterruptedIOException
+	{
 		try {
 			fileName = fileName.replaceFirst("/", "");
-			Path rFile = workDirectory.resolve(fileName);
-			String fileToDownload = "'" + ft.getSharedBasepath() + "/" + fileName + "'";
-			scpClient.download(fileToDownload, rFile, progress);
-		} catch(InterruptedIOException e) {
+			final Path rFile = workDirectory.resolve(fileName);
+			final String fileToDownload = "'" + ft.getSharedBasepath() + "/" +
+				fileName + "'";
+			if (!scpClient.download(fileToDownload, rFile, progress)) {
+				throw new HaaSClientException("Downloading of " + fileName + " to " +
+					workDirectory + " failed");
+			}
+		}
+		catch (final InterruptedIOException e) {
 			throw e;
-		} catch (JSchException | IOException e) {
+		}
+		catch (JSchException | IOException e) {
 			throw new HaaSClientException(e);
 		}
 	}
-	
+
 	@Override
 	public void setProgress(TransferFileProgress progress) {
 		this.progress = progress;
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 e31785c78b89cd7a8c94fa4e05ec9b1f22c56548..b195e1cfd4ad30403da3f3fd5758c852ccbd7509 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
@@ -54,6 +54,7 @@ import cz.it4i.fiji.haas.HaaSOutputHolder;
 import cz.it4i.fiji.haas.HaaSOutputHolderImpl;
 import cz.it4i.fiji.haas.Job;
 import cz.it4i.fiji.haas.JobManager;
+import cz.it4i.fiji.haas_java_client.FileTransferInfo;
 import cz.it4i.fiji.haas_java_client.HaaSClientSettings;
 import cz.it4i.fiji.haas_java_client.JobSettings;
 import cz.it4i.fiji.haas_java_client.JobSettingsBuilder;
@@ -282,11 +283,15 @@ public class BenchmarkJobManager implements Closeable {
 		public Path getOutputDirectory() {
 			return job.getOutputDirectory();
 		}
-		
+
 		public Path getResultXML() {
 			return Paths.get(job.getProperty(SPIM_OUTPUT_FILENAME_PATTERN) + ".xml");
 		}
 
+		public List<FileTransferInfo> getFileTransferInfo() {
+			return job.getFileTransferInfo();
+		}
+
 		private ProgressNotifier convertTo(Progress progress) {
 			return progress == null ? null : new ProgressNotifierAdapter(progress);
 		}
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/DataTransferController.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/DataTransferController.java
new file mode 100644
index 0000000000000000000000000000000000000000..c4f85b95d134b08f66595c4ebb8328680c76f0b7
--- /dev/null
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/DataTransferController.java
@@ -0,0 +1,79 @@
+
+package cz.it4i.fiji.haas_spim_benchmark.ui;
+
+import java.util.LinkedList;
+import java.util.List;
+import java.util.function.Function;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import cz.it4i.fiji.haas.ui.CloseableControl;
+import cz.it4i.fiji.haas.ui.JavaFXRoutines;
+import cz.it4i.fiji.haas.ui.UpdatableObservableValue;
+import cz.it4i.fiji.haas.ui.UpdatableObservableValue.UpdateStatus;
+import cz.it4i.fiji.haas_java_client.FileTransferInfo;
+import cz.it4i.fiji.haas_spim_benchmark.core.BenchmarkJobManager.BenchmarkJob;
+import javafx.beans.value.ObservableValue;
+import javafx.fxml.FXML;
+import javafx.scene.control.TableView;
+import javafx.scene.layout.BorderPane;
+
+public class DataTransferController extends BorderPane implements
+	CloseableControl
+{
+
+	private static final String FXML_FILE_NAME = "DataTransfer.fxml";
+
+	@SuppressWarnings("unused")
+	private static Logger log = LoggerFactory.getLogger(
+		cz.it4i.fiji.haas_spim_benchmark.ui.DataTransferController.class);
+
+	@FXML
+	private TableView<ObservableValue<FileTransferInfo>> filesToUpload;
+
+	private BenchmarkJob job;
+
+	public DataTransferController() {
+		JavaFXRoutines.initRootAndController(FXML_FILE_NAME, this);
+		initTable();
+	}
+
+	public void setJob(final BenchmarkJob job) {
+		this.job = job;
+		fillTable();
+	}
+
+	// -- CloseableControl methods --
+
+	@Override
+	public void close() {
+		// DO NOTHING
+	}
+
+	// -- Helper methods --
+
+	private void initTable() {
+		setCellValueFactory(0, f -> f.getPathAsString());
+		setCellValueFactory(1, f -> f.getState().toString());
+	}
+
+	private void setCellValueFactory(final int columnIndex,
+		final Function<FileTransferInfo, String> mapper)
+	{
+		JavaFXRoutines.setCellValueFactory(filesToUpload, columnIndex, mapper);
+	}
+
+	private void fillTable() {
+
+		final List<ObservableValue<FileTransferInfo>> tempList = new LinkedList<>();
+
+		job.getFileTransferInfo().forEach(i -> {
+			tempList.add(new UpdatableObservableValue<>(i,
+				x -> UpdateStatus.NotUpdated, x -> x));
+		});
+
+		filesToUpload.getItems().addAll(tempList);
+	}
+
+}
diff --git a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/JobDetailControl.java b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/JobDetailControl.java
index cfdb1b38f676a32d6fb11470a4e70f60857a7a34..19ab930546830376a669a005df597c7a89578cd5 100644
--- a/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/JobDetailControl.java
+++ b/haas-spim-benchmark/src/main/java/cz/it4i/fiji/haas_spim_benchmark/ui/JobDetailControl.java
@@ -21,7 +21,6 @@ public class JobDetailControl extends TabPane implements CloseableControl,
 	InitiableControl
 {
 
-	@SuppressWarnings("unused")
 	private static Logger log = LoggerFactory.getLogger(
 		cz.it4i.fiji.haas_spim_benchmark.ui.JobDetailControl.class);
 
@@ -40,11 +39,17 @@ public class JobDetailControl extends TabPane implements CloseableControl,
 	@FXML
 	private Tab jobPropertiesTab;
 
+	@FXML
+	private DataTransferController dataUpload;
+
+	@FXML
+	private Tab dataUploadTab;
+
 	private final HaaSOutputObservableValueRegistry observableValueRegistry;
 
 	private final BenchmarkJob job;
 
-	public JobDetailControl(BenchmarkJob job) {
+	public JobDetailControl(final BenchmarkJob job) {
 		JavaFXRoutines.initRootAndController("JobDetail.fxml", this);
 		progressView.setJob(job);
 		observableValueRegistry = new HaaSOutputObservableValueRegistry(job,
@@ -55,34 +60,65 @@ public class JobDetailControl extends TabPane implements CloseableControl,
 		standardOutput.setObservable(observableValueRegistry.createObservable(
 			SynchronizableFileType.StandardOutputFile));
 		jobProperties.setJob(job);
+		dataUpload.setJob(job);
 		observableValueRegistry.start();
 		this.job = job;
 	}
 
+	// -- InitiableControl methods --
+
 	@Override
-	public void init(Window parameter) {
-		if (!isExecutionDetailsAvailable(job)) {
-			enableOnlySpecificTab(jobPropertiesTab);
+	public void init(final Window parameter) {
+
+		if (job.getState() == JobState.Disposed) {
+			// TODO: Handle this?
+			log.debug("Job " + job.getId() + " state has been resolved as Disposed.");
 		}
-	}
 
-	private void enableOnlySpecificTab(Tab tabToLeaveEnabled) {
-		getTabs().stream().filter(node -> node != tabToLeaveEnabled).forEach(
-			node -> node.setDisable(true));
-		getSelectionModel().select(jobPropertiesTab);
-	}
+		disableNonPermanentTabs();
 
-	private boolean isExecutionDetailsAvailable(BenchmarkJob inspectedJob) {
-		return inspectedJob.getState() == JobState.Running || inspectedJob
-			.getState() == JobState.Finished || inspectedJob
-				.getState() == JobState.Failed || inspectedJob
-					.getState() == JobState.Canceled;
+		if (areExecutionDetailsAvailable()) {
+			enableAllTabs();
+		}
 	}
 
+	// -- CloseableControl methods --
+
 	@Override
 	public void close() {
 		observableValueRegistry.close();
+
+		// Close controllers
 		progressView.close();
 		jobProperties.close();
+		dataUpload.close();
+	}
+
+	// -- Helper methods --
+
+	/*
+	 * Checks whether execution details are available
+	 */
+	private boolean areExecutionDetailsAvailable() {
+		return job.getState() == JobState.Running || job
+			.getState() == JobState.Finished || job.getState() == JobState.Failed ||
+			job.getState() == JobState.Canceled;
+	}
+
+	/*
+	 * Disables all tabs except those which shall be always enabled, such as job properties tab
+	 */
+	private void disableNonPermanentTabs() {
+		getTabs().stream().filter(t -> t != jobPropertiesTab && t != dataUploadTab)
+			.forEach(t -> t.setDisable(true));
+		getSelectionModel().select(jobPropertiesTab);
 	}
+
+	/*
+	 * Enables all tabs
+	 */
+	private void enableAllTabs() {
+		getTabs().stream().forEach(t -> t.setDisable(false));
+	}
+
 }
diff --git a/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/DataTransfer.fxml b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/DataTransfer.fxml
new file mode 100644
index 0000000000000000000000000000000000000000..6637b253d3a9f6a98c2ac411069640f939e66a01
--- /dev/null
+++ b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/DataTransfer.fxml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import javafx.geometry.Insets?>
+<?import javafx.scene.control.TableColumn?>
+<?import javafx.scene.control.TableView?>
+<?import javafx.scene.layout.BorderPane?>
+<?import javafx.scene.layout.HBox?>
+
+<fx:root type="BorderPane" xmlns="http://javafx.com/javafx/8.0.65" xmlns:fx="http://javafx.com/fxml/1" fx:controller="cz.it4i.fiji.haas_spim_benchmark.ui.DataTransferController">
+   <center>
+      <HBox>
+         <children>
+            <TableView fx:id="filesToUpload" prefHeight="400.0" prefWidth="500.0" HBox.hgrow="ALWAYS">
+				<columns>
+					<TableColumn prefWidth="400.0" text="File" />
+					<TableColumn prefWidth="100.0" text="Status" />
+				</columns>
+			</TableView>
+         </children>
+         <padding>
+            <Insets bottom="1.0" left="1.0" right="1.0" top="1.0" />
+         </padding>
+      </HBox>
+   </center>
+</fx:root>
diff --git a/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/JobDetail.fxml b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/JobDetail.fxml
index 75ad019d39930fd07cf0ebea1d0bb922cf2de6ab..82212cb245bcf4cef4c36a9d16a2cc9cac37e660 100644
--- a/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/JobDetail.fxml
+++ b/haas-spim-benchmark/src/main/resources/cz/it4i/fiji/haas_spim_benchmark/ui/JobDetail.fxml
@@ -1,5 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
+<?import cz.it4i.fiji.haas_spim_benchmark.ui.DataTransferController?>
 <?import cz.it4i.fiji.haas_spim_benchmark.ui.LogViewControl?>
 <?import cz.it4i.fiji.haas_spim_benchmark.ui.SPIMPipelineProgressViewController?>
 <?import javafx.scene.control.Tab?>
@@ -45,5 +46,12 @@
 			</content>
 
 		</Tab>
+		<Tab closable="false" text="Data upload" fx:id="dataUploadTab">
+			<content>
+				<HBox>
+					<DataTransferController fx:id="dataUpload" HBox.hgrow="ALWAYS" />
+				</HBox>
+			</content>
+		</Tab>
 	</tabs>
 </fx:root>