diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index 33e40a70a91755aa7a38b99cda53cecef77f38d8..d0e4efb959cffb0a5f13ca84855f74172f81ae82 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -1998,8 +1998,12 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         sampleBO.enrichWithAttachments();
         sampleBO.enrichWithPropertyTypes();
         final SamplePE sample = sampleBO.getSample();
+        Collection<MetaprojectPE> metaprojectPEs =
+                getDAOFactory().getMetaprojectDAO().listMetaprojectsForEntity(
+                        session.tryGetPerson(), sample);
         return SampleTranslator.translate(getSampleTypeSlaveServerPlugin(sample.getSampleType())
-                .getSampleInfo(session, sample), session.getBaseIndexURL());
+                .getSampleInfo(session, sample), session.getBaseIndexURL(), MetaprojectTranslator
+                .translate(metaprojectPEs));
     }
 
     @Override
@@ -2335,8 +2339,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     {
         List<EntityTypePE> types = new ArrayList<EntityTypePE>();
         if ((entityKind.equals(EntityKind.SAMPLE) || entityKind.equals(EntityKind.DATA_SET) || entityKind
-                .equals(EntityKind.MATERIAL))
-                && EntityType.isDefinedInFileEntityTypeCode(type))
+                .equals(EntityKind.MATERIAL)) && EntityType.isDefinedInFileEntityTypeCode(type))
         {
             types.addAll(getDAOFactory().getEntityTypeDAO(
                     DtoConverters.convertEntityKind(entityKind)).listEntityTypes());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SampleTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SampleTranslator.java
index 3c5bf2774d983b3306684412102301a73a329a97..23e1e4930b10b6940b7f07f569e0e3c15326d948 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SampleTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SampleTranslator.java
@@ -197,23 +197,18 @@ public final class SampleTranslator
     }
 
     public final static SampleParentWithDerived translate(
-            final SampleParentWithDerivedDTO sampleGenerationDTO, String baseIndexURL)
+            final SampleParentWithDerivedDTO sampleGenerationDTO, String baseIndexURL,
+            Collection<Metaproject> metaprojects)
     {
         final SampleParentWithDerived sampleGeneration = new SampleParentWithDerived();
 
-        Collection<Metaproject> parentMetaprojects =
-                MetaprojectTranslator.translate(sampleGenerationDTO.getParent().getMetaprojects());
-
         sampleGeneration.setParent(SampleTranslator.translate(sampleGenerationDTO.getParent(),
-                baseIndexURL, parentMetaprojects));
+                baseIndexURL, metaprojects));
 
         final List<Sample> generated = new ArrayList<Sample>();
         for (SamplePE samplePE : sampleGenerationDTO.getDerived())
         {
-            Collection<Metaproject> derivedMetaprojects =
-                    MetaprojectTranslator.translate(samplePE.getMetaprojects());
-            generated.add(SampleTranslator.translate(samplePE, baseIndexURL, false, false,
-                    derivedMetaprojects));
+            generated.add(SampleTranslator.translate(samplePE, baseIndexURL, false, false, null));
         }
         sampleGeneration.setDerived(generated.toArray(new Sample[generated.size()]));
         return sampleGeneration;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/server/DemoServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/server/DemoServer.java
index 5f99ea2f628d3a185dbdc1f75282f0546a7c5742..1d485837a8be74aecdb802ef5f30616f9c798ac0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/server/DemoServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/demo/server/DemoServer.java
@@ -42,10 +42,12 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
+import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleParentWithDerivedDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.translator.MetaprojectTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTranslator;
 import ch.systemsx.cisd.openbis.plugin.demo.shared.IDemoServer;
 import ch.systemsx.cisd.openbis.plugin.demo.shared.ResourceNames;
@@ -122,7 +124,11 @@ public final class DemoServer extends AbstractServer<IDemoServer> implements IDe
         ISampleTypeSlaveServerPlugin plugin =
                 getSampleTypeSlaveServerPlugin(sample.getSampleType());
         SampleParentWithDerivedDTO sampleInfo = plugin.getSampleInfo(session, sample);
