diff --git a/haas-java-client/pom.xml b/haas-java-client/pom.xml
index 77a91b03eaf4329eb03810f068c4ddbcbf785d86..97bce29830f1b968f671b0ca7cb2967dd82a5e6a 100644
--- a/haas-java-client/pom.xml
+++ b/haas-java-client/pom.xml
@@ -4,7 +4,7 @@
 	<modelVersion>4.0.0</modelVersion>
 	<groupId>cz.it4i.fiji</groupId>
 	<artifactId>haas-java-client</artifactId>
-	<version>0.0.3-SNAPSHOT</version>
+	<version>0.0.4-SNAPSHOT</version>
 	<name>HaaS library for Java</name>
 	<packaging>jar</packaging>
 	<properties>
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 3d6d45a68fd90c2f7f786920bfd05bf10d297f8f..68664b19a5f7cdc9e267d0f9da2245a504e2f279 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
@@ -16,6 +16,7 @@ import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Optional;
+import java.util.concurrent.Executors;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
@@ -233,6 +234,21 @@ public class HaaSClient {
 	public HaaSFileTransfer startFileTransfer(long jobId) {
 		return startFileTransfer(jobId, DUMMY_TRANSFER_FILE_PROGRESS);
 	}
+	
+	public TunnelToNode openTunnel(long jobId, String nodeIP, int localPort, int remotePort) throws ServiceException, IOException {
+		MidlewareTunnel tunnel = new MidlewareTunnel(Executors.newCachedThreadPool(), jobId, nodeIP, getSessionID());
+		tunnel.open(localPort, remotePort);
+		return new TunnelToNode() {
+			@Override
+			public void close() throws IOException {
+				tunnel.close();
+			}
+			@Override
+			public int getLocalPort() {
+				return tunnel.getLocalPort();
+			}
+		};
+	}
 
 	public void submitJob(long jobId) {
 		try {
@@ -245,9 +261,11 @@ public class HaaSClient {
 	public JobInfo obtainJobInfo(long jobId) {
 		try {
 			final SubmittedJobInfoExt info = getJobManagement().getCurrentInfoForJob(jobId, getSessionID());
+			
 			final Collection<Long> tasksId = info.getTasks().getSubmittedTaskInfoExt().stream().map(ti -> ti.getId())
 					.collect(Collectors.toList());
 			return new JobInfo() {
+				private List<String> ips;
 				@Override
 				public Collection<Long> getTasks() {
 					return tasksId;
@@ -272,6 +290,18 @@ public class HaaSClient {
 				public Calendar getCreationTime() {
 					return toGregorian(info.getCreationTime());
 				};
+				
+				@Override
+				public List<String> getNodesIPs() {
+					if(ips == null) {
+						try {
+							ips = getJobManagement().getAllocatedNodesIPs(jobId, getSessionID()).getString().stream().collect(Collectors.toList());
+						} catch (RemoteException | ServiceException e) {
+							log.error(e.getMessage(), e);
+						}
+					}
+					return ips;
+				}
 			};
 		} catch (RemoteException | ServiceException e) {
 			throw new HaaSClientException(e);
@@ -552,9 +582,4 @@ public class HaaSClient {
 		return result;
 	}
 
-	public List<String> getNodesIps(long id) throws RemoteException, ServiceException {
-		
-		return getJobManagement().getAllocatedNodesIPs(id, getSessionID()).getString().stream().collect(Collectors.toList());
-	}
-
 }
diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/JobInfo.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/JobInfo.java
index b0868f76e08cb08856a2bfd28088da3151c31a76..07b7517ed4e341711e050112a04e84b165139cb5 100644
--- a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/JobInfo.java
+++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/JobInfo.java
@@ -2,6 +2,7 @@ package cz.it4i.fiji.haas_java_client;
 
 import java.util.Calendar;
 import java.util.Collection;
+import java.util.List;
 
 public interface JobInfo {
 	
@@ -15,4 +16,6 @@ public interface JobInfo {
 	Calendar getEndTime();
 
 	Calendar getCreationTime();
+
+	List<String> getNodesIPs();
 }
diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/MidlewareTunnel.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/MidlewareTunnel.java
index 5d5890ebe7ba290bbb0f9bcdf9c28f7b35c08bd1..a9eff0c5f77ab532632bb4a47e4f1d122ed7fa13 100644
--- a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/MidlewareTunnel.java
+++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/MidlewareTunnel.java
@@ -26,7 +26,7 @@ import cz.it4i.fiji.haas_java_client.proxy.DataTransferMethodExt;
 import cz.it4i.fiji.haas_java_client.proxy.DataTransferWs;
 import cz.it4i.fiji.haas_java_client.proxy.DataTransferWsSoap;
 
-public class MidlewareTunnel implements Closeable {
+class MidlewareTunnel implements Closeable {
 
 	public static final Logger log = LoggerFactory.getLogger(cz.it4i.fiji.haas_java_client.MidlewareTunnel.class);
 
@@ -64,7 +64,7 @@ public class MidlewareTunnel implements Closeable {
 		open(0, port);
 	}
 
-	public void open(int localport, int port) throws UnknownHostException, IOException {
+	public void open(int localport, int port) throws IOException {
 		open(localport, port, DEFAULT_BACKLOG);
 	}
 
@@ -72,7 +72,7 @@ public class MidlewareTunnel implements Closeable {
 		if (ss != null) {
 			throw new IllegalStateException();
 		}
-		ss = new ServerSocket(localport, backlog, InetAddress.getByName("localhost"));
+		ss = new ServerSocket(localport, backlog, InetAddress.getLocalHost());
 		ss.setSoTimeout(TIMEOUT);
 		mainLatch = new CountDownLatch(1);
 		mainFuture = executorService.submit(() -> {
diff --git a/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/TunnelToNode.java b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/TunnelToNode.java
new file mode 100644
index 0000000000000000000000000000000000000000..b9b34c673689ddc734ce68aee54b462897694d7d
--- /dev/null
+++ b/haas-java-client/src/main/java/cz/it4i/fiji/haas_java_client/TunnelToNode.java
@@ -0,0 +1,7 @@
+package cz.it4i.fiji.haas_java_client;
+
+import java.io.Closeable;
+
+public interface TunnelToNode extends Closeable{
+	int getLocalPort();
+}
diff --git a/haas-java-client/src/test/java/cz/it4i/fiji/haas_java_client/TestCommunicationWithNodes.java b/haas-java-client/src/test/java/cz/it4i/fiji/haas_java_client/TestCommunicationWithNodes.java
index 6008a4a3038ca1bd9118123ca80f9d1c290e2bbb..b66b20582a4cfe2f8fb338d6ae68b05ac4d64d1f 100644
--- a/haas-java-client/src/test/java/cz/it4i/fiji/haas_java_client/TestCommunicationWithNodes.java
+++ b/haas-java-client/src/test/java/cz/it4i/fiji/haas_java_client/TestCommunicationWithNodes.java
@@ -1,10 +1,7 @@
 package cz.it4i.fiji.haas_java_client;
 
 import java.io.IOException;
-import java.util.Collections;
 import java.util.Scanner;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 
 import javax.xml.rpc.ServiceException;
 
@@ -17,6 +14,7 @@ public class TestCommunicationWithNodes {
 
 	private static String[] predefined  = new String[2];
 	
+	@SuppressWarnings("resource")
 	public static void main(String[] args) throws ServiceException, IOException, InterruptedException {
 		predefined[0] = "POST /modules/'command:net.imagej.ops.math.PrimitiveMath$IntegerAdd'?process=false HTTP/1.1\r\n" +
                 "Content-Type: application/json\r\n" +
@@ -46,26 +44,15 @@ public class TestCommunicationWithNodes {
 			log.info("" + client.obtainJobInfo(id).getState());
 			Thread.sleep(5000);
 		}
-
-		log.info("adresess " + client.getNodesIps(id));
-		ExecutorService service = Executors.newCachedThreadPool();
-		try(MidlewareTunnel tunnel = new MidlewareTunnel(service, id, client.getNodesIps(id).get(0), sessionID)) {
-			tunnel.open(8080, 8080);
+		String ip;
+		log.info("adresess " + (ip = client.obtainJobInfo(id).getNodesIPs().get(0)));
+		try(TunnelToNode tunnel = client.openTunnel( id, ip, 8080, 8080)) {
 			log.info("localhost:" + tunnel.getLocalPort());
-			Scanner sc = new Scanner(System.in);
 			System.out.println("Press enter");
-			sc.nextLine();
+			new Scanner(System.in).nextLine();
 		}
 	}
 
-	private static void logData(String direction, byte[] received) {
-		log.info(direction + " - " + new String(received));
-	}
-
-	private static long startJob(HaaSClient client) {
-		long id = client.createJob("Proof", 1, Collections.emptyList());
-		client.submitJob(id);
-		return id;
-	}
+	
 
 }