diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/sample/SampleTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/sample/SampleTranslator.java
index 848778ea325f56a3421cd062afff1846886606d9..d3977bba86c7be408c84c28d92e5d54b476f925a 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/sample/SampleTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/sample/SampleTranslator.java
@@ -152,12 +152,12 @@ public class SampleTranslator extends AbstractCachingTranslator<SamplePE, Sample
             result.getFetchOptions().fetchContained(getFetchOptions().fetchContained());
         }
 
-        if (getFetchOptions().hasSampleType())
+        if (getFetchOptions().hasType())
         {
             SampleType sampleType =
-                    new SampleTypeTranslator(getTranslationContext(), getFetchOptions().fetchSampleType()).translate(samplePe.getSampleType());
-            result.setSampleType(sampleType);
-            result.getFetchOptions().fetchSampleType(getFetchOptions().fetchSampleType());
+                    new SampleTypeTranslator(getTranslationContext(), getFetchOptions().fetchType()).translate(samplePe.getSampleType());
+            result.setType(sampleType);
+            result.getFetchOptions().fetchType(getFetchOptions().fetchType());
         }
 
         if (getFetchOptions().hasTags())
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/AbstractTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/AbstractTest.java
index c7c636c6469c5978267b8ac6b3d4b2d459fe627f..e4f940d01e60a29613cce0d91548fe528fb112df 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/AbstractTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/AbstractTest.java
@@ -20,6 +20,7 @@ import static org.testng.Assert.assertNotNull;
 import static org.testng.Assert.fail;
 
 import java.lang.reflect.Method;
+import java.util.Collection;
 
 import org.apache.log4j.Level;
 import org.apache.log4j.Logger;
@@ -441,4 +442,20 @@ public class AbstractTest extends SystemTestCase
         }
     }
 
+    protected void assertContainSameObjects(Collection<?> c1, Collection<?> c2, int expectedSameObjectCount)
+    {
+        int count = 0;
+        for (Object o1 : c1)
+        {
+            for (Object o2 : c2)
+            {
+                if (o1 == o2)
+                {
+                    count++;
+                }
+            }
+        }
+        assertEquals(count, expectedSameObjectCount);
+    }
+
 }
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/CreateSampleTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/CreateSampleTest.java
index c0093cdeeb505b7fba00e9bacf7048f0ecbdbcba..ede10d329ddee1e3f884d8da9184a69c0b074708 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/CreateSampleTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/CreateSampleTest.java
@@ -206,7 +206,7 @@ public class CreateSampleTest extends AbstractSampleTest
                 Arrays.asList(samp1, samp2, sampleWithOutSpace));
 
         SampleFetchOptions fetchOptions = new SampleFetchOptions();
-        fetchOptions.fetchSampleType();
+        fetchOptions.fetchType();
         fetchOptions.fetchSpace();
         fetchOptions.fetchRegistrator();
         fetchOptions.fetchAttachments().fetchContent();
@@ -219,7 +219,7 @@ public class CreateSampleTest extends AbstractSampleTest
 
         Sample sampleWithSpace1 = samples.get(0);
         assertEquals(sampleWithSpace1.getCode(), "SAMPLE_WITH_SPACE1");
-        assertEquals(sampleWithSpace1.getSampleType().getCode(), "CELL_PLATE");
+        assertEquals(sampleWithSpace1.getType().getCode(), "CELL_PLATE");
         assertEquals(sampleWithSpace1.getSpace().getPermId().getPermId(), "CISD");
         assertEquals(sampleWithSpace1.getIdentifier().getIdentifier(), "/CISD/MP002-1:SAMPLE_WITH_SPACE1");
         assertEquals(sampleWithSpace1.getRegistrator().getUserId(), TEST_USER);
@@ -236,7 +236,7 @@ public class CreateSampleTest extends AbstractSampleTest
 
         Sample sampleWithSpace2 = samples.get(1);
         assertEquals(sampleWithSpace2.getCode(), "SAMPLE_WITH_SPACE2");
