diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ServiceConversationClientManager.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ServiceConversationClientManager.java
index 0d88a2c12834f89220585f746d60dfa022e5ca67..bbc9ae20aa06e2e59eb3b6f2365588519e63540f 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ServiceConversationClientManager.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ServiceConversationClientManager.java
@@ -31,15 +31,16 @@ public class ServiceConversationClientManager extends BaseServiceConversationCli
 
     private ServiceConversationDataStoreClientId dataStoreClientId;
 
-    private String applicationServerServerUrl;
+    private ServiceConversationApplicationServerUrl applicationServerUrl;
 
     private int applicationServerTimeoutInMillis;
 
     @Override
     public IETLLIMSService getETLService(String sessionToken)
     {
-        return getService(applicationServerServerUrl, IETLLIMSService.class, sessionToken,
-                dataStoreClientId, applicationServerTimeoutInMillis);
+        return getService(applicationServerUrl.getServerUrl(applicationServerTimeoutInMillis),
+                IETLLIMSService.class, sessionToken, dataStoreClientId,
+                applicationServerTimeoutInMillis);
     }
 
     public void setDataStoreCode(String dataStoreCode)
@@ -49,8 +50,8 @@ public class ServiceConversationClientManager extends BaseServiceConversationCli
 
     public void setApplicationServerUrl(String applicationServerUrl)
     {
-        this.applicationServerServerUrl =
-                new ServiceConversationApplicationServerUrl(applicationServerUrl).getServerUrl();
+        this.applicationServerUrl =
+                new ServiceConversationApplicationServerUrl(applicationServerUrl);
     }
 
     public void setApplicationServerTimeout(String applicationServerTimeout)
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ServiceConversationServerManager.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ServiceConversationServerManager.java
index 7a61ef2ad561ebef9b4f809a67e2ca4c9482d4eb..045ab76f03ddd69b816d78c2e0b627a5d459bea9 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ServiceConversationServerManager.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ServiceConversationServerManager.java
@@ -32,7 +32,7 @@ public class ServiceConversationServerManager extends BaseServiceConversationSer
 
     private IDataStoreService dataStoreService;
 
-    private String applicationServerClientUrl;
+    private ServiceConversationApplicationServerUrl applicationServerUrl;
 
     private int applicationServerTimeoutInMillis;
 
