diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/AbstractCompositeEntitySearchManager.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/AbstractCompositeEntitySearchManager.java
index 2420b060c763143c689986b371516e807c786505..449307a6a4a187379a962f53bb5864420bfbbbe2 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/AbstractCompositeEntitySearchManager.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/AbstractCompositeEntitySearchManager.java
@@ -92,45 +92,61 @@ public abstract class AbstractCompositeEntitySearchManager<CRITERIA extends Abst
         }
 
         final Set<Long> parentCriteriaIntermediateResults;
+        final Set<Long> containerCriteriaIntermediateResults;
         if (!parentsCriteria.isEmpty())
         {
-            parentCriteriaIntermediateResults = Arrays.stream(IGetRelationshipIdExecutor.RelationshipType.values())
-                    .flatMap(relationshipType ->
-                    {
-                        final Collection<ISearchCriteria> filteredParentsCriteria =
-                                getCriteriaByRelationshipType(parentsCriteria, relationshipType);
-
-                        // The parents criteria can be or not recursive, they are resolved by a recursive call
-                        final Set<Long> finalParentIds = findFinalRelationshipIds(userId, authorisationInformation,
-                                finalSearchOperator, filteredParentsCriteria, tableMapper);
-                        final Set<Long> finalParentIdsFiltered = filterIDsByUserRights(userId, authorisationInformation,
-                                finalParentIds);
-                        return getChildrenIdsOf(finalParentIdsFiltered, tableMapper,
-                                relationshipType).stream();
-
-                    }).collect(Collectors.toSet());
+            final Collection<ISearchCriteria> filteredParentsCriteria =
+                    getCriteriaByRelationshipType(parentsCriteria,
+                            IGetRelationshipIdExecutor.RelationshipType.PARENT_CHILD);
+
+            if (!filteredParentsCriteria.isEmpty())
+            {
+                final Set<Long> finalParentIds = findFinalRelationshipIds(userId, authorisationInformation,
+                        finalSearchOperator, filteredParentsCriteria, tableMapper);
+                final Set<Long> finalParentIdsFiltered = filterIDsByUserRights(userId, authorisationInformation,
+                        finalParentIds);
+                parentCriteriaIntermediateResults = getChildrenIdsOf(finalParentIdsFiltered, tableMapper,
+                        IGetRelationshipIdExecutor.RelationshipType.PARENT_CHILD);
+            } else
+                {
+                parentCriteriaIntermediateResults = null;
+            }
+
+            final Collection<ISearchCriteria> filteredContainersCriteria =
+                    getCriteriaByRelationshipType(parentsCriteria,
+                            IGetRelationshipIdExecutor.RelationshipType.CONTAINER_COMPONENT);
+
+            if (!filteredContainersCriteria.isEmpty())
+            {
+                final Set<Long> finalContainerIds = findFinalRelationshipIds(userId, authorisationInformation,
+                        finalSearchOperator, filteredContainersCriteria, tableMapper);
+                final Set<Long> finalContainerIdsFiltered = filterIDsByUserRights(userId, authorisationInformation,
+                        finalContainerIds);
+                containerCriteriaIntermediateResults = getChildrenIdsOf(finalContainerIdsFiltered, tableMapper,
+                        IGetRelationshipIdExecutor.RelationshipType.CONTAINER_COMPONENT);
+            } else
+            {
+                containerCriteriaIntermediateResults = null;
+            }
         } else
         {
             parentCriteriaIntermediateResults = null;
+            containerCriteriaIntermediateResults = null;
         }
 
         final Set<Long> childrenCriteriaIntermediateResults;
         if (!childrenCriteria.isEmpty())
         {
-            childrenCriteriaIntermediateResults = Arrays.stream(IGetRelationshipIdExecutor.RelationshipType.values())
-                    .flatMap(relationshipType ->
-                    {
-                        final Collection<ISearchCriteria> filteredChildrenCriteria =
-                                getCriteriaByRelationshipType(childrenCriteria, relationshipType);
-
-                        // The children criteria can be or not recursive, they are resolved by a recursive call
-                        final Set<Long> finalChildrenIds = findFinalRelationshipIds(userId, authorisationInformation,
-                                finalSearchOperator, filteredChildrenCriteria, tableMapper);
-                        final Set<Long> finalChildrenIdsFiltered = filterIDsByUserRights(userId,
-                                authorisationInformation, finalChildrenIds);
-                        return getParentsIdsOf(finalChildrenIdsFiltered, tableMapper,
-                                relationshipType).stream();
-                    }).collect(Collectors.toSet());
+            final Collection<ISearchCriteria> filteredChildrenCriteria =
+                    getCriteriaByRelationshipType(childrenCriteria,
+                            IGetRelationshipIdExecutor.RelationshipType.PARENT_CHILD);
+
+            final Set<Long> finalChildrenIds = findFinalRelationshipIds(userId, authorisationInformation,
+                    finalSearchOperator, filteredChildrenCriteria, tableMapper);
+            final Set<Long> finalChildrenIdsFiltered = filterIDsByUserRights(userId,
+                    authorisationInformation, finalChildrenIds);
+            childrenCriteriaIntermediateResults = getParentsIdsOf(finalChildrenIdsFiltered, tableMapper,
+                    IGetRelationshipIdExecutor.RelationshipType.PARENT_CHILD);
         } else
         {
             childrenCriteriaIntermediateResults = null;
@@ -138,14 +154,20 @@ public abstract class AbstractCompositeEntitySearchManager<CRITERIA extends Abst
 
         // Reaching this point we have the intermediate results of all recursive queries
         final Set<Long> results;
-        if (containsValues(mainCriteriaIntermediateResults) || containsValues(parentCriteriaIntermediateResults) ||
-                containsValues(childrenCriteriaIntermediateResults))
+        if (containsValues(mainCriteriaIntermediateResults) || containsValues(parentCriteriaIntermediateResults)
+                || containsValues(containerCriteriaIntermediateResults)
+                || containsValues(childrenCriteriaIntermediateResults))
         {
             // If we have results, we merge them
             results = mergeResults(finalSearchOperator,
-                    mainCriteriaIntermediateResults != null ? Collections.singleton(mainCriteriaIntermediateResults) : Collections.emptySet(),
-                    childrenCriteriaIntermediateResults != null ? Collections.singleton(childrenCriteriaIntermediateResults) : Collections.emptySet(),
-                    parentCriteriaIntermediateResults != null ? Collections.singleton(parentCriteriaIntermediateResults) : Collections.emptySet());
+                    mainCriteriaIntermediateResults != null
+                            ? Collections.singleton(mainCriteriaIntermediateResults) : Collections.emptySet(),
+                    childrenCriteriaIntermediateResults != null
+                            ? Collections.singleton(childrenCriteriaIntermediateResults) : Collections.emptySet(),
+                    parentCriteriaIntermediateResults != null
+                            ? Collections.singleton(parentCriteriaIntermediateResults) : Collections.emptySet(),
+                    containerCriteriaIntermediateResults != null
+                            ? Collections.singleton(containerCriteriaIntermediateResults) : Collections.emptySet());
         } else if (mainCriteria.isEmpty() && parentsCriteria.isEmpty() && childrenCriteria.isEmpty())
         {
             // If we don't have results and criteria are empty, return all.
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/SampleContainerSearchManager.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/SampleContainerSearchManager.java
index f67306d7bd083536360b87154a89d5889947c92b..46933502c5b131afe791689d0f8ca8cd0e18a9f2 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/SampleContainerSearchManager.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/search/planner/SampleContainerSearchManager.java
@@ -49,7 +49,7 @@ public class SampleContainerSearchManager extends AbstractCompositeEntitySearchM
     @Override
     protected Class<? extends AbstractCompositeSearchCriteria> getParentsSearchCriteriaClass()
     {
-        return SampleParentsSearchCriteria.class;
+        return null;
     }
 
     public Set<Long> searchForIDs(final Long userId, final AuthorisationInformation authorisationInformation,
@@ -67,7 +67,7 @@ public class SampleContainerSearchManager extends AbstractCompositeEntitySearchM
     @Override
     protected Class<? extends AbstractCompositeSearchCriteria> getChildrenSearchCriteriaClass()
     {
-        return SampleChildrenSearchCriteria.class;
+        return null;
     }
 
     @Override