-        assertEquals(sampleWithSpace2.getSampleType().getCode(), "CELL_PLATE");
+        assertEquals(sampleWithSpace2.getType().getCode(), "CELL_PLATE");
         assertEquals(sampleWithSpace2.getSpace().getPermId().getPermId(), "CISD");
         assertEquals(sampleWithSpace2.getIdentifier().getIdentifier(), "/CISD/MP002-1:SAMPLE_WITH_SPACE2");
         assertEquals(sampleWithSpace2.getRegistrator().getUserId(), TEST_USER);
@@ -251,7 +251,7 @@ public class CreateSampleTest extends AbstractSampleTest
 
         Sample sampleWithoutSpace = samples.get(2);
         assertEquals(sampleWithoutSpace.getCode(), "SAMPLE_WITHOUT_SPACE");
-        assertEquals(sampleWithoutSpace.getSampleType().getCode(), "CELL_PLATE");
+        assertEquals(sampleWithoutSpace.getType().getCode(), "CELL_PLATE");
         assertEquals(sampleWithoutSpace.getSpace(), null);
         assertEquals(sampleWithoutSpace.getIdentifier().getIdentifier(), "/SAMPLE_WITHOUT_SPACE");
         assertEquals(sampleWithoutSpace.getRegistrator().getUserId(), TEST_USER);
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapExperimentTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapExperimentTest.java
index edadbae8aa73217e868923203070b505dcfb8357..fffbdf34fe71959a96d65b5183a7261f7393e3d1 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapExperimentTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapExperimentTest.java
@@ -18,6 +18,8 @@ package ch.ethz.sis.openbis.systemtest.api.v3;
 
 import static org.testng.Assert.assertEquals;
 import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+import static org.testng.Assert.assertFalse;
 
 import java.text.SimpleDateFormat;
 import java.util.Arrays;
@@ -192,6 +194,8 @@ public class MapExperimentTest extends AbstractExperimentTest
         assertEquals(map.get(permId1).getPermId(), permId1);
         assertEquals(map.get(identifier2).getIdentifier(), identifier2);
 
+        assertTrue(map.get(identifier1) == map.get(permId1));
+
         v3api.logout(sessionToken);
     }
 
@@ -288,6 +292,30 @@ public class MapExperimentTest extends AbstractExperimentTest
         v3api.logout(sessionToken);
     }
 
+    @Test
+    public void testMapExperimentsWithTypeReused()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions();
+        fetchOptions.fetchType();
+
+        ExperimentIdentifier identifier1 = new ExperimentIdentifier("/CISD/NEMO/EXP1");
+        ExperimentIdentifier identifier2 = new ExperimentIdentifier("/CISD/NEMO/EXP11");
+
+        Map<IExperimentId, Experiment> map = v3api.mapExperiments(sessionToken, Arrays.asList(identifier1, identifier2), fetchOptions);
+
+        assertEquals(2, map.size());
+        Experiment experiment1 = map.get(identifier1);
+        Experiment experiment2 = map.get(identifier2);
+
+        assertFalse(experiment1 == experiment2);
+        assertEquals(experiment1.getType().getCode(), "SIRNA_HCS");
+        assertEquals(experiment2.getType().getCode(), "SIRNA_HCS");
+        assertTrue(experiment1.getType() == experiment2.getType());
+
+        v3api.logout(sessionToken);
+    }
+
     @Test
     public void testMapExperimentsWithAttachment()
     {
@@ -359,6 +387,30 @@ public class MapExperimentTest extends AbstractExperimentTest
         v3api.logout(sessionToken);
     }
 
+    @Test()
+    public void testMapExperimentsWithProjectReused()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions();
+        fetchOptions.fetchProject();
+
+        ExperimentIdentifier identifier1 = new ExperimentIdentifier("/CISD/NEMO/EXP1");
+        ExperimentIdentifier identifier2 = new ExperimentIdentifier("/CISD/NEMO/EXP11");
+
+        Map<IExperimentId, Experiment> map = v3api.mapExperiments(sessionToken, Arrays.asList(identifier1, identifier2), fetchOptions);
+
+        assertEquals(2, map.size());
+        Experiment experiment1 = map.get(identifier1);
+        Experiment experiment2 = map.get(identifier2);
+
+        assertFalse(experiment1 == experiment2);
+        assertEquals(experiment1.getProject().getCode(), "NEMO");
+        assertEquals(experiment2.getProject().getCode(), "NEMO");
+        assertTrue(experiment1.getProject() == experiment2.getProject());
+
+        v3api.logout(sessionToken);
+    }
+
     @Test
     public void testMapExperimentsWithProperties()
     {
@@ -419,6 +471,30 @@ public class MapExperimentTest extends AbstractExperimentTest
         v3api.logout(sessionToken);
     }
 