@@ -47,7 +47,8 @@ public class ServiceConversationServerManager extends BaseServiceConversationSer
     {
         if (clientId instanceof ServiceConversationApplicationServerClientId)
         {
-            return new ServiceConversationClientDetails(applicationServerClientUrl,
+            return new ServiceConversationClientDetails(
+                    applicationServerUrl.getClientUrl(applicationServerTimeoutInMillis),
                     applicationServerTimeoutInMillis);
         }
         return null;
@@ -60,8 +61,8 @@ public class ServiceConversationServerManager extends BaseServiceConversationSer
 
     public void setApplicationServerUrl(String applicationServerUrl)
     {
-        this.applicationServerClientUrl =
-                new ServiceConversationApplicationServerUrl(applicationServerUrl).getClientUrl();
+        this.applicationServerUrl =
+                new ServiceConversationApplicationServerUrl(applicationServerUrl);
     }
 
     public void setApplicationServerTimeout(String applicationServerTimeout)
diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/api/client/ServiceFinder.java b/openbis-common/source/java/ch/systemsx/cisd/common/api/client/ServiceFinder.java
index 16fb8ddee50605152c0de2757e0b5d9516162cc9..24701dd21e3843c0573d20f96f54c7a79b322e8f 100644
--- a/openbis-common/source/java/ch/systemsx/cisd/common/api/client/ServiceFinder.java
+++ b/openbis-common/source/java/ch/systemsx/cisd/common/api/client/ServiceFinder.java
@@ -117,6 +117,22 @@ public class ServiceFinder
      */
     public <S> S createService(Class<S> serviceInterface, String serverUrl,
             IServicePinger<S> servicePinger, long timeoutInMillis)
+    {
+        ServiceWithUrl<S> serviceWithUrl =
+                createServiceWithUrl(serviceInterface, serverUrl, servicePinger, timeoutInMillis);
+        return serviceWithUrl.getService();
+    }
+
+    public <S> String createServiceUrl(Class<S> serviceInterface, String serverUrl,
+            IServicePinger<S> servicePinger, long timeoutInMillis)
+    {
+        ServiceWithUrl<S> serviceWithUrl =
+                createServiceWithUrl(serviceInterface, serverUrl, servicePinger, timeoutInMillis);
+        return serviceWithUrl.getUrl();
+    }
+
+    private <S> ServiceWithUrl<S> createServiceWithUrl(Class<S> serviceInterface, String serverUrl,
+            IServicePinger<S> servicePinger, long timeoutInMillis)
     {
         S service;
         String usedServerUrl = computeServerUrlWithDoubledApplicationName(serverUrl);
@@ -126,7 +142,7 @@ public class ServiceFinder
                         usedServerUrl);
         if (canConnectToService(service, servicePinger))
         {
-            return service;
+            return new ServiceWithUrl<S>(usedServerUrl, service);
         }
 
         // Try the url that ends in just one <applicationName>
@@ -136,7 +152,7 @@ public class ServiceFinder
                         usedServerUrl);
         if (canConnectToService(service, servicePinger))
         {
-            return service;
+            return new ServiceWithUrl<S>(usedServerUrl, service);
         }
 
         // Try the url as provided
@@ -144,7 +160,7 @@ public class ServiceFinder
         service =
                 createServiceStubStoringCertificateIfNecessary(serviceInterface, timeoutInMillis,
                         usedServerUrl);
-        return service;
+        return new ServiceWithUrl<S>(usedServerUrl, service);
     }
 
     private <S> S createServiceStubStoringCertificateIfNecessary(Class<S> serviceInterface,
@@ -276,4 +292,27 @@ public class ServiceFinder
         configDir.mkdirs();
         return configDir;
     }
+
+    private class ServiceWithUrl<S>
+    {
+        private String url;
+
+        private S service;
+
+        public ServiceWithUrl(String url, S service)
+        {
+            this.url = url + urlServiceSuffix;
+            this.service = service;
+        }
+
+        public String getUrl()
+        {
+            return url;
+        }
+
+        public S getService()
+        {
+            return service;
+        }
+    }
 }
diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/BaseServiceConversationClientManager.java b/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/BaseServiceConversationClientManager.java
index a44cad4d5e06d52375c758b58988af6fa02e9287..03d630c6857e1b260be42cf9eecfec87488ce411 100644
--- a/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/BaseServiceConversationClientManager.java
+++ b/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/BaseServiceConversationClientManager.java
@@ -53,6 +53,11 @@ public class BaseServiceConversationClientManager implements
         }
     }
 
+    @Override
+    public void ping()
+    {
+    }
+
     public <T> T getService(String serverUrl, Class<T> serviceInterface, String sessionToken,
             Object clientId, int clientTimeout)
     {
diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/BaseServiceConversationServerManager.java b/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/BaseServiceConversationServerManager.java
index 7f61908c3576bc92637eb0e56c423458b88e90fc..2e340d8923ea9ad1af624d71c4247caef5b95a37 100644
--- a/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/BaseServiceConversationServerManager.java
+++ b/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/BaseServiceConversationServerManager.java
@@ -118,6 +118,11 @@ public abstract class BaseServiceConversationServerManager implements
         server.getIncomingMessageTransport().send(message);
     }
 
+    @Override
+    public void ping()
+    {
+    }
+
     protected abstract ServiceConversationClientDetails getClientDetailsForClientId(Object clientId);
 
     private synchronized IServiceConversationClientManagerRemote getClientForClientDetails(
diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/IServiceConversationClientManagerRemote.java b/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/IServiceConversationClientManagerRemote.java
index 29a7c12f5276f4ea0ea6a4d45f1fe6b4b21f6056..8ba47f6aeac2dac88d20fec593b6e37dc43d074e 100644
--- a/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/IServiceConversationClientManagerRemote.java
+++ b/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/IServiceConversationClientManagerRemote.java
@@ -28,4 +28,6 @@ public interface IServiceConversationClientManagerRemote extends IServiceMessage
 
     public static final String PATH = "/service-conversation-client-manager";
 
+    public void ping();
+
 }
