diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/cifs/DSSFileSearchContext.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/cifs/DSSFileSearchContext.java
index 6b7ac145edef66da85ba51d41a4e2a4c480f6d1b..49a0a348a00ce235d7ee93c92a6f01c9d7601559 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/cifs/DSSFileSearchContext.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/cifs/DSSFileSearchContext.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.dss.generic.server.cifs;
 
+import java.io.FileNotFoundException;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -26,9 +27,9 @@ import org.alfresco.jlan.util.WildCard;
 import org.apache.ftpserver.ftplet.FtpException;
 import org.apache.ftpserver.ftplet.FtpFile;
 
-import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.openbis.dss.generic.server.ftp.Cache;
 import ch.systemsx.cisd.openbis.dss.generic.server.ftp.DSSFileSystemView;
+import ch.systemsx.cisd.openbis.dss.generic.server.ftp.NonExistingFtpFile;
 
 /**
  * @author Franz-Josef Elmer
@@ -39,7 +40,8 @@ public class DSSFileSearchContext extends SearchContext
 
     private int index;
 
-    public DSSFileSearchContext(DSSFileSystemView view, String normalizedSearchPath, int fileAttributes, Cache cache)
+    public DSSFileSearchContext(DSSFileSystemView view, String normalizedSearchPath, int fileAttributes, 
+            Cache cache) throws FileNotFoundException
     {
         String[] pathStr = FileName.splitPath(normalizedSearchPath, java.io.File.separatorChar);
         try
@@ -47,7 +49,7 @@ public class DSSFileSearchContext extends SearchContext
             if (pathStr[1] != null && WildCard.containsWildcards(pathStr[1]))
             {
                 WildCard wildCard = new WildCard(pathStr[1], true);
-                FtpFile directory = view.getFile(pathStr[0], cache);
+                FtpFile directory = getFile(view, pathStr[0], cache);
                 List<FtpFile> list = directory.listFiles();
                 for (FtpFile file : list)
                 {
@@ -58,7 +60,7 @@ public class DSSFileSearchContext extends SearchContext
                 }
             } else
             {
-                FtpFile file = view.getFile(normalizedSearchPath, cache);
+                FtpFile file = getFile(view, normalizedSearchPath, cache);
                 if (matches(null, fileAttributes, file))
                 {
                     files.add(file);
@@ -66,10 +68,21 @@ public class DSSFileSearchContext extends SearchContext
             }
         } catch (FtpException ex)
         {
-            throw CheckedExceptionTunnel.wrapIfNecessary(ex);
+            throw new FileNotFoundException("Invalid search path '" + normalizedSearchPath + "'. Reason: " + ex);
         }
     }
 
+    private FtpFile getFile(DSSFileSystemView view, String path, Cache cache) throws FtpException
+    {
+        FtpFile file = view.getFile(path, cache);
+        if (file instanceof NonExistingFtpFile)
+        {
+            throw new FtpException(file.getAbsolutePath() + " doesn't exist. Reason: " 
+                    + ((NonExistingFtpFile) file).getErrorMessage());
+        }
+        return file;
+    }
+
     private boolean matches(WildCard wildcardOrNull, int fileAttributes, FtpFile file)
     {
         return wildcardOrNull == null || wildcardOrNull.matchesPattern(file.getName());
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/cifs/DataSetCifsView.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/cifs/DataSetCifsView.java
index f365c5e084d96c2eebad464b72f32bc4b74611b5..2146a1bbbe46514b00a2d08bc6da07bc56065866 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/cifs/DataSetCifsView.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/cifs/DataSetCifsView.java
@@ -82,8 +82,7 @@ public class DataSetCifsView implements DiskInterface
     @Override
     public DeviceContext createContext(String shareName, ConfigElement args) throws DeviceContextException
     {
-        operationLog.info("create context for share " + shareName);
-        System.out.println(Utils.render(args));
+        operationLog.info("create context for share " + shareName + ": " + Utils.render(args));
         FtpPathResolverConfig resolverConfig = new FtpPathResolverConfig(CifsServerConfig.getServerProperties());
         resolverConfig.logStartupInfo("CIFS");
         pathResolverRegistry = new FtpPathResolverRegistry(resolverConfig);
@@ -147,15 +146,22 @@ public class DataSetCifsView implements DiskInterface
     @Override
     public int fileExists(SrvSession sess, TreeConnection tree, String name)
     {
-        FtpFile file = getFile(createView(sess), name);
-        if (file == null)
+        try
         {
-            return FileStatus.NotExist;
-        } else if (file.isDirectory())
+            FtpFile file = getFile(createView(sess), name);
+            if (file == null || file instanceof NonExistingFtpFile)
+            {
+                return FileStatus.NotExist;
+            } else if (file.isDirectory())
+            {
+                return FileStatus.DirectoryExists;
+            }
+            return FileStatus.FileExists;
+        } catch (Exception ex)
         {
-            return FileStatus.DirectoryExists;
+            operationLog.debug("File doesn't exist. Reason: " + ex);
+            return FileStatus.NotExist;
         }
-        return FileStatus.FileExists;
     }
 
     @Override
@@ -167,30 +173,37 @@ public class DataSetCifsView implements DiskInterface
     @Override
     public NetworkFile openFile(SrvSession sess, TreeConnection tree, FileOpenParams params) throws IOException
     {
-        final String fullPath = normalizePath(params.getFullPath());
         String path = normalizePath(params.getPath());
         DSSFileSystemView view = createView(sess);
-        FtpFile file = getFile(view, fullPath);
-        if (file instanceof NonExistingFtpFile)
-        {
-            NonExistingFtpFile nonExistingFtpFile = (NonExistingFtpFile) file;
-            throw new FileNotFoundException(path + " does not exist. Reason: " + nonExistingFtpFile.getErrorMessage());
-        }
-        NetworkFile networkFile = new CifsFile(file);
-        
-        networkFile.setAttributes(FileAttribute.ReadOnly);
-        networkFile.setCreationDate(file.getLastModified());
-        networkFile.setModifyDate(file.getLastModified());
-        networkFile.setFullName(params.getPath());
-        networkFile.setFileId(fullPath.hashCode());
-        if (file.isDirectory())
+        try
         {
-            networkFile.setAttributes(FileAttribute.Directory| FileAttribute.ReadOnly);
-        } else
+            FtpFile file = getFile(view, path);
+            if (file instanceof NonExistingFtpFile)
+            {
+                NonExistingFtpFile nonExistingFtpFile = (NonExistingFtpFile) file;
+                throw new FileNotFoundException(path + " does not exist. Reason: " + nonExistingFtpFile.getErrorMessage());
+            }
+            operationLog.info("Open file '" + path + "'.");
+            NetworkFile networkFile = new CifsFile(file);
+            
+            networkFile.setAttributes(FileAttribute.ReadOnly);
+            networkFile.setCreationDate(file.getLastModified());
+            networkFile.setModifyDate(file.getLastModified());
+            networkFile.setFullName(params.getPath());
+            networkFile.setFileId(path.hashCode());
+            if (file.isDirectory())
+            {
+                networkFile.setAttributes(FileAttribute.Directory | FileAttribute.ReadOnly);
+            } else
+            {
+                networkFile.setFileSize(file.getSize());
+            }
+            return networkFile;
+        } catch (Exception ex)
         {
-            networkFile.setFileSize(file.getSize());
+            operationLog.debug("Can not open file '" + path + "'. Reason: " + ex);
+            throw new IOException("Can not open file '" + path + "'. Reason: " + ex, ex);
         }
-        return networkFile;
     }
 
     @Override
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/DSSFileSystemView.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/DSSFileSystemView.java
index a441db913e2b8555402a750a662733d623d1a677..48ffa03f1dbe6fb9c68fac19e07c5cfe211f324c 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/DSSFileSystemView.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/DSSFileSystemView.java
@@ -34,6 +34,7 @@ import org.apache.ftpserver.ftplet.FtpFile;
 import org.apache.log4j.Logger;
 
 import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.logging.LogCategory;
 import ch.systemsx.cisd.common.logging.LogFactory;
 import ch.systemsx.cisd.common.utilities.SystemTimeProvider;
@@ -169,7 +170,10 @@ public class DSSFileSystemView implements FileSystemView
             String message =
                     String.format("Error while resolving FTP path '%s' : %s", path,
                             realThrowable.getMessage());
-            operationLog.error(message, realThrowable);
+            if (realThrowable instanceof UserFailureException == false)
+            {
+                operationLog.error(message, realThrowable);
+            }
             throw new FtpException(message);
         }
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpFileFactory.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpFileFactory.java
index 3b06e3a6b4d8791045b32e46212685469ae673c4..0d4bec20d1b077d59c42dedfbd70d4ede31ae306 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpFileFactory.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpFileFactory.java
@@ -39,11 +39,17 @@ public class FtpFileFactory
      */
     public static FtpFile createFtpFile(String dataSetCode, String path,
             IHierarchicalContentNode contentNode, IHierarchicalContent content,
-            IHierarchicalContentNodeFilter childrenFilter)
+            IHierarchicalContentNodeFilter childrenFilter, Cache cache)
     {
-        return new FtpFileImpl(dataSetCode, path, contentNode.getRelativePath(),
-                contentNode.isDirectory(), getSize(contentNode), getLastModified(contentNode),
-                content, childrenFilter);
+        FtpFile file = cache.getFile(path);
+        if (file == null)
+        {
+            file = new FtpFileImpl(dataSetCode, path, contentNode.getRelativePath(),
+                    contentNode.isDirectory(), getSize(contentNode), getLastModified(contentNode),
+                    content, childrenFilter, cache);
+            cache.putFile(file, path);
+        }
+        return file;
 
     }
 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverContext.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverContext.java
