diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCache.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCache.java
index a62e850d55d6e2e66e46a9d64eaf40b1cad10297..fb7a40b5b373eadb9b6b2ab3faee3184475af2c0 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCache.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCache.java
@@ -17,6 +17,8 @@
 package ch.systemsx.cisd.openbis.dss.generic.shared.content;
 
 import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -59,42 +61,35 @@ public class ContentCache implements IContentCache
     {
         String workspacePath =
                 properties.getProperty(CACHE_WORKSPACE_FOLDER_KEY, "../../data/dss-cache");
-        boolean sessionCache = workspacePath == null;
         File cacheWorkspace = new File(workspacePath);
-        return new ContentCache(new DssServiceRpcGenericFactory(), cacheWorkspace, sessionCache,
+        return new ContentCache(new DssServiceRpcGenericFactory(), cacheWorkspace,
                 FileOperations.getInstance(), SystemTimeProvider.SYSTEM_TIME_PROVIDER);
     }
-    
+
     private final Map<String, Integer> dataSetLocks = new HashMap<String, Integer>();
-    
+
     private final LockManager fileLockManager;
-    
-    private final IDssServiceRpcGenericFactory serviceFactory;
 
-    private final boolean sessionCache;
+    private final IDssServiceRpcGenericFactory serviceFactory;
 
     private final File workspace;
-    
+
     private final ITimeProvider timeProvider;
-    
+
     ContentCache(IDssServiceRpcGenericFactory serviceFactory, File cacheWorkspace,
-            boolean sessionCache, IFileOperations fileOperations, ITimeProvider timeProvider)
+            IFileOperations fileOperations, ITimeProvider timeProvider)
     {
         this.serviceFactory = serviceFactory;
         this.workspace = cacheWorkspace;
-        this.sessionCache = sessionCache;
         this.timeProvider = timeProvider;
-        if (sessionCache == false)
-        {
-            fileOperations.removeRecursivelyQueueing(new File(cacheWorkspace, DOWNLOADING_FOLDER));
-        }
+        fileOperations.removeRecursivelyQueueing(new File(cacheWorkspace, DOWNLOADING_FOLDER));
         fileLockManager = new LockManager();
     }
 
     @Override
     public void lockDataSet(String sessionToken, String dataSetCode)
     {
-        String dataSetPath = createDataSetPath(sessionToken, CACHE_FOLDER, dataSetCode);
+        String dataSetPath = createDataSetPath(CACHE_FOLDER, dataSetCode);
         synchronized (dataSetLocks)
         {
             Integer count = dataSetLocks.get(dataSetPath);
@@ -110,7 +105,7 @@ public class ContentCache implements IContentCache
     @Override
     public void unlockDataSet(String sessionToken, String dataSetCode)
     {
-        String dataSetPath = createDataSetPath(sessionToken, CACHE_FOLDER, dataSetCode);
+        String dataSetPath = createDataSetPath(CACHE_FOLDER, dataSetCode);
         synchronized (dataSetLocks)
         {
             Integer count = dataSetLocks.remove(dataSetPath);
@@ -120,11 +115,11 @@ public class ContentCache implements IContentCache
             }
         }
     }
-    
+
     @Override
     public boolean isDataSetLocked(String sessionToken, String dataSetCode)
     {
-        String dataSetPath = createDataSetPath(sessionToken, CACHE_FOLDER, dataSetCode);
+        String dataSetPath = createDataSetPath(CACHE_FOLDER, dataSetCode);
         synchronized (dataSetLocks)
         {
             return dataSetLocks.containsKey(dataSetPath);
@@ -132,11 +127,9 @@ public class ContentCache implements IContentCache
     }
 
     @Override
-    public File getFile(String sessionToken, IDatasetLocation dataSetLocation,
-            DataSetPathInfo path)
+    public File getFile(String sessionToken, IDatasetLocation dataSetLocation, DataSetPathInfo path)
     {
-        String pathInWorkspace =
-                createPathInWorkspace(sessionToken, CACHE_FOLDER, dataSetLocation, path);
+        String pathInWorkspace = createPathInWorkspace(CACHE_FOLDER, dataSetLocation, path);
         fileLockManager.lock(pathInWorkspace);
         try
         {
@@ -146,7 +139,7 @@ public class ContentCache implements IContentCache
                 downloadFile(sessionToken, dataSetLocation, path);
             }
             File dataSetFolder =
-                    new File(workspace, createDataSetPath(sessionToken, CACHE_FOLDER,
+                    new File(workspace, createDataSetPath(CACHE_FOLDER,
                             dataSetLocation.getDataSetCode()));
             dataSetFolder.setLastModified(timeProvider.getTimeInMilliseconds());
             return file;
@@ -156,8 +149,21 @@ public class ContentCache implements IContentCache
         }
     }
 
-    private void downloadFile(String sessionToken,
-            IDatasetLocation dataSetLocation, DataSetPathInfo path)
+    @Override
+    public InputStream getInputStream(String sessionToken, IDatasetLocation dataSetLocation,
+            DataSetPathInfo path)
+    {
+        try
+        {
+            return new FileInputStream(getFile(sessionToken, dataSetLocation, path));
+        } catch (FileNotFoundException ex)
+        {
+            throw CheckedExceptionTunnel.wrapIfNecessary(ex);
+        }
+    }
+
+    private void downloadFile(String sessionToken, IDatasetLocation dataSetLocation,
+            DataSetPathInfo path)
     {
         InputStream input = null;
         try
@@ -169,10 +175,8 @@ public class ContentCache implements IContentCache
             String url =
                     service.getDownloadUrlForFileForDataSet(sessionToken, dataSetCode, relativePath);
             input = createURL(url).openStream();
-            File downloadedFile =
-                    createFileFromInputStream(sessionToken, dataSetLocation, path, input);
-            String pathInWorkspace =
-                    createPathInWorkspace(sessionToken, CACHE_FOLDER, dataSetLocation, path);
+            File downloadedFile = createFileFromInputStream(dataSetLocation, path, input);
+            String pathInWorkspace = createPathInWorkspace(CACHE_FOLDER, dataSetLocation, path);
             File file = new File(workspace, pathInWorkspace);
             createFolder(file.getParentFile());
             downloadedFile.renameTo(file);
@@ -185,23 +189,16 @@ public class ContentCache implements IContentCache
         }
     }
 
-    private String createPathInWorkspace(String sessionToken, String folder,
-            IDatasetLocation dataSetLocation, DataSetPathInfo path)
+    private String createPathInWorkspace(String folder, IDatasetLocation dataSetLocation,
+            DataSetPathInfo path)
     {
         String dataSetCode = dataSetLocation.getDataSetCode();
-        return createDataSetPath(sessionToken, folder, dataSetCode + "/"
-                + path.getRelativePath());
+        return createDataSetPath(folder, dataSetCode + "/" + path.getRelativePath());
     }
 
-    private String createDataSetPath(String sessionToken, String folder,
-            String dataSetCode)
+    private String createDataSetPath(String folder, String dataSetCode)
     {
-        return createPath(sessionToken, folder + "/" + dataSetCode);
-    }
-
-    private String createPath(String sessionToken, String relativePath)
-    {
-        return (sessionCache ? sessionToken + "/dss-cache/" : "") + relativePath;
+        return folder + "/" + dataSetCode;
     }
 
     private URL createURL(String url)
@@ -219,11 +216,11 @@ public class ContentCache implements IContentCache
         }
     }
 