+    @Test()
+    public void testMapExperimentsWithRegistratorReused()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions();
+        fetchOptions.fetchRegistrator();
+
+        ExperimentIdentifier identifier1 = new ExperimentIdentifier("/CISD/NEMO/EXP1");
+        ExperimentIdentifier identifier2 = new ExperimentIdentifier("/CISD/NEMO/EXP11");
+
+        Map<IExperimentId, Experiment> map = v3api.mapExperiments(sessionToken, Arrays.asList(identifier1, identifier2), fetchOptions);
+
+        assertEquals(2, map.size());
+        Experiment experiment1 = map.get(identifier1);
+        Experiment experiment2 = map.get(identifier2);
+
+        assertFalse(experiment1 == experiment2);
+        assertEquals(experiment1.getRegistrator().getUserId(), "test");
+        assertEquals(experiment2.getRegistrator().getUserId(), "test");
+        assertTrue(experiment1.getRegistrator() == experiment2.getRegistrator());
+
+        v3api.logout(sessionToken);
+    }
+
     @Test
     public void testMapExperimentsWithModifier()
     {
@@ -448,6 +524,30 @@ public class MapExperimentTest extends AbstractExperimentTest
         v3api.logout(sessionToken);
     }
 
+    @Test()
+    public void testMapExperimentsWithModifierReused()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions();
+        fetchOptions.fetchModifier();
+
+        ExperimentIdentifier identifier1 = new ExperimentIdentifier("/CISD/NEMO/EXP1");
+        ExperimentIdentifier identifier2 = new ExperimentIdentifier("/CISD/NEMO/EXP10");
+
+        Map<IExperimentId, Experiment> map = v3api.mapExperiments(sessionToken, Arrays.asList(identifier1, identifier2), fetchOptions);
+
+        assertEquals(2, map.size());
+        Experiment experiment1 = map.get(identifier1);
+        Experiment experiment2 = map.get(identifier2);
+
+        assertFalse(experiment1 == experiment2);
+        assertEquals(experiment1.getModifier().getUserId(), "test_role");
+        assertEquals(experiment2.getModifier().getUserId(), "test_role");
+        assertTrue(experiment1.getModifier() == experiment2.getModifier());
+
+        v3api.logout(sessionToken);
+    }
+
     @Test
     public void testMapExperimentsWithTags()
     {
@@ -483,4 +583,26 @@ public class MapExperimentTest extends AbstractExperimentTest
         v3api.logout(sessionToken);
     }
 
+    @Test
+    public void testMapExperimentsWithTagsReused()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        ExperimentFetchOptions fetchOptions = new ExperimentFetchOptions();
+        fetchOptions.fetchTags();
+
+        ExperimentPermId permId1 = new ExperimentPermId("200811050952663-1030");
+        ExperimentPermId permId2 = new ExperimentPermId("201206190940555-1032");
+
+        Map<IExperimentId, Experiment> map = v3api.mapExperiments(sessionToken, Arrays.asList(permId1, permId2), fetchOptions);
+
+        assertEquals(2, map.size());
+        Experiment experiment1 = map.get(permId1);
+        Experiment experiment2 = map.get(permId2);
+
+        assertEquals(experiment1.getTags().size(), 2);
+        assertEquals(experiment2.getTags().size(), 1);
+        assertContainSameObjects(experiment1.getTags(), experiment2.getTags(), 1);
+
+        v3api.logout(sessionToken);
+    }
 }
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapSampleTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapSampleTest.java
index 3434c199b3448e8eb8cb0d0641546f4266004854..d2daae558ec1aa8689f7938c5427390d64f038b8 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapSampleTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/MapSampleTest.java
@@ -189,6 +189,39 @@ public class MapSampleTest extends AbstractSampleTest
         assertEquals(map.get(permId1).getPermId(), permId1);
         assertEquals(map.get(identifier2).getIdentifier(), identifier2);
 