-        return SampleTranslator.translate(sampleInfo, session.getBaseIndexURL());
+        Collection<MetaprojectPE> metaprojectPEs =
+                getDAOFactory().getMetaprojectDAO().listMetaprojectsForEntity(
+                        session.tryGetPerson(), sample);
+        return SampleTranslator.translate(sampleInfo, session.getBaseIndexURL(),
+                MetaprojectTranslator.translate(metaprojectPEs));
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
index df497c386deb0bd38b65fd0c7a499eab7784e401..b9f35aacdfa473e6ba900b54662363a4ef37a678 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
@@ -186,8 +186,12 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
         sampleBO.enrichWithAttachments();
         sampleBO.enrichWithPropertyTypes();
         final SamplePE sample = sampleBO.getSample();
+        Collection<MetaprojectPE> metaprojectPEs =
+                getDAOFactory().getMetaprojectDAO().listMetaprojectsForEntity(
+                        session.tryGetPerson(), sample);
         return SampleTranslator.translate(getSampleTypeSlaveServerPlugin(sample.getSampleType())
-                .getSampleInfo(session, sample), session.getBaseIndexURL());
+                .getSampleInfo(session, sample), session.getBaseIndexURL(), MetaprojectTranslator
+                .translate(metaprojectPEs));
     }
 
     @Override
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
index 9750ba7c29127601e4d89e581f8878554e08c857..98639ad83f33b9cad4edd3f6bce2db671d6865be 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
@@ -65,11 +65,13 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
+import ch.systemsx.cisd.openbis.generic.shared.dto.MetaprojectPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.translator.MetaprojectTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.SampleTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.translator.VocabularyTranslator;
 import ch.systemsx.cisd.openbis.plugin.generic.shared.IGenericServer;
@@ -188,13 +190,13 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
     {
         setAnalysisSettings(new AnalysisSettings(configurer.getResolvedProps()));
     }
-    
+
     @Override
     public void setAnalysisSettings(AnalysisSettings analysisSettings)
     {
         this.analysisSettings = analysisSettings;
     }
-    
+
     //
     // IInvocationLoggerFactory
     //
@@ -222,8 +224,12 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
         final ISampleBO sampleBO = businessObjectFactory.createSampleBO(session);
         sampleBO.loadDataByTechId(sampleId);
         final SamplePE sample = sampleBO.getSample();
+        Collection<MetaprojectPE> metaprojectPEs =
+                getDAOFactory().getMetaprojectDAO().listMetaprojectsForEntity(
+                        session.tryGetPerson(), sample);
         return SampleTranslator.translate(getSampleTypeSlaveServerPlugin(sample.getSampleType())
-                .getSampleInfo(session, sample), session.getBaseIndexURL());
+                .getSampleInfo(session, sample), session.getBaseIndexURL(), MetaprojectTranslator
+                .translate(metaprojectPEs));
     }
 
     @Override
@@ -400,8 +406,8 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
         {
             materialIds.add(id);
         }
-        return commonServer
-                .listMaterials(sessionToken, ListMaterialCriteria.createFromMaterialIds(materialIds), true);
+        return commonServer.listMaterials(sessionToken,
+                ListMaterialCriteria.createFromMaterialIds(materialIds), true);
     }
 
     @Override
@@ -486,40 +492,36 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public List<FeatureVectorDatasetReference> listFeatureVectorDatasets(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plates)
-            throws IllegalArgumentException
+    public List<FeatureVectorDatasetReference> listFeatureVectorDatasets(String sessionToken,
+            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class)
+            List<? extends PlateIdentifier> plates) throws IllegalArgumentException
     {
         return createScreeningApiImpl(sessionToken).listFeatureVectorDatasets(plates);
     }
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public List<ImageDatasetReference> listImageDatasets(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plates)
-            throws IllegalArgumentException
+    public List<ImageDatasetReference> listImageDatasets(String sessionToken,
+            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class)
+            List<? extends PlateIdentifier> plates) throws IllegalArgumentException
     {
         return createScreeningApiImpl(sessionToken).listImageDatasets(plates);
     }
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public List<ImageDatasetReference> listRawImageDatasets(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plates)
-            throws IllegalArgumentException
+    public List<ImageDatasetReference> listRawImageDatasets(String sessionToken,
+            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class)
+            List<? extends PlateIdentifier> plates) throws IllegalArgumentException
     {
         return createScreeningApiImpl(sessionToken).listRawImageDatasets(plates);
     }
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public List<ImageDatasetReference> listSegmentationImageDatasets(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plates)
-            throws IllegalArgumentException
+    public List<ImageDatasetReference> listSegmentationImageDatasets(String sessionToken,
+            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class)
+            List<? extends PlateIdentifier> plates) throws IllegalArgumentException
     {
         return createScreeningApiImpl(sessionToken).listSegmentationImageDatasets(plates);
     }