index 12647c92b19221519e038e56a74206a56483c85c..518e66315f5b77c7f560d945292d755b9ec19246 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverContext.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverContext.java
@@ -22,10 +22,7 @@ import java.util.Collections;
 import java.util.EnumSet;
 import java.util.List;
 
-import org.apache.log4j.Logger;
-
-import ch.systemsx.cisd.common.logging.LogCategory;
-import ch.systemsx.cisd.common.logging.LogFactory;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.common.server.ISessionTokenProvider;
 import ch.systemsx.cisd.openbis.generic.shared.IServiceForDataStoreServer;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService;
@@ -45,9 +42,6 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifi
  */
 public class FtpPathResolverContext implements ISessionTokenProvider
 {
-    private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION,
-            FtpPathResolverContext.class);
-
     private final String sessionToken;
 
     private final IServiceForDataStoreServer service;
@@ -135,25 +129,18 @@ public class FtpPathResolverContext implements ISessionTokenProvider
         Experiment experiment = cache.getExperiment(experimentId);
         if (experiment == null)
         {
-            try
-            {
-                ExperimentIdentifier experimentIdentifier =
-                        new ExperimentIdentifierFactory(experimentId).createIdentifier();
-
-                List<Experiment> result =
-                        service.listExperiments(sessionToken,
-                                Collections.singletonList(experimentIdentifier),
-                                new ExperimentFetchOptions());
-                experiment = result.isEmpty() ? null : result.get(0);
-                if (experiment != null)
-                {
-                    cache.putExperiment(experiment);
-                }
-            } catch (Exception ex)
+            ExperimentIdentifier experimentIdentifier =
+                    new ExperimentIdentifierFactory(experimentId).createIdentifier();
+            List<Experiment> result =
+                    service.listExperiments(sessionToken,
+                            Collections.singletonList(experimentIdentifier),
+                            new ExperimentFetchOptions());
+            if (result.isEmpty())
             {
-                operationLog.info("Error in experiment identifier '" + experimentId + "': " + ex);
-                return null;
+                throw new UserFailureException("Unknown experiment '" + experimentIdentifier + "'.");
             }
+            experiment = result.get(0);
+            cache.putExperiment(experiment);
         }
         return experiment;
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileEvaluationContext.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileEvaluationContext.java
index 20488dac561475a49227a045d34c0f9692d81344..afa1268a46eeaf057f0b1d12c9ed8bdfde3993d9 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileEvaluationContext.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileEvaluationContext.java
@@ -106,6 +106,7 @@ public class FtpFileEvaluationContext
 
     private IHierarchicalContent createHierarchicalContent(AbstractExternalData dataSet)
     {
+        System.err.println("create content for " + dataSet.getCode());
         return contentProvider.asContent(dataSet);
     }
 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileImpl.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileImpl.java