+        assertTrue(map.get(identifier1) == map.get(permId1));
+
+        v3api.logout(sessionToken);
+    }
+
+    @Test
+    public void testMapSamplesByUnauthorizedIds()
+    {
+        SampleIdentifier identifier1 = new SampleIdentifier("/CISD/CP-TEST-1");
+        SampleIdentifier identifier2 = new SampleIdentifier("/TEST-SPACE/CP-TEST-4");
+        SampleIdentifier identifier3 = new SampleIdentifier("/CISD/CP-TEST-2");
+        SampleIdentifier identifier4 = new SampleIdentifier("/TEST-SPACE/EV-TEST");
+
+        List<? extends ISampleId> ids = Arrays.asList(identifier1, identifier2, identifier3, identifier4);
+
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        Map<ISampleId, Sample> map = v3api.mapSamples(sessionToken, ids, new SampleFetchOptions());
+
+        assertEquals(map.size(), 4);
+        v3api.logout(sessionToken);
+
+        sessionToken = v3api.login(TEST_SPACE_USER, PASSWORD);
+        map = v3api.mapSamples(sessionToken, ids, new SampleFetchOptions());
+
+        assertEquals(map.size(), 2);
+
+        Iterator<Sample> iter = map.values().iterator();
+        assertEquals(iter.next().getIdentifier(), identifier2);
+        assertEquals(iter.next().getIdentifier(), identifier4);
+
+        assertEquals(map.get(identifier2).getIdentifier(), identifier2);
+        assertEquals(map.get(identifier4).getIdentifier(), identifier4);
+
         v3api.logout(sessionToken);
     }
 
@@ -263,7 +296,32 @@ public class MapSampleTest extends AbstractSampleTest
     }
 
     @Test
-    public void testMapSampleWithTags()
+    public void testMapSamplesWithModifierReused()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        SampleFetchOptions fetchOptions = new SampleFetchOptions();
+        fetchOptions.fetchModifier();
+
+        SamplePermId permId1 = new SamplePermId("200811050919915-8");
+        SamplePermId permId2 = new SamplePermId("200902091219327-1025");
+
+        Map<ISampleId, Sample> map = v3api.mapSamples(sessionToken, Arrays.asList(permId1, permId2), fetchOptions);
+
+        assertEquals(2, map.size());
+        Sample sample1 = map.get(permId1);
+        Sample sample2 = map.get(permId2);
+
+        assertFalse(sample1 == sample2);
+        assertEquals(sample1.getModifier().getUserId(), "test_role");
+        assertEquals(sample2.getModifier().getUserId(), "test_role");
+        assertTrue(sample1.getModifier() == sample2.getModifier());
+
+        v3api.logout(sessionToken);
+    }
+
+    @Test
+    public void testMapSamplesWithTags()
     {
         String sessionToken = v3api.login(TEST_USER, PASSWORD);
         SampleFetchOptions fetchOptions = new SampleFetchOptions();
@@ -300,6 +358,31 @@ public class MapSampleTest extends AbstractSampleTest
         v3api.logout(sessionToken);
     }
 
+    @Test
+    public void testMapSamplesWithTagsReused()
+    {
+        String sessionToken = v3api.login(TEST_SPACE_USER, PASSWORD);
+
+        SampleFetchOptions fetchOptions = new SampleFetchOptions();
+        fetchOptions.fetchTags();
+
+        SamplePermId permId1 = new SamplePermId("201206191219327-1054");
+        SamplePermId permId2 = new SamplePermId("201206191219327-1055");
+
+        Map<ISampleId, Sample> map = v3api.mapSamples(sessionToken, Arrays.asList(permId1, permId2), fetchOptions);
+
+        assertEquals(map.size(), 2);
+        Sample sample1 = map.get(permId1);
+        Sample sample2 = map.get(permId2);
+
+        assertFalse(sample1 == sample2);
+        assertEquals(sample1.getTags().size(), 1);
+        assertEquals(sample2.getTags().size(), 1);
+        assertContainSameObjects(sample1.getTags(), sample2.getTags(), 1);
+
+        v3api.logout(sessionToken);
+    }
+
     public void testMapSamplesWithSpace()
     {
         String sessionToken = v3api.login(TEST_USER, PASSWORD);
@@ -319,6 +402,31 @@ public class MapSampleTest extends AbstractSampleTest
         v3api.logout(sessionToken);
     }
 
