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 d192e5cf33de74b6b8a9bd8da0ff4e3a98e3d094..1135b3672141dfb185422b2d35db8b6826d68ef4 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
@@ -21,29 +21,27 @@ 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.DummyProgressNotifier;
 import cz.it4i.fiji.haas_java_client.HaaSClient;
 import cz.it4i.fiji.haas_java_client.HaaSClient.UploadingFile;
 import cz.it4i.fiji.haas_java_client.HaaSFileTransfer;
 import cz.it4i.fiji.haas_java_client.JobInfo;
 import cz.it4i.fiji.haas_java_client.JobState;
 import cz.it4i.fiji.haas_java_client.ProgressNotifier;
+import cz.it4i.fiji.haas_java_client.TransferFileProgressForHaaSClient;
 import net.imagej.updater.util.Progress;
 
 public class Job {
 
 	private static final String JOB_NAME = "job.name";
-	
+
 	private static final String JOB_NEEDS_UPLOAD = "job.needs_upload";
-	
-	private static final String JOB_INFO_FILENAME = ".jobinfo";
 
+	private static final String JOB_INFO_FILENAME = ".jobinfo";
 
 	public static boolean isJobPath(Path p) {
 		return isValidPath(p);
 	}
 
-	
 	private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.Job.class);
 
 	private Path jobDir;
@@ -77,14 +75,12 @@ public class Job {
 		resumeUpload();
 	}
 
-	
-
 	private Job(JobManager4Job jobManager, Supplier<HaaSClient> haasClientSupplier) {
 		this.haasClientSupplier = haasClientSupplier;
 		this.jobManager = jobManager;
 	}
 
