diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java
index 31dfeab59c6ec71b7b78ba781009602673892b8f..7b40831a49d0e9c57db698a4b249c4cee4913892 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/ISampleListingQuery.java
@@ -340,6 +340,14 @@ public interface ISampleListingQuery extends TransactionQuery, IPropertyListingQ
         { StringArrayMapper.class }, fetchSize = FETCH_SIZE)
     public DataIterator<SampleRecord> getSamplesForCodes(String[] sampleCodes);
 
+    /**
+     * Returns the non-empty container samples for the given <var>sampleCodes</var>.
+     */
+    @Select(sql = SELECT_FROM_SAMPLES_S
+            + " where s.id in (select samp_id_part_of from samples where samp_id_part_of in (select id from samples where code = any(?{1})))", parameterBindings =
+        { StringArrayMapper.class }, fetchSize = FETCH_SIZE)
+    public DataIterator<SampleRecord> getContainerSamplesForCodes(String[] sampleCodes);
+
     /**
      * Returns the samples for the given <var>permIds</var>.
      */
@@ -347,6 +355,14 @@ public interface ISampleListingQuery extends TransactionQuery, IPropertyListingQ
         { StringArrayMapper.class }, fetchSize = FETCH_SIZE)
     public DataIterator<SampleRecord> getSamplesForPermIds(String[] permIds);
 
+    /**
+     * Returns the non-empty container samples for the given <var>sampleCodes</var>.
+     */
+    @Select(sql = SELECT_FROM_SAMPLES_S
+            + " where s.id in (select samp_id_part_of from samples where samp_id_part_of in (select id from samples where permId = any(?{1})))", parameterBindings =
+        { StringArrayMapper.class }, fetchSize = FETCH_SIZE)
+    public DataIterator<SampleRecord> getContainerSamplesForPermIds(String[] permIds);
+
     //
     // Sample Properties
     //
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java
index 0426f4d24fa08d7ade6ab2cb9539b2c5e6ef5e4e..6e797e6a5c6707fd762c4dfb1fd14f2027e7d32d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/samplelister/SampleListingWorker.java
@@ -44,10 +44,10 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.CodeConverter;
 import ch.systemsx.cisd.openbis.generic.shared.basic.PermlinkUtilities;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -218,7 +218,9 @@ final class SampleListingWorker extends AbstractLister
         loadSampleTypes();
         retrievePrimaryBasicSamples(tryGetIteratorForSamplesByIds());
         retrievePrimaryBasicSamples(tryGetIteratorForSamplesByCodes());
+        retrievePrimaryBasicSamples(tryGetIteratorForContainerSamplesByCodes());
         retrievePrimaryBasicSamples(tryGetIteratorForSamplesByPermIds());
+        retrievePrimaryBasicSamples(tryGetIteratorForContainerSamplesByPermIds());
         retrievePrimaryBasicSamples(tryGetIteratorForSpaceSamples());
         retrievePrimaryBasicSamples(tryGetIteratorForSharedSamples());
         retrievePrimaryBasicSamples(tryGetIteratorForExperimentSamples());