-    private File createFileFromInputStream(String sessionToken,
-            IDatasetLocation dataSetLocation, DataSetPathInfo path, InputStream inputStream)
+    private File createFileFromInputStream(IDatasetLocation dataSetLocation, DataSetPathInfo path,
+            InputStream inputStream)
     {
         String relativePath = DOWNLOADING_FOLDER + "/" + Thread.currentThread().getId();
-        File file = new File(workspace, createPath(sessionToken, relativePath));
+        File file = new File(workspace, relativePath);
         createFolder(file.getParentFile());
         OutputStream ostream = null;
         try
@@ -252,15 +249,16 @@ public class ContentCache implements IContentCache
             }
         }
     }
-    
+
     private static final class LockManager
     {
         private static final class LockWithCounter
         {
             private Lock lock = new ReentrantLock();
+
             private int count;
         }
-        
+
         private final Map<String, LockWithCounter> locks = new HashMap<String, LockWithCounter>();
 
         void lock(String path)
@@ -291,7 +289,7 @@ public class ContentCache implements IContentCache
                 }
             }
         }
-        
+
     }
 
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/IContentCache.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/IContentCache.java
index 41694ef82cf6bc61edf4e30eaf89f1aa2d60927b..cdf2201ae9f133b9d9e07c5a42d87b69bcec9727 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/IContentCache.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/IContentCache.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.dss.generic.shared.content;
 
 import java.io.File;
