diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java
index c6a9146e7bf9b081871891d029900ff7231b220e..a332430325707836d51e77e53d88db5322d12bb8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java
@@ -16,7 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.server;
 
+import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 
 import ch.systemsx.cisd.authentication.ISessionManager;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.ICommonBusinessObjectFactory;
@@ -65,22 +68,65 @@ public final class TrackingServer extends AbstractServer<ITrackingServer> implem
     // ITrackingServer
     //
 
-    public List<ExternalData> listDataSets(String sessionToken, TrackingDataSetCriteria criteria)
+    public List<Sample> listSamples(String sessionToken, TrackingSampleCriteria criteria)
     {
         final Session session = getSession(sessionToken);
 
-        final IDatasetLister datasetLister =
-                businessObjectFactory.createDatasetLister(session, getDataStoreBaseURL());
-        return datasetLister.listByTrackingCriteria(criteria);
+        final ISampleLister sampleLister = businessObjectFactory.createSampleLister(session);
+        final ListOrSearchSampleCriteria listerCriteria = new ListOrSearchSampleCriteria(criteria);
+        listerCriteria.setEnrichDependentSamplesWithProperties(true);
+        return sampleLister.list(listerCriteria);
     }
 
-    public List<Sample> listSamples(String sessionToken, TrackingSampleCriteria criteria)
+    public List<ExternalData> listDataSets(String sessionToken, TrackingDataSetCriteria criteria)
     {
         final Session session = getSession(sessionToken);
 
+        // retrieve data sets connected to samples of type specified in criteria
+        // (these samples don't have properties loaded but ids are loaded)
+        final IDatasetLister datasetLister =
+                businessObjectFactory.createDatasetLister(session, getDataStoreBaseURL());
+        final List<ExternalData> dataSets = datasetLister.listByTrackingCriteria(criteria);
+        // retrieve samples enriched with their dependent samples and properties
+        // (drawback - samples directly connected to data sets are retrieved twice)
         final ISampleLister sampleLister = businessObjectFactory.createSampleLister(session);
-        final ListOrSearchSampleCriteria listerCriteria = new ListOrSearchSampleCriteria(criteria);
+        final ListOrSearchSampleCriteria listerCriteria =
+                new ListOrSearchSampleCriteria(extractConnectedSampleIds(dataSets));
         listerCriteria.setEnrichDependentSamplesWithProperties(true);
-        return sampleLister.list(listerCriteria);
+        final List<Sample> enrichedSamples = sampleLister.list(listerCriteria);
+        // replace data set samples with enriched ones
+        replaceConnectedSamples(dataSets, enrichedSamples);
+        return dataSets;
+    }
+
+    private List<Long> extractConnectedSampleIds(List<ExternalData> dataSets)
+    {
+        final List<Long> sampleIds = new ArrayList<Long>();
+        for (ExternalData dataSet : dataSets)
+        {
+            assert dataSet.getSample() != null : "data set is not connected to a sample";
+            sampleIds.add(dataSet.getSample().getId());
+        }
+        return sampleIds;
     }
+
+    private void replaceConnectedSamples(List<ExternalData> dataSets, List<Sample> enrichedSamples)
+    {
+        // list orders are not the same - map is needed for quick search
+        // <sample id, sample>
+        final Map<Long, Sample> enrichedSamplesMap =
+                new HashMap<Long, Sample>(enrichedSamples.size());
+        for (Sample sample : enrichedSamples)
+        {
+            enrichedSamplesMap.put(sample.getId(), sample);
+        }
+
+        for (ExternalData dataSet : dataSets)
+        {
+            final Sample enrichedSample = enrichedSamplesMap.get(dataSet.getSample().getId());
+            assert enrichedSample != null;
+            dataSet.setSample(enrichedSample);
+        }
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ITrackingServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ITrackingServer.java
index daa92d1625c927a5109a50b83c3927a893e85761..823fc721c5cabe8ea7b3d9c9032ac3b14ccb6b5a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ITrackingServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ITrackingServer.java
@@ -29,7 +29,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingSampleCriteria;
 
 /**
- * Definition of the client-server interface.
+ * Definition of the client-server interface for tracking creation of samples and datasets.
  * 
  * @author Piotr Buczek
  */
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java
index 42c3b79fae09ec2cb63697b5b70e7ee17d3e89dc..5e3adc14e506befbd7836b782babf7bd054c25de 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java
@@ -104,7 +104,7 @@ public class OpenbisClientTest
 
         final String sampleTypeCode = "CELL_PLATE";
         final int lastSeenSampleId = 1000; // compare with 0
-        final int lastSeenDataSetId = 3; // compare with 0
+        final int lastSeenDataSetId = 0; // compare with 3
 
         final TrackingSampleCriteria sampleCriteria =
                 new TrackingSampleCriteria(sampleTypeCode, lastSeenSampleId);
@@ -202,10 +202,11 @@ public class OpenbisClientTest
             builder.append(" type", dataSet.getDataSetType());
             builder.append(" properties", toString(dataSet.getProperties()));
             sb.append(builder.toString());
-            final String indent = INDENT;
             if (dataSet.getSample() != null)
             {
-                sb.append("\n" + indent + toString(dataSet.getSample()));
+                final String indent = INDENT;
+                final String newIndent = indent + INDENT;
+                sb.append("\n" + indent + toString(dataSet.getSample(), newIndent));
             }
             return sb.toString();
         }