diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/entity/SecondaryEntityListingQueryTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/entity/SecondaryEntityListingQueryTest.java
index ecee73bdd32ebdc2f4e812a51ad072ff3e2bb634..2d1faa75f6cfce66045f353ada6305ffb9b94d0d 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/entity/SecondaryEntityListingQueryTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/common/entity/SecondaryEntityListingQueryTest.java
@@ -19,8 +19,12 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo.common.entity;
 import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.assertTrue;
 import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
+import it.unimi.dsi.fastutil.longs.LongSet;
 
 import java.sql.SQLException;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.Set;
 
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
@@ -29,12 +33,15 @@ import ch.rinn.restrictions.Friend;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.EntityListingTestUtils;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.AbstractDAOTest;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SampleRelationshipPE;
 
 /**
  * @author Tomasz Pylak
@@ -92,4 +99,40 @@ public class SecondaryEntityListingQueryTest extends AbstractDAOTest
         Long2ObjectMap<Sample> samples = dao.getSamples(EntityListingTestUtils.createSet(1, 2));
         assertTrue(samples.size() > 0);
     }
+
+    // id of a sample with a few levels of descendants
+    private final static TechId SAMPLE_ROOT_ID = new TechId(1008L);
+
+    @Test
+    public void testListSamples()
+    {
+        LongSet idsOfSelfAndDescendants = dao.getSampleDescendantIdsAndSelf(SAMPLE_ROOT_ID.getId());
+        SamplePE rootSample = daoFactory.getSampleDAO().getByTechId(SAMPLE_ROOT_ID);
+        Set<SamplePE> descendantsAndSelf = new HashSet<SamplePE>();
+        checkContainsDescendantIdsAndSelf(rootSample, idsOfSelfAndDescendants, descendantsAndSelf);
+        assertEquals(descendantsAndSelf.size(), idsOfSelfAndDescendants.size());
+        assertEquals(8, idsOfSelfAndDescendants.size());
+    }
+
+    /**
+     * recursively checks that parent id and all ids of its descendants are among given ids
+     * 
+     * @param visitedSamples - collection of samples visited so far
+     */
+    private static void checkContainsDescendantIdsAndSelf(SamplePE parent, LongSet ids,
+            Set<SamplePE> visitedSamples)
+    {
+        if (visitedSamples.contains(parent))
+        {
+            return;
+        }
+        visitedSamples.add(parent);
+        assertTrue(parent.getId() + " not found among " + Arrays.toString(ids.toLongArray()),
+                ids.contains(parent.getId()));
+        for (SampleRelationshipPE r : parent.getChildRelationships())
+        {
+            SamplePE childPE = r.getChildSample();
+            checkContainsDescendantIdsAndSelf(childPE, ids, visitedSamples);
+        }
+    }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerTest.java
index 2ef33ef958ea8633a1d74662a925dab81eca3dd1..fdf63680ab28a2fea7a5c3381168c3bdec541a3e 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerTest.java
@@ -18,7 +18,9 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister;
 
 import static org.testng.AssertJUnit.assertEquals;
 import static org.testng.AssertJUnit.assertFalse;
+import static org.testng.AssertJUnit.assertNotNull;
 import static org.testng.AssertJUnit.assertSame;
+import static org.testng.AssertJUnit.assertTrue;
 
 import java.sql.SQLException;
 import java.util.ArrayList;
@@ -30,7 +32,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.testng.AssertJUnit;
 import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
@@ -39,6 +40,7 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.common.entity.Seconda
 import ch.systemsx.cisd.openbis.generic.server.business.bo.common.entity.SecondaryEntityListingQueryTest;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.AbstractDAOTest;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
@@ -55,7 +57,9 @@ public class DatasetListerTest extends AbstractDAOTest
 {
     private IDatasetLister lister;
 
-    private long sampleId;
+    private SamplePE exampleSample;
+
+    private long exampleSampleId;
 
     @BeforeClass(alwaysRun = true)
     public void init() throws SQLException
@@ -65,28 +69,54 @@ public class DatasetListerTest extends AbstractDAOTest
         SecondaryEntityDAO secondaryEntityDAO =
                 SecondaryEntityListingQueryTest.createSecondaryEntityDAO(daoFactory);
         lister = DatasetLister.create(datasetListerDAO, secondaryEntityDAO, "url");
-        SamplePE sample =
-                DatasetListingQueryTest.getSample("CISD", "CP-TEST-1", datasetListerDAO
-                        .getDatabaseInstanceId(), daoFactory);
-        sampleId = sample.getId();
+        exampleSample =
+                DatasetListingQueryTest.getSample("CISD", "CP-TEST-1",
+                        datasetListerDAO.getDatabaseInstanceId(), daoFactory);
+        exampleSampleId = exampleSample.getId();
     }
 
     @Test