index 1a501aabde23cf87c50677f295d80f270b3e4206..f09b402c0c6b0c8bcbf32aead9a37853a5f56372 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileImpl.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileImpl.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.dss.generic.server.ftp.resolver;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.sql.Date;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -28,6 +29,7 @@ import ch.systemsx.cisd.openbis.common.io.hierarchical_content.HierarchicalConte
 import ch.systemsx.cisd.openbis.common.io.hierarchical_content.IHierarchicalContentNodeFilter;
 import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContent;
 import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContentNode;
+import ch.systemsx.cisd.openbis.dss.generic.server.ftp.Cache;
 import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpConstants;
 import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpFileFactory;
 
@@ -52,15 +54,18 @@ public class FtpFileImpl extends AbstractFtpFile
 
     private IHierarchicalContent content;
 
+    private final Cache cache;
+    
     public FtpFileImpl(String dataSetCode, String path, String pathInDataSet, boolean isDirectory,
             long size, long lastModified, IHierarchicalContent content,
-            IHierarchicalContentNodeFilter childrenFilter)
+            IHierarchicalContentNodeFilter childrenFilter, Cache cache)
     {
         super(path);
         this.dataSetCode = dataSetCode;
         this.pathInDataSet = pathInDataSet;
         this.isDirectory = isDirectory;
         this.size = size;
+        this.cache = cache;
         setLastModified(lastModified);
         this.content = content;
         this.childrenFilter = childrenFilter;
@@ -149,7 +154,7 @@ public class FtpFileImpl extends AbstractFtpFile
                             absolutePath + FtpConstants.FILE_SEPARATOR + childNode.getName();
                     FtpFile childFile =
                             FtpFileFactory.createFtpFile(dataSetCode, childPath, childNode,
-                                    content, childrenFilter);
+                                    content, childrenFilter, cache);
                     result.add(childFile);
                 }
             }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/ProjectFolderResolver.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/ProjectFolderResolver.java