+import java.io.InputStream;
 
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetPathInfo;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
@@ -37,4 +38,7 @@ public interface IContentCache
 
     public File getFile(String sessionToken, IDatasetLocation dataSetLocation, DataSetPathInfo path);
 
+    public InputStream getInputStream(String sessionToken, IDatasetLocation dataSetLocation,
+            DataSetPathInfo path);
+
 }
\ No newline at end of file
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNode.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNode.java
index 416bf1be83c217b1dcd9749d01f60fbcea732072..50b1acf4710919a1de45820cdadb8ca9e30608d1 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNode.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNode.java
@@ -17,8 +17,6 @@
 package ch.systemsx.cisd.openbis.dss.generic.shared.content;
 
 import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
 import java.io.InputStream;
 import java.util.ArrayList;
 import java.util.Date;
@@ -204,13 +202,6 @@ public class RemoteHierarchicalContentNode implements IHierarchicalContentNode
     @Override
     public InputStream getInputStream() throws UnsupportedOperationException, IOExceptionUnchecked
     {
-        File f = getFile();
-        try
-        {
-            return new FileInputStream(f);
-        } catch (FileNotFoundException ex)
-        {
-            throw new IOExceptionUnchecked(ex);
-        }
+        return cache.getInputStream(sessionTokenProvider.getSessionToken(), dataSetLocation, path);
     }
 }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/AbstractRemoteHierarchicalContentTestCase.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/AbstractRemoteHierarchicalContentTestCase.java
index 25c58e374d5effba615a6aaef25d116c64d9000c..0887cb461391f42f49d82a1e4536756b14ef9e1b 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/AbstractRemoteHierarchicalContentTestCase.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/AbstractRemoteHierarchicalContentTestCase.java
@@ -114,20 +114,16 @@ public abstract class AbstractRemoteHierarchicalContentTestCase extends Abstract
         context.assertIsSatisfied();
     }
 
-    protected ContentCache createCache(boolean sessionCache)
+    protected ContentCache createCache()
     {
-        if (sessionCache == false)
-        {
-            context.checking(new Expectations()
+        context.checking(new Expectations()
+            {
                 {
-                    {
-                        one(fileOperations).removeRecursivelyQueueing(
-                                new File(workSpace, ContentCache.DOWNLOADING_FOLDER));
-                    }
-                });
-        }
-        return new ContentCache(serviceFactory, workSpace, sessionCache, fileOperations,
-                timeProvider);
+                    one(fileOperations).removeRecursivelyQueueing(
+                            new File(workSpace, ContentCache.DOWNLOADING_FOLDER));
+                }
+            });
+        return new ContentCache(serviceFactory, workSpace, fileOperations, timeProvider);
     }
 
 
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCacheTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCacheTest.java
index a834e1317cede136ad562775f9110beba2863cf4..56979b248f968c56c0699388aa29f2cd34b88046 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCacheTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/ContentCacheTest.java
@@ -62,7 +62,7 @@ public class ContentCacheTest extends AssertJUnit
     @Test
     public void testDataSetLocking()
     {
-        ContentCache cache = createCache(false);
+        ContentCache cache = createCache();
         
         cache.lockDataSet(SESSION_TOKEN, "DS-1");
         
@@ -84,19 +84,16 @@ public class ContentCacheTest extends AssertJUnit
         context.assertIsSatisfied();
     }
     