+    @Test
+    public void testMapSamplesWithSpaceReused()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        SampleFetchOptions fetchOptions = new SampleFetchOptions();
+        fetchOptions.fetchSpace();
+
+        SamplePermId permId1 = new SamplePermId("201206191219327-1054");
+        SamplePermId permId2 = new SamplePermId("201206191219327-1055");
+
+        Map<ISampleId, Sample> map = v3api.mapSamples(sessionToken, Arrays.asList(permId1, permId2), fetchOptions);
+
+        assertEquals(2, map.size());
+        Sample sample1 = map.get(permId1);
+        Sample sample2 = map.get(permId2);
+
+        assertFalse(sample1 == sample2);
+        assertEquals(sample1.getSpace().getCode(), "TEST-SPACE");
+        assertEquals(sample2.getSpace().getCode(), "TEST-SPACE");
+        assertTrue(sample1.getSpace() == sample2.getSpace());
+
+        v3api.logout(sessionToken);
+    }
+
     @Test
     public void testMapSamplesWithParentsAndProperties()
     {
@@ -422,6 +530,31 @@ public class MapSampleTest extends AbstractSampleTest
         v3api.logout(sessionToken);
     }
 
+    @Test
+    public void testMapSamplesWithParentsReused()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        SampleFetchOptions fetchOptions = new SampleFetchOptions();
+        fetchOptions.fetchParents();
+
+        SamplePermId permId1 = new SamplePermId("200811050946559-980");
+        SamplePermId permId2 = new SamplePermId("200811050946559-982");
+
+        Map<ISampleId, Sample> map = v3api.mapSamples(sessionToken, Arrays.asList(permId1, permId2), fetchOptions);
+
+        assertEquals(2, map.size());
+        Sample sample1 = map.get(permId1);
+        Sample sample2 = map.get(permId2);
+
+        assertFalse(sample1 == sample2);
+        assertEquals(sample1.getParents().size(), 2);
+        assertEquals(sample2.getParents().size(), 1);
+        assertContainSameObjects(sample1.getParents(), sample2.getParents(), 1);
+
+        v3api.logout(sessionToken);
+    }
+
     @Test
     public void testMapSamplesWithChildren()
     {
@@ -455,6 +588,31 @@ public class MapSampleTest extends AbstractSampleTest
         v3api.logout(sessionToken);
     }
 
+    @Test
+    public void testMapSamplesWithChildrenReused()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        SampleFetchOptions fetchOptions = new SampleFetchOptions();
+        fetchOptions.fetchChildren();
+
+        SamplePermId permId1 = new SamplePermId("200811050944030-975");
+        SamplePermId permId2 = new SamplePermId("200811050945092-976");
+
+        Map<ISampleId, Sample> map = v3api.mapSamples(sessionToken, Arrays.asList(permId1, permId2), fetchOptions);
+
+        assertEquals(2, map.size());
+        Sample sample1 = map.get(permId1);
+        Sample sample2 = map.get(permId2);
+
+        assertFalse(sample1 == sample2);
+        assertEquals(sample1.getChildren().size(), 1);
+        assertEquals(sample2.getChildren().size(), 4);
+        assertContainSameObjects(sample1.getChildren(), sample2.getChildren(), 1);
+
+        v3api.logout(sessionToken);
+    }
+
     @Test
     public void testMapSamplesWithContainer()
     {
@@ -495,6 +653,31 @@ public class MapSampleTest extends AbstractSampleTest
         v3api.logout(sessionToken);
     }
 