-    public void testListBySampleTechId()
+    public void testListBySampleTechIdDirect()
     {
-        List<ExternalData> datasets = lister.listBySampleTechId(new TechId(sampleId), true);
-        assertEqualsOrGreater(1, datasets.size());
+        List<ExternalData> datasets = lister.listBySampleTechId(new TechId(exampleSampleId), true);
+        assertEquals(1, datasets.size());
         ExternalData externalData = datasets.get(0);
-        assertEquals(sampleId, externalData.getSample().getId().longValue());
+        assertEquals(exampleSampleId, externalData.getSample().getId().longValue());
         assertFalse(externalData.getProperties().isEmpty());
-        AssertJUnit.assertNotNull(externalData.getExperiment());
+        assertNotNull(externalData.getExperiment());
+    }
+
+    @Test
+    public void testListBySampleTechIdIndirect()
+    {
+        List<ExternalData> indirectlyConnectedChildDatasets =
+                lister.listBySampleTechId(new TechId(exampleSampleId), false);
+        assertEquals(5, indirectlyConnectedChildDatasets.size());
+        System.err.println(Code.extractCodes(indirectlyConnectedChildDatasets).toString());
+
+        assertNotNull(exampleSample.getGeneratedFrom());
+        List<ExternalData> directlyConnectedParentDatasets =
+                lister.listBySampleTechId(new TechId(exampleSample.getGeneratedFrom()), true);
+        assertEquals(1, directlyConnectedParentDatasets.size());
+
+        List<ExternalData> indirectlyConnectedParentDatasets =
+                lister.listBySampleTechId(new TechId(exampleSample.getGeneratedFrom()), false);
+        assertEquals(6, indirectlyConnectedParentDatasets.size());
+
+        List<String> indirectlyConnectedParentDatasetCodes =
+                Code.extractCodes(indirectlyConnectedParentDatasets);
+        for (ExternalData childDataset : indirectlyConnectedChildDatasets)
+        {
+            assertTrue(childDataset.getCode() + " not found among "
+                    + indirectlyConnectedParentDatasetCodes.toString(),
+                    indirectlyConnectedParentDatasetCodes.contains(childDataset.getCode()));
+        }
     }
 
     @Test
     public void testListParents()
     {
         Map<Long, Set<Long>> map = lister.listParentIds(Arrays.<Long> asList(2L, 4L, 9L));
-        System.out.println(map);
 
         assertEquals(null, map.get(2L));
         assertEquals("[2]", map.get(4L).toString());
@@ -102,9 +132,9 @@ public class DatasetListerTest extends AbstractDAOTest
                 new HashSet<String>(Arrays.asList("200811050946559-983", "200902091219327-1025"));
         List<SamplePE> samplePEs = daoFactory.getSampleDAO().listByPermID(samplePermIDs);
         List<Sample> samples = SampleTranslator.translate(samplePEs, "");
-        
+
         Map<Sample, List<ExternalData>> dataSets = lister.listAllDataSetsFor(samples);
-        
+
         StringBuilder builder = new StringBuilder();
         for (Sample sample : samples)
         {
@@ -148,8 +178,8 @@ public class DatasetListerTest extends AbstractDAOTest
             ExternalData previousDataSet = dataSetsByCode.put(dataSet.getCode(), dataSet);
             if (previousDataSet != null)
             {
-                assertSame("Same data set object expected for " + dataSet.getCode(), previousDataSet,
-                        dataSet);
+                assertSame("Same data set object expected for " + dataSet.getCode(),
+                        previousDataSet, dataSet);
             }
             List<ExternalData> children = dataSet.getChildren();
             assertSameDataSetsForSameCode(dataSetsByCode, children);
diff --git a/openbis/sourceTest/sql/postgresql/061/041=sample_relationships.tsv b/openbis/sourceTest/sql/postgresql/061/041=sample_relationships.tsv
index 37f0e1086f3a5c67d671a2991bc2f719e6c099fe..83e7d8d31cf214c6ea04de60e62e30fac679341d 100644
--- a/openbis/sourceTest/sql/postgresql/061/041=sample_relationships.tsv
+++ b/openbis/sourceTest/sql/postgresql/061/041=sample_relationships.tsv
@@ -41,3 +41,4 @@
 41	999	2	1030
 32	974	2	982
 43	977	1	984
+44	1043	1	1042
\ No newline at end of file