diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/InternalLinkCellRenderer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/InternalLinkCellRenderer.java
index 75fb413277a47edb5b9b9d7391d8d24155d54d8a..0e74b76fadf45ae4b7669b77b26288051e1840c2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/InternalLinkCellRenderer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/InternalLinkCellRenderer.java
@@ -9,6 +9,17 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.Base
 
 public class InternalLinkCellRenderer implements GridCellRenderer<BaseEntityModel<?>>
 {
+    private final boolean renderOriginalValueForEmptyToken;
+
+    public InternalLinkCellRenderer(boolean renderOriginalValueForEmptyToken)
+    {
+        this.renderOriginalValueForEmptyToken = renderOriginalValueForEmptyToken;
+    }
+
+    public InternalLinkCellRenderer()
+    {
+        this(false);
+    }
 
     public Object render(BaseEntityModel<?> model, String property, ColumnData config,
             int rowIndex, int colIndex, ListStore<BaseEntityModel<?>> store,
@@ -21,8 +32,14 @@ public class InternalLinkCellRenderer implements GridCellRenderer<BaseEntityMode
         { // TODO 2010-05-18, IA: almost the same as LinkRenderer#createLinkRenderer()
             String originalValue = String.valueOf(model.get(property));
             String tokenOrNull = model.tryGetLink(property);
-            String href = "#" + (tokenOrNull != null ? tokenOrNull : "");
-            return LinkRenderer.renderAsLinkWithAnchor(originalValue, href, false);
+            if (tokenOrNull == null && renderOriginalValueForEmptyToken)
+            {
+                return originalValue;
+            } else
+            {
+                String href = "#" + (tokenOrNull != null ? tokenOrNull : "");
+                return LinkRenderer.renderAsLinkWithAnchor(originalValue, href, false);
+            }
         }
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CodesArea.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CodesArea.java
index 5b6826116b8767164efe119722f8dba8688a45cb..3f3d5e471ecf05671286cb059f383fa65e612e12 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CodesArea.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/CodesArea.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui;
 
+import java.util.Collection;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.MultilineVarcharField;
@@ -36,7 +37,7 @@ abstract public class CodesArea<T extends ICodeHolder> extends MultilineVarcharF
         setEmptyText(emptyTextMsg);
     }
 
-    public final void setCodeProviders(List<T> codeProviders)
+    public final void setCodeProviders(Collection<T> codeProviders)
     {
         List<String> codes = Code.extractCodes(codeProviders);
         setCodes(codes);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/AbstractParentSampleColDef.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/AbstractParentSampleColDef.java
index a9192fe0d9fa52b6b28b4a85781a8cdc3460df96..7d4787f7e6cd809f129788a82934c14961510849 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/AbstractParentSampleColDef.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/AbstractParentSampleColDef.java
@@ -39,13 +39,18 @@ public abstract class AbstractParentSampleColDef extends AbstractColumnDefinitio
         Sample parent = tryGetParent(sample);
         if (parent != null)
         {
-            return parent.getIdentifier();
+            return getAsValue(parent);
         } else
         {
             return null;
         }
     }
 
+    protected final String getAsValue(Sample sample)
+    {
+        return sample.getIdentifier();
+    }
+
     @Override
     public String tryGetLink(Sample sample)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentGeneratedFromSampleColDef.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentGeneratedFromSampleColDef.java
index 51f305068e7d96de2aeb4e6be90a49cbb9a870d5..c1de7882d3ea2ffc233a97f9b91bb565cd47a275 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentGeneratedFromSampleColDef.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/sample/ParentGeneratedFromSampleColDef.java
@@ -16,12 +16,15 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.MultilineHTML;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
 public class ParentGeneratedFromSampleColDef extends AbstractParentSampleColDef
 {
     private static final String IDENTIFIER = "generatedFromParent";
 
+    private static final int MAX_PARENTS = 4;
+
     // GWT only
     public ParentGeneratedFromSampleColDef()
     {
@@ -62,7 +65,19 @@ public class ParentGeneratedFromSampleColDef extends AbstractParentSampleColDef
             return super.tryGetValue(sample);
         } else
         {
-            return parentsSize + "";
+            StringBuilder sb = new StringBuilder();
+            int counter = 0;
+            for (Sample parent : sample.getParents())
+            {
+                if (counter == MAX_PARENTS)
+                {
+                    sb.append("... (").append(parentsSize - MAX_PARENTS).append(" more)");
+                    break;
+                }
+                sb.append(getAsValue(parent)).append("\n");
+                counter++;
+            }
+            return new MultilineHTML(sb.toString()).toString();
         }
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
index a1789e6d6bf614556c00bfed9915c9db872a5c73..9f58645e23ae5e004ac6f25501e6186c8b3ef72f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/sample/SampleBrowserGrid.java
@@ -42,6 +42,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.SampleTypeDisplayID;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.SampleModelFactory;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.InternalLinkCellRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.DisplayedAndSelectedEntities;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample.AbstractParentSampleColDef;
@@ -612,9 +613,11 @@ public class SampleBrowserGrid extends
                 linkCellRenderer);
         schema.setGridCellRendererFor(CommonSampleColDefKind.PROJECT.id(), linkCellRenderer);
         // setup link renderers and listeners on parent columns
+        GridCellRenderer<BaseEntityModel<?>> parentLinkCellRenderer =
+                createParentLinkCellRenderer();
         for (final AbstractParentSampleColDef parentColDef : parentColumnsSchema)
         {
-            schema.setGridCellRendererFor(parentColDef.getIdentifier(), linkCellRenderer);
+            schema.setGridCellRendererFor(parentColDef.getIdentifier(), parentLinkCellRenderer);
             registerLinkClickListenerFor(parentColDef.getIdentifier(),
                     new OpenEntityDetailsTabCellClickListener()
                         {
@@ -629,6 +632,11 @@ public class SampleBrowserGrid extends
         return schema;
     }
 
+    protected final GridCellRenderer<BaseEntityModel<?>> createParentLinkCellRenderer()
+    {
+        return new InternalLinkCellRenderer(true);
+    }
+
     @Override
     protected boolean hasColumnsDefinitionChanged(ListSampleDisplayCriteria newCriteria)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Sample.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Sample.java
index 2fbb11ffd5a3cadbe0bfdc1e2e42ad9cd4009370..303735ea505b3cd47f46286463a88e4ebfc53d0c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Sample.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/Sample.java
@@ -19,6 +19,8 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
+import java.util.Set;
+import java.util.TreeSet;
 
 import ch.systemsx.cisd.common.annotation.CollectionMapping;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IAttachmentHolder;
@@ -52,7 +54,7 @@ public final class Sample extends CodeWithRegistration<Sample> implements IInval
 
     private Sample container;
 
-    private List<Sample> parents = new ArrayList<Sample>();
+    private Set<Sample> parents = new TreeSet<Sample>();
 
     private List<IEntityProperty> properties;
 
@@ -156,12 +158,12 @@ public final class Sample extends CodeWithRegistration<Sample> implements IInval
         this.container = container;
     }
 
-    public List<Sample> getParents()
+    public Set<Sample> getParents()
     {
         return parents;
     }
 
-    public void setParents(List<Sample> parents)
+    public void setParents(Set<Sample> parents)
     {
         this.parents = parents;
     }
@@ -182,13 +184,13 @@ public final class Sample extends CodeWithRegistration<Sample> implements IInval
             throw new IllegalStateException("Sample " + getIdentifier()
                     + " has more than one parent");
         }
-        return parents.get(0);
+        return parents.iterator().next();
     }
 
     // used only for testing
     public void setGeneratedFrom(final Sample generatedFrom)
     {
-        parents = new ArrayList<Sample>();
+        parents = new TreeSet<Sample>();
         parents.add(generatedFrom);
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java
index 11cf3cf31431d3f856f3db147eac6d988aeda626..eb98d7c3c561ac0803323b5aafcf6c7efc54622d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleEditForm.java
@@ -17,6 +17,7 @@
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample;
 
 import java.util.List;
+import java.util.Set;
 
 import ch.systemsx.cisd.common.shared.basic.utils.StringUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
@@ -156,7 +157,7 @@ public final class GenericSampleEditForm extends AbstractGenericSampleRegisterEd
 
     private void initializeGeneratedFromParent()
     {
-        List<Sample> parents = originalSample.getParents();
+        Set<Sample> parents = originalSample.getParents();
         if (parents.size() == 1)
         {
             Sample parentSample = originalSample.getGeneratedFrom();
@@ -170,7 +171,7 @@ public final class GenericSampleEditForm extends AbstractGenericSampleRegisterEd
     private void initializeParents()
     {
         // TODO 2010-08-06, Piotr Buczek: load in background? like in experiment
-        List<Sample> parents = originalSample.getParents();
+        Set<Sample> parents = originalSample.getParents();
         parentsArea.setSamples(parents);
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
index c2a99e4602d8000b7abd410e297df23c23cbe54c..d095dc737244b3096baa8f750f2fcb6bfad4c835 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
@@ -202,17 +202,17 @@ abstract public class GenericSampleViewer extends AbstractViewer<Sample> impleme
         containerSamplesSection = new ContainerSamplesSection(viewContext, generator);
         containerSamplesSection.setDisplayID(DisplayTypeIDGenerator.CONTAINER_SAMPLES_SECTION,
                 displayIdSuffix);
-        container.addPanel(containerSamplesSection);
+        container.addPanel(containerSamplesSection, false);
         // Derived samples
         derivedSamplesSection = new DerivedSamplesSection(viewContext, generator);
         derivedSamplesSection.setDisplayID(DisplayTypeIDGenerator.DERIVED_SAMPLES_SECTION,
                 displayIdSuffix);
-        container.addPanel(derivedSamplesSection);
+        container.addPanel(derivedSamplesSection, false);
         // Parent samples
         parentSamplesSection = new ParentSamplesSection(viewContext, generator);
         parentSamplesSection.setDisplayID(DisplayTypeIDGenerator.PARENT_SAMPLES_SECTION,
                 displayIdSuffix);
-        container.addPanel(parentSamplesSection);
+        container.addPanel(parentSamplesSection, false);
         // Data Sets
         CheckBox showOnlyDirectlyConnectedCheckBox = createShowOnlyDirectlyConnectedCheckBox();
         dataSetBrowser =
@@ -290,11 +290,11 @@ abstract public class GenericSampleViewer extends AbstractViewer<Sample> impleme
         {
             properties.put(messageProvider.getMessage(Dict.DERIVED_SAMPLE) + "s", generated.length);
         }
-        final List<Sample> parents = sample.getParents();
+        final Set<Sample> parents = sample.getParents();
         final int parentsSize = parents.size();
         if (parentsSize == 1)
         {
-            properties.put(messageProvider.getMessage(Dict.PARENT), parents.get(0));
+            properties.put(messageProvider.getMessage(Dict.PARENT), parents.iterator().next());
         } else if (parentsSize > 1)
         {
             properties.put(messageProvider.getMessage(Dict.PARENTS), parentsSize);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SamplesArea.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SamplesArea.java
index 2354cbaa0bb2f0c25dff1c04bcfc187800f7e983..8772464e680d64079ad63ea155e8628ba19e63af 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SamplesArea.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SamplesArea.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.sample;
 
+import java.util.Collection;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.CodesArea;
@@ -42,7 +43,7 @@ abstract public class SamplesArea extends CodesArea<Sample>
         return tryGetModifiedItemList();
     }
 
-    public final void setSamples(List<Sample> samples)
+    public final void setSamples(Collection<Sample> samples)
     {
         setCodeProviders(samples);
     }
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 105979dc8b67521b312f28c5705aa8fa69d4ddf6..24d4167ac95f8ee7480ef813fd3712060b65f10c 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
@@ -19,6 +19,7 @@ package ch.systemsx.cisd.openbis.plugin.generic.server;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.HashSet;
@@ -681,7 +682,9 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
         SampleUpdateResult result = new SampleUpdateResult();
         SamplePE sample = sampleBO.getSample();
         result.setModificationDate(sample.getModificationDate());
-        result.setParents(Code.extractCodes(sample.getParents()));
+        List<String> parents = Code.extractCodes(sample.getParents());
+        Collections.sort(parents);
+        result.setParents(parents);
         return result;
     }