@@ -351,6 +353,10 @@ final class SampleListingWorker extends AbstractLister
 
     private Iterable<SampleRecord> tryGetIteratorForSamplesByCodes()
     {
+        if (criteria.isSearchForContainerSamplesOnly())
+        {
+            return null;
+        }
         String[] codes = criteria.trySampleCodes();
         if (codes == null)
         {
@@ -359,8 +365,26 @@ final class SampleListingWorker extends AbstractLister
         return query.getSamplesForCodes(codes);
     }
 
+    private Iterable<SampleRecord> tryGetIteratorForContainerSamplesByCodes()
+    {
+        if (criteria.isSearchForContainerSamplesOnly())
+        {
+            return null;
+        }
+        String[] codes = criteria.trySampleCodes();
+        if (codes == null)
+        {
+            return null;
+        }
+        return query.getContainerSamplesForCodes(codes);
+    }
+
     private Iterable<SampleRecord> tryGetIteratorForSamplesByPermIds()
     {
+        if (criteria.isSearchForContainerSamplesOnly())
+        {
+            return null;
+        }
         String[] permIds = criteria.trySamplePermIds();
         if (permIds == null)
         {
@@ -369,6 +393,20 @@ final class SampleListingWorker extends AbstractLister
         return query.getSamplesForPermIds(permIds);
     }
 
+    private Iterable<SampleRecord> tryGetIteratorForContainerSamplesByPermIds()
+    {
+        if (false == criteria.isSearchForContainerSamplesOnly())
+        {
+            return null;
+        }
+        String[] permIds = criteria.trySamplePermIds();
+        if (permIds == null)
+        {
+            return null;
+        }
+        return query.getContainerSamplesForPermIds(permIds);
+    }
+
     private Iterable<SampleRecord> tryGetIteratorForSpaceSamples()
     {
         if (criteria.isIncludeSpace() == false)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListOrSearchSampleCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListOrSearchSampleCriteria.java
index cdcd0b8d8a9523248f5133930092143a986ecee6..65152963b7734c3cd7b072a509608dc7f13d24ea 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListOrSearchSampleCriteria.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ListOrSearchSampleCriteria.java
@@ -48,6 +48,8 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria
 
     private final String[] permIds;
 
+    private final boolean searchForContainerSamplesOnly;
+
     private boolean enrichDependentSamplesWithProperties = false;
 
     /** Creates criteria that delegates to given {@link ListSampleCriteria}. */
@@ -57,6 +59,7 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria
         this.listCriteria = listCriteria;
         this.sampleCodes = null;
         this.permIds = null;
+        this.searchForContainerSamplesOnly = false;
     }
 
     /** Creates criteria that delegates to given {@link TrackingSampleCriteria}. */
@@ -66,6 +69,7 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria
         this.newTrackingCriteria = newTrackingCriteria;
         this.sampleCodes = null;
         this.permIds = null;
+        this.searchForContainerSamplesOnly = false;
     }
 
     /** Creates criteria for detailed search of samples with given ids. */
@@ -75,19 +79,27 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria
         this.sampleIds = sampleIds;
         this.sampleCodes = null;
         this.permIds = null;
+        this.searchForContainerSamplesOnly = false;
     }
 
     /** Creates criteria for detailed search of samples with codes. */
     public ListOrSearchSampleCriteria(final String[] codes, final boolean codesArePermIds)
+    {
+        this(codes, codesArePermIds, false);
+    }
+
+    /** Creates criteria for detailed search of samples with codes. */
+    public ListOrSearchSampleCriteria(String[] codes, boolean codesArePermIds,
+            boolean searchForContainerSamplesOnly)
     {
         // Need to add the type to disambiguate method signatures for erased generic types.
         assert codes != null;
+        this.searchForContainerSamplesOnly = searchForContainerSamplesOnly;
 
         if (codesArePermIds)
         {
             this.sampleCodes = null;
             this.permIds = codes;
-
         } else
         {
             this.sampleCodes = codes;
@@ -104,6 +116,7 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria
 
         this.sampleCodes = codes;
         this.permIds = permIds;
+        this.searchForContainerSamplesOnly = false;
     }
 
     // search
@@ -232,4 +245,8 @@ public final class ListOrSearchSampleCriteria extends ListSampleCriteria
         this.enrichDependentSamplesWithProperties = enrichDependentSamplesWithProperties;
     }
 
+    public boolean isSearchForContainerSamplesOnly()
+    {
+        return searchForContainerSamplesOnly;
+    }
 }
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 2690a9f265ab3e803974cdf1d0de7bea3138233b..0848420fe865563ede64e370f07a9e77618237dc 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
@@ -322,7 +322,7 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
             // for contained samples add container samples codes
             codes = SampleRegisterOrUpdateUtil.extractContainerCodes(newSamples);
             ListOrSearchSampleCriteria criteria =
-                    SampleRegisterOrUpdateUtil.createListSamplesByCodeCriteria(codes);
+                    SampleRegisterOrUpdateUtil.createListContainerSamplesByCodeCriteria(codes);
             List<Sample> existingContainers = sampleLister.list(criteria);
             for (Sample s : existingContainers)
             {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/SampleRegisterOrUpdateUtil.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/SampleRegisterOrUpdateUtil.java
index a8c450f4c76314ff3de541ff7d1e55510ae94b96..f1f56d39afb7be4881d9b3c6c095043b0b38ebbc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/SampleRegisterOrUpdateUtil.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/SampleRegisterOrUpdateUtil.java
@@ -228,8 +228,18 @@ public class SampleRegisterOrUpdateUtil
             return extractCode(sampleIdentifier.getSampleCode());
         } else
         {
-            SampleIdentifier parsedContainerIdentifier = SampleIdentifierFactory.parse(containerIdentifier);
+            SampleIdentifier parsedContainerIdentifier =
+                    SampleIdentifierFactory.parse(containerIdentifier);
             return extractCode(parsedContainerIdentifier.getSampleCode());
         }
     }
+
+    public static ListOrSearchSampleCriteria createListContainerSamplesByCodeCriteria(
+            List<String> codes)
+    {
+        String[] codesAsArray = codes.toArray(new String[0]);
+        ListOrSearchSampleCriteria criteria =
+                new ListOrSearchSampleCriteria(codesAsArray, false, true);
+        return criteria;
+    }
 }