diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java
index f8661cffc800a5b82fa6bf0b09a4cc7fc26c1519..a39fba11eb71896b203a58d967a844ad7c74ba0b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.server.api.v1;
 
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.LinkedHashMap;
@@ -41,6 +42,7 @@ import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.ControlledVocabularyPropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Project;
@@ -159,7 +161,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     public int getMinorVersion()
     {
-        return 5;
+        return 7;
     }
 
     private Map<String, List<RoleAssignmentPE>> getRoleAssignmentsPerSpace()
@@ -271,19 +273,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
 
     public List<DataSet> listDataSets(String sessionToken, List<Sample> samples)
     {
-        checkSession(sessionToken);
-        List<ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType> sampleTypes =
-                commonServer.listSampleTypes(sessionToken);
-        SampleToDataSetRelatedEntitiesTranslator translator =
-                new SampleToDataSetRelatedEntitiesTranslator(sampleTypes, samples);
-        DataSetRelatedEntities dsre = translator.convertToDataSetRelatedEntities();
-        List<ExternalData> externalData = commonServer.listRelatedDataSets(sessionToken, dsre);
-        ArrayList<DataSet> dataSets = new ArrayList<DataSet>(externalData.size());
-        for (ExternalData externalDatum : externalData)
-        {
-            dataSets.add(Translator.translate(externalDatum));
-        }
-        return dataSets;
+        return listDataSets(sessionToken, samples, EnumSet.noneOf(Connections.class));
     }
 
     public List<Experiment> listExperiments(String sessionToken, List<Project> projects,
@@ -334,7 +324,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
         ArrayList<DataSet> dataSets = new ArrayList<DataSet>(externalData.size());
         for (ExternalData externalDatum : externalData)
         {
-            dataSets.add(Translator.translate(externalDatum));
+            dataSets.add(Translator.translate(externalDatum, EnumSet.noneOf(Connections.class)));
         }
         return dataSets;
     }
@@ -390,4 +380,22 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
         }
         return vocabTerms;
     }
+
+    public List<DataSet> listDataSets(String sessionToken, List<Sample> samples,
+            EnumSet<Connections> connectionsToGet)
+    {
+        checkSession(sessionToken);
+        List<ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType> sampleTypes =
+                commonServer.listSampleTypes(sessionToken);
+        SampleToDataSetRelatedEntitiesTranslator translator =
+                new SampleToDataSetRelatedEntitiesTranslator(sampleTypes, samples);
+        DataSetRelatedEntities dsre = translator.convertToDataSetRelatedEntities();
+        List<ExternalData> externalData = commonServer.listRelatedDataSets(sessionToken, dsre);
+        ArrayList<DataSet> dataSets = new ArrayList<DataSet>(externalData.size());
+        for (ExternalData externalDatum : externalData)
+        {
+            dataSets.add(Translator.translate(externalDatum, connectionsToGet));
+        }
+        return dataSets;
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceLogger.java
index 6cdf8fe298811361fe16beeece8ba71a38b6fbe9..a797728095e821265a72e7a7c464e7534d8efd90 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceLogger.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.server.api.v1;
 
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -27,6 +28,7 @@ import ch.systemsx.cisd.openbis.generic.shared.AbstractServerLogger;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.IGeneralInformationService;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.ControlledVocabularyPropertyType.VocabularyTerm;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Project;
@@ -133,4 +135,13 @@ class GeneralInformationServiceLogger extends AbstractServerLogger implements
         return null;
     }
 
+    public List<DataSet> listDataSets(String sessionToken, List<Sample> samples,
+            EnumSet<Connections> connectionsToGet)
+    {
+        logAccess(sessionToken, "list-data-sets", "SAMPLES(%s) CONNECTIONS(%s)", samples,
+                connectionsToGet);
+
+        return null;
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/Translator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/Translator.java
index 7bfd43015f4ede35a6ed7def86f3f8bd8f689069..2d2676e1a23ebea98859be3ce7d36b2f5ef03655 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/Translator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/Translator.java
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server.api.v1;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Set;
@@ -26,6 +27,7 @@ import java.util.Set;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.ControlledVocabularyPropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.ControlledVocabularyPropertyType.ControlledVocabularyPropertyTypeInitializer;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.DataSetInitializer;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType.DataSetTypeInitializer;
@@ -205,7 +207,8 @@ public class Translator
         return terms;
     }
 
-    public static DataSet translate(ExternalData externalDatum)
+    public static DataSet translate(ExternalData externalDatum,
+            EnumSet<Connections> connectionsToGet)
     {
         DataSetInitializer initializer = new DataSetInitializer();
         initializer.setCode(externalDatum.getCode());
@@ -219,6 +222,22 @@ public class Translator
             initializer.putProperty(prop.getPropertyType().getCode(), prop.getValue());
         }
 
+        initializer.setRetrievedConnections(connectionsToGet);
+        for (Connections connection : connectionsToGet)
+        {
+            switch (connection)
+            {
+                case PARENTS:
+                    ArrayList<String> parentCodes = new ArrayList<String>();
+                    for (ExternalData parentDatum : externalDatum.getParents())
+                    {
+                        parentCodes.add(parentDatum.getCode());
+                    }
+                    initializer.setParentCodes(parentCodes);
+                    break;
+            }
+        }
+
         return new DataSet(initializer);
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/IGeneralInformationService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/IGeneralInformationService.java
index 8dc591fe4d91e96e8b77b99f152a06d292ad4f7c..9be10d74becc9306496b18a98c2696bdc54c50b9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/IGeneralInformationService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/IGeneralInformationService.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.shared.api.v1;
 