+    @Test
+    public void testMapSamplesWithContainerReused()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        SampleFetchOptions fetchOptions = new SampleFetchOptions();
+        fetchOptions.fetchContainer();
+
+        SamplePermId permId1 = new SamplePermId("200811050919915-9");
+        SamplePermId permId2 = new SamplePermId("200811050919915-10");
+
+        Map<ISampleId, Sample> map = v3api.mapSamples(sessionToken, Arrays.asList(permId1, permId2), fetchOptions);
+
+        assertEquals(2, map.size());
+        Sample sample1 = map.get(permId1);
+        Sample sample2 = map.get(permId2);
+
+        assertFalse(sample1 == sample2);
+        assertEquals(sample1.getContainer().getCode(), "CL1");
+        assertEquals(sample2.getContainer().getCode(), "CL1");
+        assertTrue(sample1.getContainer() == sample2.getContainer());
+
+        v3api.logout(sessionToken);
+    }
+
     /**
      * Test that translation can handle reference loops
      */
@@ -572,6 +755,32 @@ public class MapSampleTest extends AbstractSampleTest
         v3api.logout(sessionToken);
     }
 
+    @Test
+    public void testMapSamplesWithExperimentReused()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        SampleFetchOptions fetchOptions = new SampleFetchOptions();
+        fetchOptions.fetchExperiment();
+
+        SamplePermId permId1 = new SamplePermId("201206191219327-1054");
+        SamplePermId permId2 = new SamplePermId("201206191219327-1055");
+
+        Map<ISampleId, Sample> map = v3api.mapSamples(sessionToken, Arrays.asList(permId1, permId2), fetchOptions);
+
+        assertEquals(2, map.size());
+
+        Sample sample1 = map.get(permId1);
+        Sample sample2 = map.get(permId2);
+
+        assertFalse(sample1 == sample2);
+        assertEquals(sample1.getExperiment().getCode(), "EXP-SPACE-TEST");
+        assertEquals(sample2.getExperiment().getCode(), "EXP-SPACE-TEST");
+        assertTrue(sample1.getExperiment() == sample2.getExperiment());
+
+        v3api.logout(sessionToken);
+    }
+
     @Test
     public void testMapSamplesWithMultipleFetchOptions()
     {
@@ -610,7 +819,7 @@ public class MapSampleTest extends AbstractSampleTest
         SampleFetchOptions fetchOptions = new SampleFetchOptions();
 
         // fetch parents and their properties
-        fetchOptions.fetchSampleType();
+        fetchOptions.fetchType();
 
         Map<ISampleId, Sample> map =
                 v3api.mapSamples(sessionToken, Collections.singletonList(new SamplePermId("200811050946559-979")), fetchOptions);
@@ -621,7 +830,7 @@ public class MapSampleTest extends AbstractSampleTest
         Sample sample = samples.get(0);
         assertEquals(sample.getIdentifier().toString(), "/CISD/3VCP5");
 
-        SampleType type = sample.getSampleType();
+        SampleType type = sample.getType();
         assertEquals(type.getCode(), "CELL_PLATE");
         assertEquals(type.getDescription(), "Cell Plate");
         assertTrue(type.isListable());
@@ -638,46 +847,27 @@ public class MapSampleTest extends AbstractSampleTest
     }
 
     @Test