index b587fa751411cd52de9f40d490759210f2522128..7c59dd686207e8d1d555bc8a7a3256530e869883 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/ProjectFolderResolver.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/ProjectFolderResolver.java
@@ -21,6 +21,7 @@ import java.util.Collections;
 import java.util.List;
 
 import org.apache.commons.lang.StringUtils;
+import org.apache.ftpserver.ftplet.FtpException;
 import org.apache.ftpserver.ftplet.FtpFile;
 
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
@@ -56,6 +57,14 @@ public class ProjectFolderResolver implements IFtpPathResolver
     @Override
     public FtpFile resolve(final String path, final FtpPathResolverContext resolverContext)
     {
+        ProjectIdentifier identifier = parseProjectIdentifier(path);
+        IServiceForDataStoreServer service = resolverContext.getService();
+        String sessionToken = resolverContext.getSessionToken();
+        Project project = service.tryGetProject(sessionToken, identifier);
+        if (project == null)
+        {
+            throw new UserFailureException("Unknown project '" + identifier + "'.");
+        }
         AbstractFtpFolder file = new AbstractFtpFolder(path)
             {
                 @Override
@@ -73,28 +82,13 @@ public class ProjectFolderResolver implements IFtpPathResolver
                     return result;
                 }
             };
-        ProjectIdentifier identifier = parseProjectIdentifier(path);
-        if (identifier != null)
-        {
-            IServiceForDataStoreServer service = resolverContext.getService();
-            String sessionToken = resolverContext.getSessionToken();
-            Project project = service.tryGetProject(sessionToken, identifier);
-            if (project != null)
-            {
-                file.setLastModified(project.getModificationDate().getTime());
-            }
-        }
+        file.setLastModified(project.getModificationDate().getTime());
         return file;
     }
 