@@ -548,27 +550,27 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public List<WellIdentifier> listPlateWells(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = PlateIdentifierPredicate.class) PlateIdentifier plateIdentifier)
+    public List<WellIdentifier> listPlateWells(String sessionToken,
+            @AuthorizationGuard(guardClass = PlateIdentifierPredicate.class)
+            PlateIdentifier plateIdentifier)
     {
         return createScreeningApiImpl(sessionToken).listPlateWells(plateIdentifier);
     }
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public Sample getWellSample(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = WellIdentifierPredicate.class) WellIdentifier wellIdentifier)
+    public Sample getWellSample(String sessionToken,
+            @AuthorizationGuard(guardClass = WellIdentifierPredicate.class)
+            WellIdentifier wellIdentifier)
     {
         return createScreeningApiImpl(sessionToken).getWellSample(wellIdentifier, true);
     }
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public Sample getPlateSample(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = PlateIdentifierPredicate.class) PlateIdentifier plateIdentifier)
+    public Sample getPlateSample(String sessionToken,
+            @AuthorizationGuard(guardClass = PlateIdentifierPredicate.class)
+            PlateIdentifier plateIdentifier)
     {
         return createScreeningApiImpl(sessionToken).getPlateSample(plateIdentifier);
     }
@@ -583,10 +585,9 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public List<Plate> listPlates(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ExperimentIdentifierPredicate.class) ExperimentIdentifier experiment)
-            throws IllegalArgumentException
+    public List<Plate> listPlates(String sessionToken,
+            @AuthorizationGuard(guardClass = ExperimentIdentifierPredicate.class)
+            ExperimentIdentifier experiment) throws IllegalArgumentException
     {
         return createScreeningApiImpl(sessionToken).listPlates(experiment);
     }
@@ -608,9 +609,9 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public List<IDatasetIdentifier> getDatasetIdentifiers(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = DataSetCodeCollectionPredicate.class) List<String> datasetCodes)
+    public List<IDatasetIdentifier> getDatasetIdentifiers(String sessionToken,
+            @AuthorizationGuard(guardClass = DataSetCodeCollectionPredicate.class)
+            List<String> datasetCodes)
     {
         return createScreeningApiImpl(sessionToken).getDatasetIdentifiers(datasetCodes);
     }
@@ -642,9 +643,9 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public List<PlateWellMaterialMapping> listPlateMaterialMapping(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plates,
+    public List<PlateWellMaterialMapping> listPlateMaterialMapping(String sessionToken,
+            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class)
+            List<? extends PlateIdentifier> plates,
             MaterialTypeIdentifier materialTypeIdentifierOrNull)
     {
         return createScreeningApiImpl(sessionToken).listPlateMaterialMapping(plates,
@@ -696,19 +697,18 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public List<PlateMetadata> getPlateMetadataList(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class) List<? extends PlateIdentifier> plateIdentifiers)
-            throws IllegalArgumentException
+    public List<PlateMetadata> getPlateMetadataList(String sessionToken,
+            @AuthorizationGuard(guardClass = ScreeningPlateListReadOnlyPredicate.class)
+            List<? extends PlateIdentifier> plateIdentifiers) throws IllegalArgumentException
     {
         return createScreeningApiImpl(sessionToken).getPlateMetadata(plateIdentifiers);
     }
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public ExperimentImageMetadata getExperimentImageMetadata(
-            String sessionToken,
-            @AuthorizationGuard(guardClass = ExperimentIdentifierPredicate.class) ExperimentIdentifier experimentIdentifer)
+    public ExperimentImageMetadata getExperimentImageMetadata(String sessionToken,
+            @AuthorizationGuard(guardClass = ExperimentIdentifierPredicate.class)
+            ExperimentIdentifier experimentIdentifer)
     {
         checkSession(sessionToken);
         return createScreeningApiImpl(sessionToken).getExperimentImageMetadata(experimentIdentifer);