-    public void testMapSamplesWithUnauthorizedSpace()
+    public void testMapSamplesWithTypeReused()
     {
         String sessionToken = v3api.login(TEST_USER, PASSWORD);
-        Map<ISampleId, Sample> map = v3api.mapSamples(sessionToken, Arrays.asList(new SampleIdentifier("/CISD/CP-TEST-1")), new SampleFetchOptions());
-        List<Sample> samples = new ArrayList<Sample>(map.values());
-
-        assertEquals(samples.size(), 1);
-        v3api.logout(sessionToken);
 
-        sessionToken = v3api.login(TEST_SPACE_USER, PASSWORD);
-        map = v3api.mapSamples(sessionToken, Arrays.asList(new SampleIdentifier("/CISD/CP-TEST-1")), new SampleFetchOptions());
-        samples = new ArrayList<Sample>(map.values());
-
-        assertEquals(samples.size(), 0);
-        v3api.logout(sessionToken);
-    }
-
-    @Test
-    public void testMapSamplesOrder()
-    {
-        String sessionToken = v3api.login(TEST_USER, PASSWORD);
         SampleFetchOptions fetchOptions = new SampleFetchOptions();
+        fetchOptions.fetchType();
 
-        // fetch parents and their properties
-        fetchOptions.fetchSampleType();
+        SamplePermId permId1 = new SamplePermId("200902091219327-1025");
+        SamplePermId permId2 = new SamplePermId("200902091250077-1026");
 
-        Map<ISampleId, Sample> map =
-                v3api.mapSamples(sessionToken,
-                        Arrays.asList(
-                                new SamplePermId("200811050946559-979"),
-                                new SampleIdentifier("/CISD/MP002-1"),
-                                new SamplePermId("200811050919915-8")
-                                ), fetchOptions);
-        List<Sample> samples = new ArrayList<Sample>(map.values());
+        Map<ISampleId, Sample> map = v3api.mapSamples(sessionToken, Arrays.asList(permId1, permId2), fetchOptions);
+
+        assertEquals(2, map.size());
+        Sample sample1 = map.get(permId1);
+        Sample sample2 = map.get(permId2);
 
-        assertEquals(samples.get(0).getPermId(), new SamplePermId("200811050946559-979"));
-        assertEquals(samples.get(1).getIdentifier(), new SampleIdentifier("/CISD/MP002-1"));
-        assertEquals(samples.get(2).getPermId(), new SamplePermId("200811050919915-8"));
+        assertFalse(sample1 == sample2);
+        assertEquals(sample1.getType().getCode(), "CELL_PLATE");
+        assertEquals(sample2.getType().getCode(), "CELL_PLATE");
+        assertTrue(sample1.getType() == sample2.getType());
 
-        assertEquals(samples.size(), 3);
         v3api.logout(sessionToken);
     }
 
diff --git a/openbis/sourceTest/sql/postgresql/143/028=experiments_all.tsv b/openbis/sourceTest/sql/postgresql/143/028=experiments_all.tsv
index 4348f98c0f0638cd45205a5853183858d1811b78..a0375d74be8b922dcef5715716b23aefda2ae01b 100644
--- a/openbis/sourceTest/sql/postgresql/143/028=experiments_all.tsv
+++ b/openbis/sourceTest/sql/postgresql/143/028=experiments_all.tsv
@@ -1,5 +1,5 @@
 2	EXP1	1	2	2008-11-05 09:21:51.882+01	3	\N	f	2009-03-18 10:50:19.475958+01	200811050951882-1028	6	0	\N
-3	EXP10	1	2	2008-11-05 09:21:52.663+01	3	\N	f	2009-03-18 10:50:19.475958+01	200811050952663-1029	\N	0	\N
+3	EXP10	1	2	2008-11-05 09:21:52.663+01	3	\N	f	2009-03-18 10:50:19.475958+01	200811050952663-1029	6	0	\N
 4	EXP11	1	2	2008-11-05 09:21:52.663+01	3	\N	f	2009-03-18 10:50:19.475958+01	200811050952663-1030	\N	0	\N
 6	EXP-X	1	2	2008-11-05 09:22:37.246+01	1	4	f	2009-03-18 10:50:19.475958+01	200811050937246-1031	\N	0	\N
 8	EXP-REUSE	1	2	2008-11-05 09:22:40.555+01	1	\N	f	2009-03-18 10:50:19.475958+01	200811050940555-1032	\N	0	\N
diff --git a/openbis/sourceTest/sql/postgresql/143/057=samples_all.tsv b/openbis/sourceTest/sql/postgresql/143/057=samples_all.tsv
index 59ea106bbfb25acc6daae1ccd9e209162a9cf83c..9974960fcf1743fce26fe02825695ab0d4e670ee 100644
--- a/openbis/sourceTest/sql/postgresql/143/057=samples_all.tsv
+++ b/openbis/sourceTest/sql/postgresql/143/057=samples_all.tsv
@@ -1015,7 +1015,7 @@
 1031	RP2-A1X	4	2008-11-05 09:22:31.564+01	2	\N	1	\N	2009-03-18 10:50:19.475958+01	8	200811050931564-1023	\N	RP2-A1X,-1,1,-1	\N	0	\N
 1032	EMPTY-MP	1	2008-11-05 09:22:43.584+01	2	\N	1	\N	2009-03-18 10:50:19.475958+01	\N	200811050943584-1024	\N	EMPTY-MP,-1,1,-1	\N	0	\N
 1044	CP-TEST-3	3	2009-02-09 12:16:25.616106+01	2	\N	1	\N	2009-03-18 10:50:19.475958+01	20	200902091225616-1027	\N	CP-TEST-3,-1,1,-1	\N	0	\N