-    private List<Experiment> listExperiments(String projectIdentifier,
-            FtpPathResolverContext context)
+    private List<Experiment> listExperiments(String projectIdentifier, FtpPathResolverContext context)
     {
         ProjectIdentifier identifier = parseProjectIdentifier(projectIdentifier);
-        if (identifier == null)
-        {
-            return Collections.emptyList();
-        }
         IServiceForDataStoreServer service = context.getService();
         String sessionToken = context.getSessionToken();
         return service.listExperimentsForProjects(sessionToken,
@@ -103,13 +97,7 @@ public class ProjectFolderResolver implements IFtpPathResolver
     
     private ProjectIdentifier parseProjectIdentifier(String projectIdentifier)
     {
-        try
-        {
-            return new ProjectIdentifierFactory(projectIdentifier).createIdentifier();
-        } catch (UserFailureException ex)
-        {
-            return null;
-        }
+        return new ProjectIdentifierFactory(projectIdentifier).createIdentifier();
     }
     
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/SpaceFolderResolver.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/SpaceFolderResolver.java
index 9957b8b14c5d3bfbf46c486bf902211a567e575f..37a7c2745ca09ff9e989245476db955c1c0ee693 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/SpaceFolderResolver.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/SpaceFolderResolver.java
@@ -21,6 +21,7 @@ import java.util.List;
 
 import org.apache.ftpserver.ftplet.FtpFile;
 
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpConstants;
 import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpPathResolverContext;
 import ch.systemsx.cisd.openbis.dss.generic.server.ftp.IFtpPathResolver;
@@ -50,6 +51,13 @@ public class SpaceFolderResolver implements IFtpPathResolver
     public FtpFile resolve(final String path, final FtpPathResolverContext resolverContext)
     {
         final String spaceCode = removeStartingSlash(path);
+        String sessionToken = resolverContext.getSessionToken();
+        IServiceForDataStoreServer service = resolverContext.getService();
+        Space space = service.tryGetSpace(sessionToken, new SpaceIdentifier(spaceCode));
+        if (space == null)
+        {
+            throw new UserFailureException("Unknown space '" + spaceCode + "'.");
+        }
         AbstractFtpFolder file = new AbstractFtpFolder(path)
             {
                 @Override
@@ -81,13 +89,7 @@ public class SpaceFolderResolver implements IFtpPathResolver
                     return result;
                 }
             };
-        String sessionToken = resolverContext.getSessionToken();
-        IServiceForDataStoreServer service = resolverContext.getService();
-        Space space = service.tryGetSpace(sessionToken, new SpaceIdentifier(spaceCode));
-        if (space != null)
-        {
-            file.setLastModified(space.getModificationDate().getTime());
-        }
+        file.setLastModified(space.getModificationDate().getTime());
         return file;
     }
 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolver.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolver.java
index 9121bbad61688e0581b7942383fbd0cd47960275..9e04d7cd1bf9a4f7445851e5ef6b8398c197a5cc 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolver.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolver.java
@@ -39,6 +39,7 @@ import ch.systemsx.cisd.common.string.Template;
 import ch.systemsx.cisd.openbis.common.io.hierarchical_content.IHierarchicalContentNodeFilter;
 import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContent;
 import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContentNode;
+import ch.systemsx.cisd.openbis.dss.generic.server.ftp.Cache;
 import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpConstants;
 import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpFileFactory;
 import ch.systemsx.cisd.openbis.dss.generic.server.ftp.FtpPathResolverConfig;
@@ -121,6 +122,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
                 IHierarchicalContentNode rootNode =
                         getDataSetFileListRoot(dataSet, hierarchicalContent);
                 List<IHierarchicalContentNode> childNodes = rootNode.getChildNodes();
+                Cache cache = resolverContext.getCache();
                 for (IHierarchicalContentNode childNode : childNodes)
                 {
                     IHierarchicalContentNodeFilter fileFilter = getFileFilter(dataSet);
@@ -128,7 +130,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
                     {
                         result.add(FtpFileFactory.createFtpFile(dataSet.getCode(), absolutePath
                                 + FtpConstants.FILE_SEPARATOR + childNode.getName(), childNode,
-                                hierarchicalContent, fileFilter));
+                                hierarchicalContent, fileFilter, cache));
                     }
                 }
             } finally