-    private ContentCache createCache(boolean sessionCache)
+    private ContentCache createCache()
     {
         final File workSpace = new File(".");
-        if (sessionCache == false)
-        {
-            context.checking(new Expectations()
+        context.checking(new Expectations()
+            {
                 {
-                    {
-                        one(fileOperations).removeRecursivelyQueueing(
-                                new File(workSpace, ContentCache.DOWNLOADING_FOLDER));
-                    }
-                });
-        }
-        return new ContentCache(null, workSpace, sessionCache, fileOperations, timeProvider);
+                    one(fileOperations).removeRecursivelyQueueing(
+                            new File(workSpace, ContentCache.DOWNLOADING_FOLDER));
+                }
+            });
+        return new ContentCache(null, workSpace, fileOperations, timeProvider);
     }
 }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNodeMultiThreadTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNodeMultiThreadTest.java
index 877a72665617da485acb32f2256ae2480e004cef..6068bd1ce32b1da42f423b14636c855844f48310 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNodeMultiThreadTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNodeMultiThreadTest.java
@@ -18,7 +18,6 @@ package ch.systemsx.cisd.openbis.dss.generic.shared.content;
 
 import java.io.File;
 import java.util.Arrays;
-import java.util.List;
 
 import org.jmock.Expectations;
 import org.jmock.internal.NamedSequence;