-1042	CP-TEST-1	3	2009-02-09 12:09:19.327518+01	2	\N	1	\N	2009-08-18 17:54:11.56+02	18	200902091219327-1025	\N	CP-TEST-1,-1,1,-1	\N	0	\N
+1042	CP-TEST-1	3	2009-02-09 12:09:19.327518+01	2	\N	1	\N	2009-08-18 17:54:11.56+02	18	200902091219327-1025	6	CP-TEST-1,-1,1,-1	\N	0	\N
 1043	CP-TEST-2	3	2009-02-09 12:09:50.077973+01	2	\N	1	\N	2009-08-18 17:54:36.929+02	19	200902091250077-1026	\N	CP-TEST-2,-1,1,-1	\N	0	\N
 988	3VCP7	3	2008-11-05 09:21:46.559+01	2	\N	1	\N	2010-10-25 14:48:36.245+02	\N	200811050946559-981	\N	3VCP7,-1,1,-1	\N	0	\N
 1050	PLATE_WELLSEARCH	3	2009-02-09 12:09:50.077973+01	2	\N	1	\N	2009-08-18 17:54:36.929+02	21	200902091250077-1050	\N	PLATE_WELLSEARCH,-1,1,-1	\N	0	\N
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/sample/Sample.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/sample/Sample.java
index d30b55f3ecb744b63f7b7173d9f6c898f2b0903b..2c5e3144ec690b9648b9123fb6d9d16f6861b112 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/sample/Sample.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/sample/Sample.java
@@ -62,7 +62,7 @@ public class Sample implements Serializable
     private Date modificationDate;
 
     @JsonProperty
-    private SampleType sampleType;
+    private SampleType type;
 
     @JsonProperty
     private Space space;
@@ -164,11 +164,11 @@ public class Sample implements Serializable
     }
 
     @JsonIgnore
-    public SampleType getSampleType()
+    public SampleType getType()
     {
-        if (getFetchOptions().hasSampleType())
+        if (getFetchOptions().hasType())
         {
-            return sampleType;
+            return type;
         }
         else
         {
@@ -176,9 +176,9 @@ public class Sample implements Serializable
         }
     }
 
-    public void setSampleType(SampleType sampleType)
+    public void setType(SampleType type)
     {
-        this.sampleType = sampleType;
+        this.type = type;
     }
 
     @JsonIgnore
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/sample/SampleFetchOptions.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/sample/SampleFetchOptions.java
index d4cff2a4e35eada527f7b48f6aca9742ee37a785..9a8e027a1498b08bd0aa7b61eab329d349799ca4 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/sample/SampleFetchOptions.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/sample/SampleFetchOptions.java
@@ -36,7 +36,7 @@ public class SampleFetchOptions implements Serializable
     private static final long serialVersionUID = 1L;
 
     @JsonProperty
-    private SampleTypeFetchOptions sampleType;
+    private SampleTypeFetchOptions type;
 
     @JsonProperty
     private SpaceFetchOptions space;
@@ -71,23 +71,23 @@ public class SampleFetchOptions implements Serializable
     @JsonProperty
     private AttachmentFetchOptions attachments;
 
-    public SampleTypeFetchOptions fetchSampleType()
+    public SampleTypeFetchOptions fetchType()
     {
-        if (sampleType == null)
+        if (type == null)
         {
-            sampleType = new SampleTypeFetchOptions();
+            type = new SampleTypeFetchOptions();
         }
-        return sampleType;
+        return type;
     }
 
-    public SampleTypeFetchOptions fetchSampleType(SampleTypeFetchOptions fetchOptions)
+    public SampleTypeFetchOptions fetchType(SampleTypeFetchOptions fetchOptions)
     {
-        return sampleType = fetchOptions;
+        return type = fetchOptions;
     }
 
-    public boolean hasSampleType()
+    public boolean hasType()
     {
-        return sampleType != null;
+        return type != null;
     }
 
     public SpaceFetchOptions fetchSpace()