@@ -243,10 +245,9 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
         if (fileNamePresent)
         {
             FtpFileEvaluationContext evalContext = evaluateDataSetPaths(resolverContext, dataSets);
-
             try
             {
-                return extractMatchingFile(path, experimentId, evalContext);
+                return extractMatchingFile(path, experimentId, resolverContext.getCache(), evalContext);
             } finally
             {
                 evalContext.close();
@@ -314,7 +315,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
         return null;
     }
 
-    private FtpFile extractMatchingFile(String path, String experimentId,
+    private FtpFile extractMatchingFile(String path, String experimentId, Cache cache, 
             FtpFileEvaluationContext evalContext)
     {
         final EvaluatedElement matchingElement =
@@ -337,8 +338,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
         if (contentNodeOrNull != null && fileFilter.accept(contentNodeOrNull))
         {
             return FtpFileFactory.createFtpFile(dataSet.getCode(), path, contentNodeOrNull,
-                    content,
-                    fileFilter);
+                    content, fileFilter, cache);
         } else
         {
             return FtpPathResolverRegistry.getNonExistingFile(path, "Resource '"
@@ -435,11 +435,11 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
         }
     }
 
-    private List<FtpFile> createFtpFilesFromEvaluationResult(
-            ISessionTokenProvider sessionTokenProvider,
+    private List<FtpFile> createFtpFilesFromEvaluationResult(FtpPathResolverContext context,
             final String parentPath, FtpFileEvaluationContext evalResult)
     {
         ArrayList<FtpFile> result = new ArrayList<FtpFile>();
+        Cache cache = context.getCache();
         for (EvaluatedElement evalElement : evalResult.getEvalElements())
         {
             IHierarchicalContentNodeFilter fileFilter = getFileFilter(evalElement.dataSet);
@@ -448,13 +448,10 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
                 String childPath =
                         parentPath + FtpConstants.FILE_SEPARATOR + evalElement.evaluatedTemplate;
                 String dataSetCode = evalElement.dataSet.getCode();
-                IHierarchicalContentProvider getContentProvider =
-                        getContentProvider(sessionTokenProvider);
-
+                IHierarchicalContent content = evalResult.getHierarchicalContent(evalElement.dataSet);
                 FtpFile childFtpFile =
-                        FtpFileFactory.createFtpFile(dataSetCode, childPath,
-                                evalElement.contentNode,
-                                getContentProvider.asContent(evalElement.dataSet), fileFilter);
+                        FtpFileFactory.createFtpFile(dataSetCode, childPath, evalElement.contentNode,
+                                content, fileFilter, cache);
                 result.add(childFtpFile);
             }
         }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolverTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolverTest.java
index 1d5c934fb23fcde6d5a52e5faa4130a32dcf3f7a..76157d84de413e80e65a31f6ac7f1c003adaadb6 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolverTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolverTest.java
@@ -27,7 +27,6 @@ import java.util.Collections;
 import java.util.Date;
 import java.util.EnumSet;
 import java.util.List;
-import java.util.Properties;
 
 import org.apache.commons.io.IOUtils;
 import org.apache.ftpserver.ftplet.FtpFile;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServer.java
index cf7dfbb91789c6ef1e565d36b81c7543d3780e46..3be2a21633a0b82fee05e5a40e6ae5049ade0c50 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ServiceForDataStoreServer.java
@@ -1668,7 +1668,7 @@ public class ServiceForDataStoreServer extends AbstractCommonServer<IServiceForD
     }
 
     @Override
-    @RolesAllowed(value = { RoleWithHierarchy.SPACE_ETL_SERVER })
+    @RolesAllowed({ RoleWithHierarchy.SPACE_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
     public Space tryGetSpace(String sessionToken,
             @AuthorizationGuard(guardClass = ExistingSpaceIdentifierPredicate.class) SpaceIdentifier spaceIdentifier)
     {
@@ -1689,7 +1689,7 @@ public class ServiceForDataStoreServer extends AbstractCommonServer<IServiceForD
     }
 
     @Override
-    @RolesAllowed(value = { RoleWithHierarchy.SPACE_ETL_SERVER })
+    @RolesAllowed({ RoleWithHierarchy.SPACE_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
     public Project tryGetProject(String sessionToken,
             @AuthorizationGuard(guardClass = ExistingSpaceIdentifierPredicate.class) ProjectIdentifier projectIdentifier)
     {