+import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -26,6 +27,7 @@ import org.springframework.transaction.annotation.Transactional;
 import ch.systemsx.cisd.common.api.IRpcService;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.ControlledVocabularyPropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Project;
@@ -184,4 +186,16 @@ public interface IGeneralInformationService extends IRpcService
     public HashMap<ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary, List<ControlledVocabularyPropertyType.VocabularyTerm>> getVocabularyTermsMap(
             String sessionToken);
 
+    /**
+     * Return all data sets attached to the given samples with connections. Available since minor
+     * version 7.
+     * 
+     * @param samples The samples for which we return attached data sets.
+     * @since 1.7
+     */
+    @Transactional(readOnly = true)
+    @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER)
+    public List<DataSet> listDataSets(String sessionToken, List<Sample> samples,
+            EnumSet<Connections> connectionsToGet);
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSet.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSet.java
index d5ffec2588a89a0da8362ec46a27cbb7f28cf212..3b4deb5d717377ecabca72c85129ccbfb70cbffe 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSet.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSet.java
@@ -17,7 +17,9 @@
 package ch.systemsx.cisd.openbis.generic.shared.api.v1.dto;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.Date;
+import java.util.EnumSet;
 import java.util.HashMap;
 
 import org.apache.commons.lang.builder.EqualsBuilder;
@@ -34,6 +36,11 @@ public final class DataSet implements Serializable
 {
     private static final long serialVersionUID = 1L;
 
+    public static enum Connections
+    {
+        PARENTS
+    }
+
     /**
      * Class used to initialize a new data set instance. Necessary since all the fields of a DataSet
      * are final.
@@ -52,6 +59,10 @@ public final class DataSet implements Serializable
 
         private Date registrationDate;
 
+        private EnumSet<Connections> retrievedConnections = EnumSet.noneOf(Connections.class);
+
+        private ArrayList<String> parentCodes = new ArrayList<String>();
+
         private HashMap<String, String> properties = new HashMap<String, String>();
 
         public String getCode()
@@ -113,6 +124,28 @@ public final class DataSet implements Serializable
         {
             properties.put(propCode, value);
         }
+
+        public void setRetrievedConnections(EnumSet<Connections> retrievedConnections)
+        {
+            this.retrievedConnections =
+                    (null == retrievedConnections) ? EnumSet.noneOf(Connections.class)
+                            : retrievedConnections;
+        }
+
+        public EnumSet<Connections> getRetrievedConnections()
+        {
+            return retrievedConnections;
+        }
+
+        public void setParentCodes(ArrayList<String> parentCodes)
+        {
+            this.parentCodes = (null == parentCodes) ? new ArrayList<String>() : parentCodes;
+        }
+
+        public ArrayList<String> getParentCodes()
+        {
+            return parentCodes;
+        }
     }
 
     private final String code;
@@ -127,6 +160,11 @@ public final class DataSet implements Serializable
 
     private final HashMap<String, String> properties;
 
+    // For handling connections to entities
+    private final EnumSet<Connections> retrievedConnections;
+
+    private final ArrayList<String> parentCodes;
+
     /**
      * Creates a new instance with the provided initializer
      * 
@@ -151,6 +189,9 @@ public final class DataSet implements Serializable
         this.registrationDate = initializer.getRegistrationDate();
 
         this.properties = initializer.getProperties();
+
+        this.retrievedConnections = initializer.getRetrievedConnections();
+        this.parentCodes = initializer.getParentCodes();
     }
 
     private void checkValidString(String string, String message) throws IllegalArgumentException
@@ -194,6 +235,16 @@ public final class DataSet implements Serializable
         return properties;
     }
 
+    public EnumSet<Connections> getRetrievedConnections()
+    {
+        return retrievedConnections;
+    }
+
+    public ArrayList<String> getParentCodes()
+    {
+        return parentCodes;
+    }
+
     @Override
     public boolean equals(Object obj)
     {
@@ -229,6 +280,10 @@ public final class DataSet implements Serializable
         builder.append(getSampleIdentifierOrNull());
         builder.append(getDataSetTypeCode());
         builder.append(getProperties());
+        if (retrievedConnections.contains(Connections.PARENTS))
+        {
+            builder.append(getParentCodes());
+        }
         return builder.toString();
     }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
index 3ea3c9b08057822376b4baefea178856036b264a..f9dd3a1e5fa729c72c96ca2a37ff9aa5b93d5ad6 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
@@ -23,6 +23,7 @@ import static org.testng.AssertJUnit.fail;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
+import java.util.EnumSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -43,6 +44,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.PropertyTypeGroup;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Role;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet.Connections;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClause;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria;
@@ -244,6 +246,30 @@ public class GeneralInformationServiceTest extends SystemTestCase
         assertEquals(true, result.size() > 0);
     }
 
+    @Test
+    public void testListDataSetsWithParentsForAllSamples()
+    {
+        // Search for Samples first
+        SearchCriteria sc = new SearchCriteria();
+        List<Sample> samples = generalInformationService.searchForSamples(sessionToken, sc);
+        List<DataSet> result =
+                generalInformationService.listDataSets(sessionToken, samples,
+                        EnumSet.of(Connections.PARENTS));
+        assertEquals(true, result.size() > 0);
+        // See if some sample has parents
+        boolean parentCodesFound = false;
+        for (DataSet dataSet : result)
+        {
+            if (false == dataSet.getParentCodes().isEmpty())
+            {
+                parentCodesFound = true;
+                break;
+            }
+        }
+
+        assertTrue("No parent codes should have been found", (false == parentCodesFound));
+    }
+
     @Test
     public void testListDataSetsForSample()
     {