diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/Cache.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/Cache.java
index c415c009016d17127b5641ed68eeb37961b8f7ec..07a0a27d2c55c91bd34a58ee7883614ed11a286b 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/Cache.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/Cache.java
@@ -32,7 +32,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
  */
 public class Cache
 {
-    private static final long LIVE_TIME = 1000;
+    static final long LIVE_TIME = 1000;
     
     private static final class TimeStampedObject<T>
     {
@@ -71,7 +71,7 @@ public class Cache
         return getObject(externalData, code);
     }
 
-    void putDataSet(ExternalData dataSet)
+    void putExternalData(ExternalData dataSet)
     {
         externalData.put(dataSet.getCode(), timestamp(dataSet));
     }
@@ -81,7 +81,7 @@ public class Cache
         return getObject(experiments, experimentId);
     }
 
-    void putDataSet(Experiment experiment)
+    void putExperiment(Experiment experiment)
     {
         experiments.put(experiment.getIdentifier(), timestamp(experiment));
     }
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 20cb0b0899f71900d0ce498dd28cfb1e34cb5aeb..80bb9c6e8c7a21826266e10ee3d08f52be263791 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
@@ -111,7 +111,7 @@ public class FtpPathResolverContext
                     service.listDataSetsByCode(sessionToken, codesToAskFor);
             for (ExternalData newDataSet : newDataSets)
             {
-                cache.putDataSet(newDataSet);
+                cache.putExternalData(newDataSet);
                 dataSets.add(newDataSet);
             }
         }
@@ -131,7 +131,7 @@ public class FtpPathResolverContext
                             Collections.singletonList(experimentIdentifier),
                             new ExperimentFetchOptions());
             experiment = result.isEmpty() ? null : result.get(0);
-            cache.putDataSet(experiment);
+            cache.putExperiment(experiment);
         }
         return experiment;
     }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/CacheTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/CacheTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..618e77786f96241c3369c7a09569c29f19439da7
--- /dev/null
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/CacheTest.java
@@ -0,0 +1,95 @@
+/*
+ * Copyright 2012 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.dss.generic.server.ftp;
+
+import org.testng.AssertJUnit;
+import org.testng.annotations.Test;
+
+import ch.systemsx.cisd.common.utilities.ITimeProvider;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.DataSetInitializer;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.EntityRegistrationDetails;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.EntityRegistrationDetails.EntityRegistrationDetailsInitializer;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public class CacheTest extends AssertJUnit
+{
+    @Test
+    public void testGetDataSet()
+    {
+        DataSetInitializer initializer = new DataSetInitializer();
+        initializer.setCode("ds1");
+        initializer.setDataSetTypeCode("A");
+        initializer.setExperimentIdentifier("E");
+        EntityRegistrationDetailsInitializer initializer2 = new EntityRegistrationDetailsInitializer();
+        initializer.setRegistrationDetails(new EntityRegistrationDetails(initializer2));
+        DataSet dataSet = new DataSet(initializer);
+        Cache cache = cache(0, Cache.LIVE_TIME / 2, Cache.LIVE_TIME + 1);
+        
+        cache.putDataSet(dataSet);
+        
+        assertSame(dataSet, cache.getDataSet(dataSet.getCode()));
+        assertEquals(null, cache.getDataSet(dataSet.getCode()));
+    }
+
+    @Test
+    public void testGetExternalData()
+    {
+        ExternalData dataSet = new ContainerDataSet();
+        dataSet.setCode("ds1");
+        Cache cache = cache(0, Cache.LIVE_TIME / 2, Cache.LIVE_TIME + 1);
+        
+        cache.putExternalData(dataSet);
+        
+        assertSame(dataSet, cache.getExternalData(dataSet.getCode()));
+        assertEquals(null, cache.getExternalData(dataSet.getCode()));
+    }
+    
+    @Test
+    public void testGetExperiment()
+    {
+        Experiment experiment = new Experiment();
+        experiment.setIdentifier("e1");
+        Cache cache = cache(0, Cache.LIVE_TIME / 2, Cache.LIVE_TIME + 1);
+        
+        cache.putExperiment(experiment);
+        
+        assertSame(experiment, cache.getExperiment(experiment.getIdentifier()));
+        assertEquals(null, cache.getExperiment(experiment.getIdentifier()));
+    }
+    
+    private Cache cache(final long... timestamps)
+    {
+        return new Cache(new ITimeProvider()
+            {
+                private int index;
+                
+                public long getTimeInMilliseconds()
+                {
+                    return timestamps[Math.min(index++, timestamps.length - 1)];
+                }
+            });
+    }
+
+}