-	public void startUploadData()  {
+	public void startUploadData() {
 		setProperty(JOB_NEEDS_UPLOAD, true);
 		try {
 			this.synchronization.startUpload();
@@ -93,8 +89,8 @@ public class Job {
 			throw new RuntimeException(e);
 		}
 	}
-	
-	public void stopUploadData()  {
+
+	public void stopUploadData() {
 		setProperty(JOB_NEEDS_UPLOAD, false);
 		try {
 			this.synchronization.stopUpload();
@@ -103,15 +99,46 @@ public class Job {
 			throw new RuntimeException(e);
 		}
 	}
-	
+
+	public void startDownload(Predicate<String> predicate, Progress notifier) throws IOException {
+		Collection<String> files = getHaaSClient().getChangedFiles(jobId).stream().filter(predicate)
+				.collect(Collectors.toList());
+		synchronization.startDownload(files);
+	}
+
 	public boolean isUploading() {
 		return Boolean.parseBoolean(getProperty(JOB_NEEDS_UPLOAD));
 	}
 
-	public void uploadFile(String file, Progress notifier) {
-		Iterable<UploadingFile> uploadingFiles = Arrays.asList(file).stream()
-				.map((String name) -> HaaSClient.getUploadingFile(jobDir.resolve(name))).collect(Collectors.toList());
-		uploadFiles(uploadingFiles, notifier);
+	public void uploadFile(String file, ProgressNotifier notifier) {
+		uploadFiles(Arrays.asList(file), notifier);
+	}
+
+	public void uploadFiles(Collection<String> filesNames, ProgressNotifier notifier) {
+		Collection<UploadingFile> files = filesNames.stream()
+				.map(file -> HaaSClient.getUploadingFile(jobDir.resolve(file))).collect(Collectors.toList());
+		List<Long> totalSizes = files.stream().map(f -> {
+			try {
+				return f.getLength();
+			} catch (IOException e1) {
+				throw new RuntimeException(e1);
+			}
+		}).collect(Collectors.toList());
+		long totalSize = totalSizes.stream().mapToLong(l -> l.longValue()).sum();
+		TransferFileProgressForHaaSClient progress = new TransferFileProgressForHaaSClient(totalSize, notifier);
+
+		HaaSClient client = getHaaSClient();
+		try (HaaSFileTransfer transfer = client.startFileTransfer(getId(), progress)) {
+			int index = 0;
+			for (UploadingFile file : files) {
+				String item;
+				progress.startNewFile(totalSizes.get(index));
+				notifier.addItem(item = "Uploading file: " + file.getName());
+				transfer.upload(file);
+				notifier.itemDone(item);
+				index++;
+			}
+		}
 	}
 
 	public void submit() {
@@ -126,10 +153,6 @@ public class Job {
 		return jobId;
 	}
 
-	public void download(Progress notifier) {
-		download(x -> true, notifier);
-	}
-
 	public Path storeDataInWorkdirectory(UploadingFile uploadingFile) throws IOException {
 		Path result;
 		try (InputStream is = uploadingFile.getInputStream()) {
@@ -138,12 +161,22 @@ public class Job {
 		return result;
 	}
 
-	synchronized public void download(Predicate<String> predicate, Progress notifier) {
-		try (HaaSFileTransfer fileTransfer = getHaaSClient().startFileTransfer(jobId,
-				new P_ProgressNotifierAdapter(notifier))) {
-			fileTransfer.download(
-					getHaaSClient().getChangedFiles(jobId).stream().filter(predicate).collect(Collectors.toList()),
-					jobDir);
+	synchronized public void download(Predicate<String> predicate, ProgressNotifier notifier) {
+		List<String> files = getHaaSClient().getChangedFiles(jobId).stream().filter(predicate).collect(Collectors.toList());
+		try (HaaSFileTransfer transfer =  haasClientSupplier.get().startFileTransfer(getId(), HaaSClient.DUMMY_TRANSFER_FILE_PROGRESS)) {
+			List<Long> fileSizes = transfer.obtainSize(files);
+			final long totalFileSize = fileSizes.stream().mapToLong(i -> i.longValue()).sum();
+			TransferFileProgressForHaaSClient progress = new TransferFileProgressForHaaSClient(totalFileSize, notifier);
+			transfer.setProgress(progress);
+			int idx = 0;
+			for (String fileName : files) {
+				String item;
+				progress.addItem(item = fileName);
+				progress.startNewFile(fileSizes.get(idx));
+				transfer.download(fileName, jobDir);
+				progress.itemDone(item);
+				idx++;
+			}
 		}
 	}
 
@@ -212,31 +245,49 @@ public class Job {
 		return result;
 	}
 
+	public Collection<String> getChangedFiles() {
+		return getHaaSClient().getChangedFiles(getId());
+	}
+
+	public void cancelJob() {
+		getHaaSClient().cancelJob(jobId);
+	}
+
+	public List<Long> getFileSizes(List<String> names) {
+
+		try (HaaSFileTransfer transfer = getHaaSClient().startFileTransfer(getId(),
+				HaaSClient.DUMMY_TRANSFER_FILE_PROGRESS)) {
+			return transfer.obtainSize(names);
+		}
+	}
+
+	public List<String> getFileContents(List<String> logs) {
+		try (HaaSFileTransfer transfer = getHaaSClient().startFileTransfer(getId(),
+				HaaSClient.DUMMY_TRANSFER_FILE_PROGRESS)) {
+			return transfer.getContent(logs);
+		}
+	}
+
 	private void setJobDirectory(Path jobDirectory) {
 		this.jobDir = jobDirectory;
 		try {
-			this.synchronization = new Synchronization(()->haasClientSupplier.get().startFileTransfer(getId(), new DummyProgressNotifier()), jobDir, Executors.newFixedThreadPool(2), ()->  {
-				setProperty(JOB_NEEDS_UPLOAD, false);
-			});
+			this.synchronization = new Synchronization(
+					() -> haasClientSupplier.get().startFileTransfer(getId(), HaaSClient.DUMMY_TRANSFER_FILE_PROGRESS),
+					jobDir, Executors.newFixedThreadPool(2), () -> {
+						setProperty(JOB_NEEDS_UPLOAD, false);
+					});
 		} catch (IOException e) {
 			log.error(e.getMessage(), e);
 			throw new RuntimeException(e);
 		}
 	}
-	
+
 	private synchronized void resumeUpload() {
-		if(Boolean.parseBoolean(getProperty(JOB_NEEDS_UPLOAD))) {
+		if (Boolean.parseBoolean(getProperty(JOB_NEEDS_UPLOAD))) {
 			synchronization.resumeUpload();
 		}
 	}
 
-	private void uploadFiles(Iterable<UploadingFile> files, Progress notifier) {
-		HaaSClient client = getHaaSClient();
-		try (HaaSFileTransfer transfer = client.startFileTransfer(getId(), new P_ProgressNotifierAdapter(notifier))) {
-			transfer.upload(files);
-		}
-	}
-
 	private void setName(String name) {
 		setProperty(JOB_NAME, name);
 	}
@@ -270,58 +321,4 @@ public class Job {
 		return Long.parseLong(path.getFileName().toString());
 	}
 
-	private class P_ProgressNotifierAdapter implements ProgressNotifier {
-		private Progress progress;
-
-		public P_ProgressNotifierAdapter(Progress progress) {
-			this.progress = progress;
-		}
-
-		public void setTitle(String title) {
-			progress.setTitle(title);
-		}
-
-		public void setCount(int count, int total) {
-			progress.setCount(count, total);
-		}
-
-		public void addItem(Object item) {
-			progress.addItem(item);
-		}
-
-		public void setItemCount(int count, int total) {
-			progress.setItemCount(count, total);
-		}
-
-		public void itemDone(Object item) {
-			progress.itemDone(item);
-		}
-
-		public void done() {
-			progress.done();
-		}
-
-	}
-
-	public Collection<String> getChangedFiles() {
-		return getHaaSClient().getChangedFiles(getId());
-	}
-
-	public void cancelJob() {
-		getHaaSClient().cancelJob(jobId);
-	}
-
-	public List<Long> getFileSizes(List<String> names) {
-
-		try (HaaSFileTransfer transfer = getHaaSClient().startFileTransfer(getId(), new DummyProgressNotifier())) {
-			return transfer.obtainSize(names);
-		}
-	}
-
-	public List<String> getFileContents(List<String> logs) {
-		try (HaaSFileTransfer transfer = getHaaSClient().startFileTransfer(getId(), new DummyProgressNotifier())) {
-			return transfer.getContent(logs);
-		}
-	}
-
 }
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 77116f511670dace631b3456f271921bf16b6c09..267c2662beafa85882f5da50b65b6606f65be5ca 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
@@ -5,7 +5,6 @@ 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 org.slf4j.Logger;
@@ -15,7 +14,6 @@ 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 cz.it4i.fiji.haas_java_client.SynchronizableFileType;
-import net.imagej.updater.util.Progress;
 
 public class JobManager {
 
@@ -72,12 +70,12 @@ public class JobManager {
 		return Collections.unmodifiableCollection(jobs);
 	}
 
-	public void downloadJob(Long id, Progress notifier) {
-		Iterator<Job> job = jobs.stream().filter(j -> j.getId() == id).iterator();
-		assert job.hasNext();
-		job.next().download(notifier);
-
-	}
+//	public void downloadJob(Long id, Progress notifier) {
+//		Iterator<Job> job = jobs.stream().filter(j -> j.getId() == id).iterator();
+//		assert job.hasNext();
+//		job.next().download(notifier);
+//
+//	}
 
 	public JobState getState(long id) {
 		return getHaasClient().obtainJobInfo(id).getState();
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 1b09f99ff8c2977cde181794fe1a5abbf689e6ab..30680c25424af2f615099275cc56488dbd1e7faf 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
@@ -5,6 +5,7 @@ import java.nio.file.DirectoryStream;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Queue;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.LinkedBlockingQueue;
@@ -16,12 +17,18 @@ import org.slf4j.LoggerFactory;
 
 import cz.it4i.fiji.haas_java_client.HaaSClient.UploadingFile;
 import cz.it4i.fiji.haas_java_client.HaaSFileTransfer;
+import cz.it4i.fiji.haas_java_client.UploadingFileImpl;
 
 public class Synchronization {
 
 	public static final Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.data_transfer.Synchronization.class);
 	
-	private static final String FILE_INDEX_FILENAME = ".toUploadFiles";
+	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_DOWNLOADED_FILENAME = ".downloaded";
+	
 	
 	private Supplier<HaaSFileTransfer> fileTransferSupplier;
 	
@@ -29,7 +36,11 @@ public class Synchronization {
 	
 	private Queue<Path> toUpload = new LinkedBlockingQueue<>();
 	
-	private FileIndex fileRepository;
+	private FileIndex filesToUpload;
+	
+	private FileIndex filesToDownload;
+	
+	private FileIndex filesDownloaded;
 	
 	private SimpleThreadRunner runnerForUpload;
 	
@@ -41,40 +52,43 @@ public class Synchronization {
 			ExecutorService service, Runnable uploadFinishedNotifier ) throws IOException {
 		this.fileTransferSupplier = fileTransferSupplier;
 		this.workingDirectory = workingDirectory;
-		this.fileRepository = new FileIndex(workingDirectory.resolve(FILE_INDEX_FILENAME));
+		this.filesToUpload = new FileIndex(workingDirectory.resolve(FILE_INDEX_TO_UPLOAD_FILENAME));
+		this.filesToDownload = new FileIndex(workingDirectory.resolve(FILE_INDEX_TO_DOWNLOAD_FILENAME));
+		this.filesDownloaded = new FileIndex(workingDirectory.resolve(FILE_INDEX_DOWNLOADED_FILENAME));
 		this.runnerForUpload = new SimpleThreadRunner(service);
 		this.uploadFinishedNotifier = uploadFinishedNotifier;
 	}
 
 	public synchronized void startUpload() throws IOException {
 		startUploadFinished = false;
-		fileRepository.clear();
+		filesToUpload.clear();
 		try(DirectoryStream<Path> ds = Files.newDirectoryStream(workingDirectory,this::isNotHidden)) {
 			for (Path file : ds) {
-				fileRepository.insert(file);
+				filesToUpload.insert(file);
 				toUpload.add(file);
 				runnerForUpload.runIfNotRunning(this::doUpload);
 			}
 		} finally {
 			startUploadFinished = true;
-			fileRepository.storeToFile();
+			filesToUpload.storeToFile();
 			
 		}
 	}
 	
 	public void stopUpload() throws IOException {
 		toUpload.clear();
-		fileRepository.clear();
+		filesToUpload.clear();
 	}
 
 	public void resumeUpload() {
-		fileRepository.fillQueue(toUpload);
+		filesToUpload.fillQueue(toUpload);
 		if(!toUpload.isEmpty()) {
 			runnerForUpload.runIfNotRunning(this::doUpload);
 		}
 	}
 	
-	public void startDownload() {
+	public synchronized void startDownload(Collection<String> files) throws IOException {
+		filesToDownload.clear();
 		
 	}
 
@@ -89,7 +103,7 @@ public class Synchronization {
 				Path p = toUpload.poll();
 				UploadingFile uf = createUploadingFile(p);
 				log.info("upload: " + p);
-				tr.upload(Arrays.asList(uf));
+				tr.upload(uf);
 				fileUploaded(p);
 				log.info("uploaded: " + p);
 				reRun.set(false);
@@ -105,8 +119,8 @@ public class Synchronization {
 
 	private void fileUploaded(Path p) {
 		try {
-			fileRepository.uploaded(p);
-			fileRepository.storeToFile();
+			filesToUpload.uploaded(p);
+			filesToUpload.storeToFile();
 		} catch (IOException e) {
 			log.error(e.getMessage(), e);
 		}
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 c86acb066ac80fa35b9db30573361a743a3e55ba..c545ae0b5f17fe770decb8d8f13ae56f02f272f7 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
@@ -291,10 +291,4 @@ public class ProgressDialog extends JDialog implements Progress {
 		itemLatestUpdate = System.currentTimeMillis();
 		return false;
 	}
-
-	private static void main(final String[] args) {
-		final ProgressDialog dialog = new ProgressDialog(null, "Hello");
-		dialog.addItem("Bello");
-		dialog.setVisible(true);
-	}
 }
diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/DummyProgressNotifier.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/DummyProgressNotifier.java
deleted file mode 100644
index 927d4c048226546d76acd64d99fb3953b886ce70..0000000000000000000000000000000000000000
--- a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/DummyProgressNotifier.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package cz.it4i.fiji.haas_java_client;
-
-public class DummyProgressNotifier implements ProgressNotifier {
-
-	@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() {
-	}
-
-	@Override
-	public void setTitle(String title) {
-	}
-}
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 098b34b7aebb132c6d74b759fceb86ad1a880f7a..d49c73da4e421a944c86cdbeb38e082dd02bd9e5 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
@@ -12,11 +12,9 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedList;
-import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.stream.Collectors;
-import java.util.stream.StreamSupport;
 
 import javax.xml.rpc.ServiceException;
 
@@ -44,22 +42,45 @@ import cz.it4i.fiji.haas_java_client.proxy.TaskSpecificationExt;
 import cz.it4i.fiji.haas_java_client.proxy.UserAndLimitationManagementWsLocator;
 import cz.it4i.fiji.haas_java_client.proxy.UserAndLimitationManagementWsSoap;
 import cz.it4i.fiji.scpclient.ScpClient;
+import cz.it4i.fiji.scpclient.TransferFileProgress;
 
 public class HaaSClient {
 
-	public static List<Long> getSizes(List<String> asList, ScpClient scpClient, ProgressNotifier notifier)
-			throws JSchException, IOException {
-		List<Long> result = new LinkedList<>();
+	public static final TransferFileProgress DUMMY_TRANSFER_FILE_PROGRESS = new TransferFileProgress() {
+		
+		@Override
+		public void dataTransfered(long bytesTransfered) {
+			// TODO Auto-generated method stub
+			
+		}
+	};
 
-		String item;
-		notifier.addItem(item = "Checking sizes");
-		for (String lfile : asList) {
-			result.add(scpClient.size(lfile));
-			notifier.setItemCount(result.size(), asList.size());
+	public static ProgressNotifier DUMMY_PROGRESS_NOTIFIER = new ProgressNotifier() {
+	
+		@Override
+		public void setTitle(String title) {
 		}
-		notifier.itemDone(item);
-		return result;
-	}
+	
+		@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) {
+		}
+	};
 
 	public static UploadingFile getUploadingFile(Path file) {
 		return new UploadingFile() {
@@ -147,6 +168,20 @@ public class HaaSClient {
 
 	private static Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas_java_client.HaaSClient.class);
 
+	final static private Map<JobStateExt, JobState> WS_STATE2STATE;
+
+	static {
+		Map<JobStateExt, JobState> map = new HashMap<JobStateExt, JobState>();
+		map.put(JobStateExt.Canceled, JobState.Canceled);
+		map.put(JobStateExt.Configuring, JobState.Configuring);
+		map.put(JobStateExt.Failed, JobState.Failed);
+		map.put(JobStateExt.Finished, JobState.Finished);
+		map.put(JobStateExt.Queued, JobState.Queued);
+		map.put(JobStateExt.Running, JobState.Running);
+		map.put(JobStateExt.Submitted, JobState.Submitted);
+		WS_STATE2STATE = Collections.unmodifiableMap(map);
+	}
+	
 	private String sessionID;
 
 	private UserAndLimitationManagementWsSoap userAndLimitationManagement;
@@ -165,49 +200,9 @@ public class HaaSClient {
 
 	private Map<Long, P_FileTransferPool> filetransferPoolMap = new HashMap<>();
 
-	public static ProgressNotifier DUMMY_NOTIFIER = new ProgressNotifier() {
-
-		@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 Settings settings;
 
-	final static private Map<JobStateExt, JobState> WS_STATE2STATE;
-
-	static {
-		Map<JobStateExt, JobState> map = new HashMap<JobStateExt, JobState>();
-		map.put(JobStateExt.Canceled, JobState.Canceled);
-		map.put(JobStateExt.Configuring, JobState.Configuring);
-		map.put(JobStateExt.Failed, JobState.Failed);
-		map.put(JobStateExt.Finished, JobState.Finished);
-		map.put(JobStateExt.Queued, JobState.Queued);
-		map.put(JobStateExt.Running, JobState.Running);
-		map.put(JobStateExt.Submitted, JobState.Submitted);
-		WS_STATE2STATE = Collections.unmodifiableMap(map);
-	}
-
 	public HaaSClient(Settings settings) {
 		this.settings = settings;
 		this.templateId = settings.getTemplateId();
@@ -216,28 +211,6 @@ public class HaaSClient {
 		this.projectId = settings.getProjectId();
 	}
 
-	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());
-		return start(uploadingFiles, name, templateParameters, DUMMY_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);
-			try (HaaSFileTransfer transfer = startFileTransfer(jobId, notifier)) {
-				transfer.upload(files);
-			}
-			doSubmitJob(jobId);
-			return jobId;
-		} catch (ServiceException | IOException e) {
-			throw new HaaSClientException(e);
-		}
-
-	}
-
 	public long createJob(String name, Collection<Entry<String, String>> templateParameters) {
 		try {
 			return doCreateJob(name, templateParameters);
@@ -246,13 +219,12 @@ public class HaaSClient {
 		}
 	}
 
-	public HaaSFileTransfer startFileTransfer(long jobId, ProgressNotifier notifier) {
+	public HaaSFileTransfer startFileTransfer(long jobId, TransferFileProgress notifier) {
 		try {
 			return getFileTransferMethod(jobId, notifier);
 		} catch (RemoteException | ServiceException | UnsupportedEncodingException | JSchException e) {
 			throw new HaaSClientException(e);
 		}
-
 	}
 
 	public void submitJob(long jobId) {
@@ -322,12 +294,12 @@ public class HaaSClient {
 		}
 	}
 
-	private HaaSFileTransferImp getFileTransferMethod(long jobId, ProgressNotifier notifier)
+	private HaaSFileTransferImp getFileTransferMethod(long jobId, TransferFileProgress progress)
 			throws RemoteException, UnsupportedEncodingException, ServiceException, JSchException {
 		P_FileTransferPool pool = filetransferPoolMap.computeIfAbsent(jobId, id -> new P_FileTransferPool(id));
 		FileTransferMethodExt ft = pool.obtain();
 		try {
-			return new HaaSFileTransferImp(ft, getScpClient(ft), notifier) {
+			return new HaaSFileTransferImp(ft, getScpClient(ft), progress) {
 				public void close() {
 					super.close();
 					try {
diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSFileTransfer.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSFileTransfer.java
index c6c8a4b9b31142c0b5041b1ccf1882bae1a82b4d..e3c751a3c89bbf44a9135d91b70f775dac3133db 100644
--- a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSFileTransfer.java
+++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/HaaSFileTransfer.java
@@ -5,6 +5,7 @@ import java.nio.file.Path;
 import java.util.List;
 
 import cz.it4i.fiji.haas_java_client.HaaSClient.UploadingFile;
+import cz.it4i.fiji.scpclient.TransferFileProgress;
 
 public interface HaaSFileTransfer extends Closeable {
 
@@ -12,11 +13,13 @@ public interface HaaSFileTransfer extends Closeable {
 	@Override
 	void close();
 
-	void upload(Iterable<UploadingFile> files);
+	void upload(UploadingFile files);
 
-	void download(Iterable<String> files, Path workDIrectory);
+	void download(String files, Path workDirectory);
 
 	List<Long> obtainSize(List<String> files);
 
 	List<String> getContent(List<String> logs);
+	
+	void setProgress(TransferFileProgress progress);
 }
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 d103a5c60ab1cf37f669ba1df03f8c4cf41f54e2..ae970984461097d6c39fb106a9084dc04d508a80 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
@@ -7,17 +7,16 @@ import java.nio.file.Path;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.stream.Collectors;
-import java.util.stream.StreamSupport;
 
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.jcraft.jsch.JSchException;
 
-import cz.it4i.fiji.haas_java_client.HaaSClient.P_ProgressNotifierDecorator4Size;
 import cz.it4i.fiji.haas_java_client.HaaSClient.UploadingFile;
 import cz.it4i.fiji.haas_java_client.proxy.FileTransferMethodExt;
 import cz.it4i.fiji.scpclient.ScpClient;
+import cz.it4i.fiji.scpclient.TransferFileProgress;
 
 class HaaSFileTransferImp implements HaaSFileTransfer {
 
@@ -26,12 +25,12 @@ class HaaSFileTransferImp implements HaaSFileTransfer {
 
 	private FileTransferMethodExt ft;
 	private ScpClient scpClient;
-	private ProgressNotifier notifier;
-
-	public HaaSFileTransferImp(FileTransferMethodExt ft, ScpClient scpClient, ProgressNotifier notifier) {
+	private TransferFileProgress progress;
+	
+	public HaaSFileTransferImp(FileTransferMethodExt ft, ScpClient scpClient, TransferFileProgress progress) {
 		this.ft = ft;
 		this.scpClient = scpClient;
-		this.notifier = notifier;
+		this.progress = progress;
 	}
 
 	@Override
@@ -40,46 +39,47 @@ class HaaSFileTransferImp implements HaaSFileTransfer {
 	}
 
 	@Override
-	public void upload(Iterable<UploadingFile> files) {
-		List<Long> totalSizes = StreamSupport.stream(files.spliterator(), false).map(f -> {
-			try {
-				return f.getLength();
-			} catch (IOException e1) {
-				throw new RuntimeException(e1);
-			}
-		}).collect(Collectors.toList());
-		long totalSize = totalSizes.stream().mapToLong(l -> l.longValue()).sum();
-		TransferFileProgressForHaaSClient progress = new TransferFileProgressForHaaSClient(totalSize, notifier);
-		int index = 0;
-		for (UploadingFile file : files) {
-			String item;
-			progress.startNewFile(totalSizes.get(index));
-			notifier.addItem(item = "Uploading file: " + file.getName());
-			String destFile = "'" + ft.getSharedBasepath() + "/" + file.getName() + "'";
-			try (InputStream is = file.getInputStream()) {
-				boolean result = scpClient.upload(is, destFile, file.getLength(), file.getLastTime(), progress);
-				notifier.itemDone(item);
-				if (!result) {
-					throw new HaaSClientException("Uploading of " + file + " to " + destFile + " failed");
-				}
-			} catch (JSchException | IOException e) {
-				throw new HaaSClientException();
+	public void upload(UploadingFile file) {
+		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");
 			}
-			index++;
+		} catch (JSchException | IOException e) {
+			throw new HaaSClientException();
 		}
-
 	}
 
+	@Override
+	public void download(String fileName, Path workDirectory) {
+		try {
+			fileName = fileName.replaceFirst("/", "");
+			Path rFile = workDirectory.resolve(fileName);
+			String fileToDownload = "'" + ft.getSharedBasepath() + "/" + fileName + "'";
+			scpClient.download(fileToDownload, rFile, progress);
+		} catch (JSchException | IOException e) {
+			throw new HaaSClientException(e);
+		}
+	}
+	
+	@Override
+	public void setProgress(TransferFileProgress progress) {
+		this.progress = progress;
+	}
+	
+	/*
 	@Override
 	public void download(Iterable<String> files, Path workDirectory) {
 		List<Long> fileSizes;
 		try {
 			fileSizes = HaaSClient.getSizes(StreamSupport.stream(files.spliterator(), false)
 					.map(filename -> "'" + ft.getSharedBasepath() + "/" + filename + "'").collect(Collectors.toList()),
-					scpClient, new P_ProgressNotifierDecorator4Size(notifier));
+					scpClient);
 
 			final long totalFileSize = fileSizes.stream().mapToLong(i -> i.longValue()).sum();
-			TransferFileProgressForHaaSClient progress = new TransferFileProgressForHaaSClient(totalFileSize, notifier);
+			TransferFileProgressForHaaSClient progress = new TransferFileProgressForHaaSClient(totalFileSize,
+					HaaSClient.DUMMY_PROGRESS_NOTIFIER);
 			int idx = 0;
 			for (String fileName : files) {
 				fileName = fileName.replaceFirst("/", "");
@@ -96,13 +96,13 @@ class HaaSFileTransferImp implements HaaSFileTransfer {
 			throw new HaaSClientException(e);
 		}
 	}
+	*/
 
 	@Override
 	public List<Long> obtainSize(List<String> files) {
 		try {
-			return HaaSClient.getSizes(files.stream()
-					.map(filename -> "'" + ft.getSharedBasepath() + "/" + filename + "'").collect(Collectors.toList()),
-					scpClient, notifier);
+			return getSizes(files.stream()
+					.map(filename -> "'" + ft.getSharedBasepath() + "/" + filename + "'").collect(Collectors.toList()));
 		} catch (JSchException | IOException e) {
 			throw new HaaSClientException(e);
 		}
@@ -113,26 +113,13 @@ class HaaSFileTransferImp implements HaaSFileTransfer {
 	@Override
 	public List<String> getContent(List<String> files) {
 		List<String> result = new LinkedList<>();
-		List<Long> fileSizes;
 		try {
-			fileSizes = HaaSClient.getSizes(StreamSupport.stream(files.spliterator(), false)
-					.map(filename -> "'" + ft.getSharedBasepath() + "/" + filename + "'").collect(Collectors.toList()),
-					scpClient, new P_ProgressNotifierDecorator4Size(notifier));
-
-			final long totalFileSize = fileSizes.stream().mapToLong(i -> i.longValue()).sum();
-			TransferFileProgressForHaaSClient progress = new TransferFileProgressForHaaSClient(totalFileSize, notifier);
-			int idx = 0;
 			for (String fileName : files) {
 				fileName = replaceIfFirstFirst(fileName, "/", "");
 				try (ByteArrayOutputStream os = new ByteArrayOutputStream()) {
 					String fileToDownload = "'" + ft.getSharedBasepath() + "/" + fileName + "'";
-					String item;
-					progress.addItem(item = fileName);
-					progress.startNewFile(fileSizes.get(idx));
 					scpClient.download(fileToDownload, os, progress);
 					os.flush();
-					progress.itemDone(item);
-					idx++;
 					result.add(os.toString());
 				}
 			}
@@ -148,5 +135,13 @@ class HaaSFileTransferImp implements HaaSFileTransfer {
 		}
 		return fileName;
 	}
+	
+	private List<Long> getSizes(List<String> asList) throws JSchException, IOException {
+		List<Long> result = new LinkedList<>();
+		for (String lfile : asList) {
+			result.add(scpClient.size(lfile));
+		}
+		return result;
+	}
 
 }
diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/TransferFileProgressForHaaSClient.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/TransferFileProgressForHaaSClient.java
index 40fec855c342e8740f64aded4faf2f3c795a4b1c..d1b250c95c93a5bdd7e200d45000ad953abe380f 100644
--- a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/TransferFileProgressForHaaSClient.java
+++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/TransferFileProgressForHaaSClient.java
@@ -2,7 +2,7 @@ package cz.it4i.fiji.haas_java_client;
 
 import cz.it4i.fiji.scpclient.TransferFileProgress;
 
-class TransferFileProgressForHaaSClient implements TransferFileProgress {
+public class TransferFileProgressForHaaSClient implements TransferFileProgress {
 
 	private long totalSize;
 	private long totalTransfered;
@@ -35,6 +35,14 @@ class TransferFileProgressForHaaSClient implements TransferFileProgress {
 	}
 
 	
+	public void addItem(String item) {
+		notifier.addItem(item);
+	}
+
+	public void itemDone(String item) {
+		notifier.itemDone(item);
+	}
+
 	private static int[] normalizaSizes(long part, long total) {
 		int[] result = new int[2];
 		if(total > Integer.MAX_VALUE) {
@@ -49,12 +57,4 @@ class TransferFileProgressForHaaSClient implements TransferFileProgress {
 		}
 		return result;
 	}
-
-	public void addItem(String item) {
-		notifier.addItem(item);
-	}
-
-	public void itemDone(String item) {
-		notifier.itemDone(item);
-	}
 }
diff --git a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/UploadingFileImpl.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/UploadingFileImpl.java
similarity index 90%
rename from haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/UploadingFileImpl.java
rename to haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/UploadingFileImpl.java
index ac3a403a66992187c64d1e6b2ff7b14e2518adc1..9c921e5a3f8317d9ecf7472c9816b2db9561ac11 100644
--- a/haas-imagej-client/src/main/java/cz/it4i/fiji/haas/data_transfer/UploadingFileImpl.java
+++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/UploadingFileImpl.java
@@ -1,4 +1,4 @@
-package cz.it4i.fiji.haas.data_transfer;
+package cz.it4i.fiji.haas_java_client;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -12,7 +12,7 @@ import cz.it4i.fiji.haas_java_client.HaaSClient.UploadingFile;
 
 public class UploadingFileImpl implements UploadingFile {
 
-	public static final Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas.data_transfer.UploadingFileImpl.class);
+	public static final Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas_java_client.UploadingFileImpl.class);
 
 	private final Path path;
 
diff --git a/haas-java-client/src/test/java/cz/it4i/fiji/haas_java_client/TestConcurentAccessToHaaSFileTransfer.java b/haas-java-client/src/test/java/cz/it4i/fiji/haas_java_client/TestConcurentAccessToHaaSFileTransfer.java
index cdeedef7f7bcb4a58bdd249520d82c5dfa6eae2b..8646f9816af46e211d499ce6ed1704fe44ab0653 100644
--- a/haas-java-client/src/test/java/cz/it4i/fiji/haas_java_client/TestConcurentAccessToHaaSFileTransfer.java
+++ b/haas-java-client/src/test/java/cz/it4i/fiji/haas_java_client/TestConcurentAccessToHaaSFileTransfer.java
@@ -14,8 +14,8 @@ public class TestConcurentAccessToHaaSFileTransfer {
 
 	public static void main(String[] args) throws ServiceException, IOException {
 		HaaSClient client = new HaaSClient(TestingConstants.getSettings(1l, 600, 7l, "OPEN-12-20"));
-		HaaSFileTransfer tr1 = client.startFileTransfer(250, new DummyProgressNotifier());
-		HaaSFileTransfer tr2 = client.startFileTransfer(249, new DummyProgressNotifier());
+		HaaSFileTransfer tr1 = client.startFileTransfer(250, HaaSClient.DUMMY_TRANSFER_FILE_PROGRESS);
+		HaaSFileTransfer tr2 = client.startFileTransfer(249, HaaSClient.DUMMY_TRANSFER_FILE_PROGRESS);
 		log.info("config.yaml - size:" + tr1.obtainSize(Arrays.asList("config.yaml")));
 		tr1.close();
 		log.info("config.yaml - size:" + tr2.obtainSize(Arrays.asList("config.yaml")));
diff --git a/haas-java-client/src/test/java/cz/it4i/fiji/haas_java_client/TestHaaSJavaClient.java b/haas-java-client/src/test/java/cz/it4i/fiji/haas_java_client/TestHaaSJavaClient.java
index c31d5294bfa064a6fe2eabec712f86508947b89a..886a34da546abb8359aee67c0289610c62b82291 100644
--- a/haas-java-client/src/test/java/cz/it4i/fiji/haas_java_client/TestHaaSJavaClient.java
+++ b/haas-java-client/src/test/java/cz/it4i/fiji/haas_java_client/TestHaaSJavaClient.java
@@ -4,7 +4,6 @@ import java.io.IOException;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 
@@ -25,8 +24,11 @@ public class TestHaaSJavaClient {
 		params.put("inputParam", "someStringParam");
 		Path baseDir = Paths.get("/home/koz01/aaa");
 		HaaSClient client = new HaaSClient(TestingConstants.getSettings(1l, 600, 7l, "DD-17-31"));
-		long jobId = client.start(Arrays.asList(Paths.get("/home/koz01/aaa/vecmath.jar")), "TestOutRedirect",
-				params.entrySet());
+		long jobId = client.createJob("TestOutRedirect", params.entrySet());
+		try (HaaSFileTransfer tr = client.startFileTransfer(jobId, HaaSClient.DUMMY_TRANSFER_FILE_PROGRESS)) {
+			tr.upload(new UploadingFileImpl(Paths.get("/home/koz01/aaa/vecmath.jar")));
+		}
+		client.submitJob(jobId);
 		Path workDir = baseDir.resolve("" + jobId);
 		if (!Files.isDirectory(workDir)) {
 			Files.createDirectories(workDir);
@@ -45,8 +47,9 @@ public class TestHaaSJavaClient {
 			}
 			client.downloadPartsOfJobFiles(jobId, taskFileOffset).forEach(jfc -> showJFC(jfc));
 			if (info.getState() == JobState.Finished) {
-				try (HaaSFileTransfer fileTransfer = client.startFileTransfer(jobId, HaaSClient.DUMMY_NOTIFIER)) {
-					fileTransfer.download(client.getChangedFiles(jobId), workDir);
+				try (HaaSFileTransfer fileTransfer = client.startFileTransfer(jobId,
+						HaaSClient.DUMMY_TRANSFER_FILE_PROGRESS)) {
+					client.getChangedFiles(jobId).forEach(file -> fileTransfer.download(file, workDir));
 				}
 			}
 			log.info("JobId :" + jobId + ", state" + info.getState());
diff --git a/haas-java-client/src/test/java/cz/it4i/fiji/haas_java_client/TestHaaSJavaClientWithSPIM.java b/haas-java-client/src/test/java/cz/it4i/fiji/haas_java_client/TestHaaSJavaClientWithSPIM.java
index 99b4d85370b717e3aa67e0c138b677f2522b3734..c4afe21c9197219255e1885608c99eb5fff9266c 100644
--- a/haas-java-client/src/test/java/cz/it4i/fiji/haas_java_client/TestHaaSJavaClientWithSPIM.java
+++ b/haas-java-client/src/test/java/cz/it4i/fiji/haas_java_client/TestHaaSJavaClientWithSPIM.java
@@ -5,6 +5,7 @@ import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Collections;
+import java.util.stream.StreamSupport;
 
 import javax.xml.rpc.ServiceException;
 
@@ -22,8 +23,15 @@ public class TestHaaSJavaClientWithSPIM {
 		HaaSClient client = new HaaSClient(TestingConstants.getSettings(2, 9600, 6l, "DD-17-31"));
 		Path baseDir = Paths.get("/home/koz01/Work/vyzkumnik/fiji/work/aaa");
 
-		long jobId = client.start(getAllFiles(baseDir.resolve("spim-data")), "TestOutRedirect",
+		long jobId = client.createJob( "TestOutRedirect",
 				Collections.emptyList());
+		
+		try(HaaSFileTransfer tr = client.startFileTransfer(jobId, HaaSClient.DUMMY_TRANSFER_FILE_PROGRESS)) {
+			StreamSupport.stream(getAllFiles(baseDir.resolve("spim-data")).spliterator(), false)
+					.map(UploadingFileImpl::new).forEach(f -> tr.upload(f));
+		}
+		client.submitJob(jobId);
+		
 		Path workDir = baseDir.resolve("" + jobId);
 		if (!Files.isDirectory(workDir)) {
 			Files.createDirectories(workDir);
@@ -45,8 +53,8 @@ public class TestHaaSJavaClientWithSPIM {
 			}
 			client.downloadPartsOfJobFiles(jobId, taskFileOffset).forEach(jfc -> showJFC(jfc));
 			if (info.getState() == JobState.Finished) {
-				try (HaaSFileTransfer fileTransfer = client.startFileTransfer(jobId, HaaSClient.DUMMY_NOTIFIER)) {
-					fileTransfer.download(client.getChangedFiles(jobId), workDir);
+				try (HaaSFileTransfer fileTransfer = client.startFileTransfer(jobId, HaaSClient.DUMMY_TRANSFER_FILE_PROGRESS)) {
+					client.getChangedFiles(jobId).forEach(file -> fileTransfer.download(file, workDir));
 				}
 
 			}
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 1fcdc5692f9a8e07262dfe0afea34ab05a380c8a..2dd3c31e21aa46301aa35b8a2197eb00dfc555c5 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
@@ -42,6 +42,7 @@ import cz.it4i.fiji.haas.JobManager;
 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.ProgressNotifier;
 import cz.it4i.fiji.haas_java_client.Settings;
 import cz.it4i.fiji.haas_java_client.SynchronizableFileType;
 import net.imagej.updater.util.Progress;
@@ -74,7 +75,7 @@ public class BenchmarkJobManager {
 		}
 
 		public synchronized void startJob(Progress progress) throws IOException {
-			job.uploadFile(Constants.CONFIG_YAML, progress);
+			job.uploadFile(Constants.CONFIG_YAML,  new P_ProgressNotifierAdapter(progress));
 			String outputName = getOutputName(job.openLocalFile(Constants.CONFIG_YAML));
 			verifiedState = null;
 			verifiedStateProcessed = false;
@@ -87,15 +88,15 @@ public class BenchmarkJobManager {
 		public JobState getState() {
 			return getStateAsync(r -> r.run()).getNow(JobState.Unknown);
 		}
-		
+
 		public void startUpload() {
 			job.startUploadData();
 		}
-		
+
 		public void stopUpload() {
 			job.stopUploadData();
 		}
-		
+
 		public boolean isUploading() {
 			return job.isUploading();
 		}
@@ -114,16 +115,16 @@ public class BenchmarkJobManager {
 		public void downloadData(Progress progress) throws IOException {
 			if (job.getState() == JobState.Finished) {
 				String filePattern = job.getProperty(SPIM_OUTPUT_FILENAME_PATTERN);
-				job.download(downloadFinishedData(filePattern), progress);
+				job.download(downloadFinishedData(filePattern), new P_ProgressNotifierAdapter(progress));
 			} else if (job.getState() == JobState.Failed || job.getState() == JobState.Canceled) {
-				job.download(downloadFailedData(), progress);
+				job.download(downloadFailedData(), new P_ProgressNotifierAdapter(progress));
 			}
 
 			setDownloaded(true);
 		}
 
 		public void downloadStatistics(Progress progress) throws IOException {
-			job.download(BenchmarkJobManager.downloadStatistics(), progress);
+			job.download(BenchmarkJobManager.downloadStatistics(), new P_ProgressNotifierAdapter(progress));
 			Path resultFile = job.getDirectory().resolve(BENCHMARK_RESULT_FILE);
 			if (resultFile != null)
 				BenchmarkJobManager.formatResultFile(resultFile);
@@ -431,77 +432,6 @@ public class BenchmarkJobManager {
 		return jobManager.getJobs().stream().map(this::convertJob).collect(Collectors.toList());
 	}
 
-	private HaaSClient.UploadingFile getUploadingFile() {
-		return new UploadingFileFromResource("", Constants.CONFIG_YAML);
-	}
-
-	private BenchmarkJob convertJob(Job job) {
-		return new BenchmarkJob(job);
-	}
-
-	private String getOutputName(InputStream openLocalFile) throws IOException {
-		try (InputStream is = openLocalFile) {
-			Yaml yaml = new Yaml();
-
-			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");
-			}
-			if (result.charAt(0) == '"' || result.charAt(0) == '\'') {
-				if (result.charAt(result.length() - 1) != result.charAt(0)) {
-					throw new IllegalArgumentException(result);
-				}
-				result = result.substring(1, result.length() - 1);
-			}
-
-			return result;
-		}
-
-	}
-
-	private static Predicate<String> downloadFinishedData(String filePattern) {
-		return name -> {
-			Path path = getPathSafely(name);
-			if (path == null)
-				return false;
-
-			String fileName = path.getFileName().toString();
-			return fileName.startsWith(filePattern) && fileName.endsWith("h5") || fileName.equals(filePattern + ".xml")
-					|| fileName.equals(Constants.BENCHMARK_RESULT_FILE);
-		};
-	}
-
-	private static Predicate<String> downloadStatistics() {
-		return name -> {
-			Path path = getPathSafely(name);
-			if (path == null)
-				return false;
-
-			String fileName = path.getFileName().toString();
-			return fileName.equals(Constants.BENCHMARK_RESULT_FILE);
-		};
-	}
-
-	private static Predicate<String> downloadFailedData() {
-		return name -> {
-			Path path = getPathSafely(name);
-			if (path == null)
-				return false;
-			return path.getFileName().toString().startsWith("snakejob.")
-					|| path.getParent() != null && path.getParent().getFileName() != null
-							&& path.getParent().getFileName().toString().equals("logs");
-		};
-	}
-
-	private static Path getPathSafely(String name) {
-		try {
-			return Paths.get(name);
-		} catch (InvalidPathException ex) {
-			return null;
-		}
-	}
-
 	public static void formatResultFile(Path filename) throws FileNotFoundException {
 
 		List<ResultFileTask> identifiedTasks = new LinkedList<ResultFileTask>();
@@ -603,6 +533,77 @@ public class BenchmarkJobManager {
 		}
 	}
 
+	private HaaSClient.UploadingFile getUploadingFile() {
+		return new UploadingFileFromResource("", Constants.CONFIG_YAML);
+	}
+
+	private BenchmarkJob convertJob(Job job) {
+		return new BenchmarkJob(job);
+	}
+
+	private String getOutputName(InputStream openLocalFile) throws IOException {
+		try (InputStream is = openLocalFile) {
+			Yaml yaml = new Yaml();
+
+			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");
+			}
+			if (result.charAt(0) == '"' || result.charAt(0) == '\'') {
+				if (result.charAt(result.length() - 1) != result.charAt(0)) {
+					throw new IllegalArgumentException(result);
+				}
+				result = result.substring(1, result.length() - 1);
+			}
+
+			return result;
+		}
+
+	}
+
+	private static Predicate<String> downloadFinishedData(String filePattern) {
+		return name -> {
+			Path path = getPathSafely(name);
+			if (path == null)
+				return false;
+
+			String fileName = path.getFileName().toString();
+			return fileName.startsWith(filePattern) && fileName.endsWith("h5") || fileName.equals(filePattern + ".xml")
+					|| fileName.equals(Constants.BENCHMARK_RESULT_FILE);
+		};
+	}
+
+	private static Predicate<String> downloadStatistics() {
+		return name -> {
+			Path path = getPathSafely(name);
+			if (path == null)
+				return false;
+
+			String fileName = path.getFileName().toString();
+			return fileName.equals(Constants.BENCHMARK_RESULT_FILE);
+		};
+	}
+
+	private static Predicate<String> downloadFailedData() {
+		return name -> {
+			Path path = getPathSafely(name);
+			if (path == null)
+				return false;
+			return path.getFileName().toString().startsWith("snakejob.")
+					|| path.getParent() != null && path.getParent().getFileName() != null
+							&& path.getParent().getFileName().toString().equals("logs");
+		};
+	}
+
+	private static Path getPathSafely(String name) {
+		try {
+			return Paths.get(name);
+		} catch (InvalidPathException ex) {
+			return null;
+		}
+	}
+
 	private static Settings constructSettingsFromParams(BenchmarkSPIMParameters params) {
 		return new Settings() {
 
@@ -653,4 +654,37 @@ public class BenchmarkJobManager {
 		};
 	}
 
+	private class P_ProgressNotifierAdapter implements ProgressNotifier {
+		private Progress progress;
+
+		public P_ProgressNotifierAdapter(Progress progress) {
+			this.progress = progress;
+		}
+
+		public void setTitle(String title) {
+			progress.setTitle(title);
+		}
+
+		public void setCount(int count, int total) {
+			progress.setCount(count, total);
+		}
+
+		public void addItem(Object item) {
+			progress.addItem(item);
+		}
+
+		public void setItemCount(int count, int total) {
+			progress.setItemCount(count, total);
+		}
+
+		public void itemDone(Object item) {
+			progress.itemDone(item);
+		}
+
+		public void done() {
+			progress.done();
+		}
+
+	}
+
 }