diff --git a/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/IServiceConversationServerManagerRemote.java b/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/IServiceConversationServerManagerRemote.java
index 7263e56de9fe8e74de47d0ff4e2be5708438a089..d325aabaeb3d78ac3d04a24e518e93e045169d78 100644
--- a/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/IServiceConversationServerManagerRemote.java
+++ b/openbis-common/source/java/ch/systemsx/cisd/common/conversation/manager/IServiceConversationServerManagerRemote.java
@@ -31,5 +31,7 @@ public interface IServiceConversationServerManagerRemote extends IServiceMessage
 
     public ServiceConversationDTO startConversation(String sessionToken, String serviceName,
             Object clientId);
+    
+    public void ping();
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/conversation/ServiceConversationApplicationServerUrl.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/conversation/ServiceConversationApplicationServerUrl.java
index e446aa17e1cf6a067d75afe254627a293da7730c..eeec93b6fbf873d34469902deed8ca7982c02984 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/conversation/ServiceConversationApplicationServerUrl.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/conversation/ServiceConversationApplicationServerUrl.java
@@ -16,6 +16,8 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.conversation;
 
+import ch.systemsx.cisd.common.api.client.IServicePinger;
+import ch.systemsx.cisd.common.api.client.ServiceFinder;
 import ch.systemsx.cisd.common.conversation.manager.IServiceConversationClientManagerRemote;
 import ch.systemsx.cisd.common.conversation.manager.IServiceConversationServerManagerRemote;
 
@@ -27,21 +29,60 @@ public class ServiceConversationApplicationServerUrl
 
     private String applicationServerUrl;
 
+    private String clientUrl;
+
+    private String serverUrl;
+
     public ServiceConversationApplicationServerUrl(String applicationServerUrl)
     {
         this.applicationServerUrl = applicationServerUrl;
     }
 
-    public String getClientUrl()
+    public String getClientUrl(int timeout)
     {
-        return applicationServerUrl + "/openbis/openbis"
-                + IServiceConversationClientManagerRemote.PATH;
+        if (clientUrl == null)
+        {
+            IServicePinger<IServiceConversationClientManagerRemote> pinger =
+                    new IServicePinger<IServiceConversationClientManagerRemote>()
+                        {
+                            @Override
+                            public void ping(IServiceConversationClientManagerRemote service)
+                            {
+                                service.ping();
+                            }
+                        };
+
+            ServiceFinder finder =
+                    new ServiceFinder("openbis", IServiceConversationClientManagerRemote.PATH);
+            clientUrl =
+                    finder.createServiceUrl(IServiceConversationClientManagerRemote.class,
+                            applicationServerUrl, pinger, timeout);
+        }
+
+        return clientUrl;
     }
 
-    public String getServerUrl()
+    public String getServerUrl(int timeout)
     {
-        return applicationServerUrl + "/openbis/openbis"
-                + IServiceConversationServerManagerRemote.PATH;
+        if (serverUrl == null)
+        {
+            IServicePinger<IServiceConversationServerManagerRemote> pinger =
+                    new IServicePinger<IServiceConversationServerManagerRemote>()
+                        {
+                            @Override
+                            public void ping(IServiceConversationServerManagerRemote service)
+                            {
+                                service.ping();
+                            }
+                        };
+            ServiceFinder finder =
+                    new ServiceFinder("openbis", IServiceConversationServerManagerRemote.PATH);
+            serverUrl =
+                    finder.createServiceUrl(IServiceConversationServerManagerRemote.class,
+                            applicationServerUrl, pinger, timeout);
+        }
+
+        return serverUrl;
     }
 
 }