@@ -40,7 +39,7 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractRemote
     @Test
     public void testGetTwoDifferentFilesInSequence() throws Exception
     {
-        ContentCache cache = createCache(true);
+        ContentCache cache = createCache();
         final DataSetPathInfo pathInfo1 = new DataSetPathInfo();
         pathInfo1.setRelativePath(remoteFile1.getName());
         pathInfo1.setDirectory(false);
@@ -69,20 +68,19 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractRemote
         File file1 = node1.getFile();
         
         assertEquals(0, file1.getParentFile().lastModified());
-        assertEquals(new File(workSpace, SESSION_TOKEN + "/dss-cache/" + ContentCache.CACHE_FOLDER
+        assertEquals(new File(workSpace, ContentCache.CACHE_FOLDER
                 + "/" + DATA_SET_CODE + "/" + remoteFile1.getName()).getAbsolutePath(),
                 file1.getAbsolutePath());
         assertEquals(FILE1_CONTENT, FileUtilities.loadToString(file1).trim());
         assertEquals(
                 "[]",
                 Arrays.asList(
-                        new File(workSpace, SESSION_TOKEN + "/dss-cache/"
-                                + ContentCache.DOWNLOADING_FOLDER).list()).toString());
+                        new File(workSpace, ContentCache.DOWNLOADING_FOLDER).list()).toString());
         
         File file2 = node2.getFile();
 
         assertEquals(60000, file2.getParentFile().lastModified());
-        assertEquals(new File(workSpace, SESSION_TOKEN + "/dss-cache/" + ContentCache.CACHE_FOLDER
+        assertEquals(new File(workSpace, ContentCache.CACHE_FOLDER
                 + "/" + DATA_SET_CODE + "/" + remoteFile2.getName()).getAbsolutePath(),
                 file2.getAbsolutePath());
         assertEquals(FILE2_CONTENT, FileUtilities.loadToString(file2).trim());
@@ -92,7 +90,7 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractRemote
     @Test
     public void testGetSameFileInSequenceFirstTryFailing() throws Exception
     {
-        ContentCache cache = createCache(false);
+        ContentCache cache = createCache();
         final DataSetPathInfo pathInfo = new DataSetPathInfo();
         pathInfo.setRelativePath(remoteFile1.getName());
         pathInfo.setDirectory(false);
@@ -132,7 +130,7 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractRemote
     @Test
     public void testGetTwoDifferentFilesInTwoThreads() throws Exception
     {
-        ContentCache cache = createCache(false);
+        ContentCache cache = createCache();
         final DataSetPathInfo pathInfo1 = new DataSetPathInfo();
         pathInfo1.setRelativePath(remoteFile1.getName());
         pathInfo1.setDirectory(false);
@@ -211,7 +209,7 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractRemote
     @Test
     public void testGetSameFileInTwoThreads() throws Exception
     {
-        ContentCache cache = createCache(false);
+        ContentCache cache = createCache();
         final DataSetPathInfo pathInfo = new DataSetPathInfo();
         pathInfo.setRelativePath(remoteFile1.getName());
         pathInfo.setDirectory(false);
@@ -275,7 +273,7 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractRemote
     @Test
     public void testGetSameFileInThreeThreads() throws Exception
     {
-        ContentCache cache = createCache(false);
+        ContentCache cache = createCache();
         final DataSetPathInfo pathInfo = new DataSetPathInfo();
         pathInfo.setRelativePath(remoteFile1.getName());
         pathInfo.setDirectory(false);
@@ -356,7 +354,7 @@ public class RemoteHierarchicalContentNodeMultiThreadTest extends AbstractRemote
     @Test
     public void testGetSameFileInTwoThreadsFirstDownloadFails() throws Exception
     {
-        ContentCache cache = createCache(false);
+        ContentCache cache = createCache();
         final DataSetPathInfo pathInfo = new DataSetPathInfo();
         pathInfo.setRelativePath(remoteFile1.getName());
         pathInfo.setDirectory(false);
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNodeTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNodeTest.java
index 6966941a21200e6289d02b59af6634be4a03d179..b0fbf9061e5aae2857e480e683f8fd89be1c2ac9 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNodeTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentNodeTest.java
@@ -114,8 +114,7 @@ public class RemoteHierarchicalContentNodeTest
                 }
             });
         cache =
-                new ContentCache(serviceFactory, SESSION_WORKSPACE_DIR, false, fileOperations,
-                        SYSTEM_TIME_PROVIDER);
+                new ContentCache(serviceFactory, SESSION_WORKSPACE_DIR, fileOperations, SYSTEM_TIME_PROVIDER);
     }
 
     @Test
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentTest.java
index 8d29d9ed06b7d1e239aadd5062b3caee6aaf57a8..efe79b38b510ba2b22dee1112c2e0ba52b725cd6 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/shared/content/RemoteHierarchicalContentTest.java
@@ -35,7 +35,7 @@ public class RemoteHierarchicalContentTest extends AbstractRemoteHierarchicalCon
     @Test
     public void testLockingUnlockingDataSet()
     {
-        ContentCache cache = createCache(false);
+        ContentCache cache = createCache();
         RemoteHierarchicalContent content = createContent(cache);
 
         assertEquals(true, cache.isDataSetLocked(SESSION_TOKEN, DATA_SET_CODE));
@@ -49,7 +49,7 @@ public class RemoteHierarchicalContentTest extends AbstractRemoteHierarchicalCon
     @Test
     public void testGetDefaultRootNode() throws Exception
     {
-        ContentCache cache = createCache(false);
+        ContentCache cache = createCache();
         RemoteHierarchicalContent content = createContent(cache);
 
         context.checking(new Expectations()
@@ -71,7 +71,7 @@ public class RemoteHierarchicalContentTest extends AbstractRemoteHierarchicalCon
     @Test
     public void testGetRootNode() throws Exception
     {
-        ContentCache cache = createCache(false);
+        ContentCache cache = createCache();
         RemoteHierarchicalContent content = createContent(cache);
         
         context.checking(new Expectations()