diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleGenericBusinessRules.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleGenericBusinessRules.java
index 0112feeb447848ea24a21b0b19f747f078701780..b63b8c97dfc6380f7d66ea8a0cd6e9987c4ed19b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleGenericBusinessRules.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleGenericBusinessRules.java
@@ -38,8 +38,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 public class SampleGenericBusinessRules
 {
 
-    static private void assertValidParentRelation(final SamplePE parent, final SamplePE child)
-            throws UserFailureException
+    static private void assertValidParentRelation(final SamplePE parent, final SamplePE child,
+            final String childRelationName) throws UserFailureException
     {
         if (parent == null || child == null)
             return;
@@ -53,18 +53,13 @@ public class SampleGenericBusinessRules
             if (childId.isDatabaseInstanceLevel())
             {
                 throwUserFailureException("The database instance sample '%s' "
-                        + "can not be derived from the group sample '%s'.", child, parent);
-            }
-            if (parentId.getGroupLevel().equals(childId.getGroupLevel()) == false)
-            {
-                throwUserFailureException("The sample '%s' has to be in the same group as "
-                        + "the sample '%s' from which it is derived.", child, parent);
+                        + "can not be %s the group sample '%s'.", child, parent, childRelationName);
             }
         }
     }
 
     static private void assertValidChildrenRelation(final List<SamplePE> children,
-            final SamplePE parent) throws UserFailureException
+            final SamplePE parent, final String childRelationName) throws UserFailureException
     {
         if (children == null || children.size() == 0 || parent == null)
             return;
@@ -80,12 +75,8 @@ public class SampleGenericBusinessRules
                 if (childId.isDatabaseInstanceLevel())
                 {
                     throwUserFailureException("Sample '%s' can not be a group sample because of "
-                            + "a derived database instance sample '%s'.", parent, child);
-                }
-                if (parentId.getGroupLevel().equals(childId.getGroupLevel()) == false)
-                {
-                    throwUserFailureException("Sample '%s' can not have different group "
-                            + "from its derived sample '%s'.", child, parent);
+                            + "a %s database instance sample '%s'.", parent, child,
+                            childRelationName);
                 }
             }
         }
@@ -95,22 +86,22 @@ public class SampleGenericBusinessRules
     {
         if (sample == null)
             return;
-        assertValidParentRelation(sample.getContainer(), sample);
-        assertValidParentRelation(sample.getGeneratedFrom(), sample);
+        assertValidParentRelation(sample.getContainer(), sample, "contained in");
+        assertValidParentRelation(sample.getGeneratedFrom(), sample, "derived from");
     }
 
     static public void assertValidChildren(SamplePE sample)
     {
         if (sample == null)
             return;
-        assertValidChildrenRelation(sample.getContained(), sample);
-        assertValidChildrenRelation(sample.getGenerated(), sample);
+        assertValidChildrenRelation(sample.getContained(), sample, "contained");
+        assertValidChildrenRelation(sample.getGenerated(), sample, "derived");
     }
 
     static private void throwUserFailureException(String messageTemplate, SamplePE sample1,
-            SamplePE sample2)
+            SamplePE sample2, String childRelationName)
     {
         throw UserFailureException.fromTemplate(messageTemplate, sample1.getSampleIdentifier(),
-                sample2.getSampleIdentifier());
+                childRelationName, sample2.getSampleIdentifier());
     }
 }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleGenericBusinessRulesTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleGenericBusinessRulesTest.java
index ebca0dac7a0da7779013999506ad02b5e845e4f7..728d10d933510f80e0ad21feff54b60203abf372 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleGenericBusinessRulesTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleGenericBusinessRulesTest.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.server.business.bo;
 
+import org.testng.AssertJUnit;
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
@@ -28,7 +29,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
  * 
  * @author Izabela Adamczyk
  */
-public final class SampleGenericBusinessRulesTest
+public final class SampleGenericBusinessRulesTest extends AssertJUnit
 {
     private static final String DB = "db";
 
@@ -77,89 +78,115 @@ public final class SampleGenericBusinessRulesTest
     public void testGroupSampleCanHaveParentFromTheSameGroup() throws Exception
     {
         DatabaseInstancePE databaseInstance = createDatabaseInstance(DB);
-        SamplePE newSample = createGroupSample(createGroup(databaseInstance, GROUP_1), SAMPLE_1);
-
+        SamplePE child = createGroupSample(createGroup(databaseInstance, GROUP_1), SAMPLE_1);
         SamplePE generator = createGroupSample(createGroup(databaseInstance, GROUP_1), SAMPLE_2);
-        newSample.setGeneratedFrom(generator);
-
         SamplePE container = createGroupSample(createGroup(databaseInstance, GROUP_1), SAMPLE_3);
-        newSample.setContainer(container);
 
-        SampleGenericBusinessRules.assertValidParents(newSample);
+        setBidirectionalRelationships(child, generator, container);
+        checkBusinessRules(child);
     }
 
     @Test
     public void testGroupSampleCanHaveSharedParent() throws Exception
     {
         DatabaseInstancePE databaseInstance = createDatabaseInstance(DB);
-        SamplePE newSample = createGroupSample(createGroup(databaseInstance, GROUP_1), SAMPLE_1);
-
-        SamplePE parent = createSharedSample(databaseInstance, SAMPLE_2);
-        newSample.setGeneratedFrom(parent);
-
+        SamplePE child = createGroupSample(createGroup(databaseInstance, GROUP_1), SAMPLE_1);
+        SamplePE generator = createSharedSample(databaseInstance, SAMPLE_2);
         SamplePE container = createSharedSample(databaseInstance, SAMPLE_3);
-        newSample.setContainer(container);
 
-        SampleGenericBusinessRules.assertValidParents(newSample);
+        setBidirectionalRelationships(child, generator, container);
+        checkBusinessRules(child);
     }
 
-    @Test(expectedExceptions = UserFailureException.class)
-    public void testGroupSampleCannotBeContainedByParentFromDifferentGroup() throws Exception
+    @Test
+    public void testGroupSampleCanBeContainedByParentFromDifferentGroup() throws Exception
     {
         DatabaseInstancePE databaseInstance = createDatabaseInstance(DB);
-        SamplePE newSample = createGroupSample(createGroup(databaseInstance, GROUP_1), SAMPLE_1);
-
-        SamplePE parent = createGroupSample(createGroup(databaseInstance, GROUP_2), SAMPLE_2);
-        newSample.setContainer(parent);
+        SamplePE child = createGroupSample(createGroup(databaseInstance, GROUP_1), SAMPLE_1);
+        SamplePE container = createGroupSample(createGroup(databaseInstance, GROUP_2), SAMPLE_2);
 
-        SampleGenericBusinessRules.assertValidParents(newSample);
+        setBidirectionalRelationships(child, null, container);
+        checkBusinessRules(child);
     }
 
-    @Test(expectedExceptions = UserFailureException.class)
-    public void testGroupSampleCannotBeDerivedFromParentFromDifferentGroup() throws Exception
+    @Test
+    public void testGroupSampleCanBeDerivedFromParentFromDifferentGroup() throws Exception
     {
         DatabaseInstancePE databaseInstance = createDatabaseInstance(DB);
-        SamplePE newSample = createGroupSample(createGroup(databaseInstance, GROUP_1), SAMPLE_1);
+        SamplePE child = createGroupSample(createGroup(databaseInstance, GROUP_1), SAMPLE_1);
+        SamplePE generator = createGroupSample(createGroup(databaseInstance, GROUP_2), SAMPLE_2);
 
-        SamplePE parent = createGroupSample(createGroup(databaseInstance, GROUP_2), SAMPLE_2);
-        newSample.setGeneratedFrom(parent);
-
-        SampleGenericBusinessRules.assertValidParents(newSample);
+        setBidirectionalRelationships(child, generator, null);
+        checkBusinessRules(child);
     }
 
     @Test
     public void testInstanceSampleCanHaveInstanceSampleParents() throws Exception
     {
         DatabaseInstancePE databaseInstance = createDatabaseInstance(DB);
-        SamplePE newSample = createSharedSample(databaseInstance, SAMPLE_1);
-
+        SamplePE child = createSharedSample(databaseInstance, SAMPLE_1);
         SamplePE generator = createSharedSample(databaseInstance, SAMPLE_2);
-        newSample.setGeneratedFrom(generator);
-
         SamplePE container = createSharedSample(databaseInstance, SAMPLE_3);
-        newSample.setContainer(container);
 
-        SampleGenericBusinessRules.assertValidParents(newSample);
+        setBidirectionalRelationships(child, generator, container);
+        checkBusinessRules(child);
     }
 
     @Test(expectedExceptions = UserFailureException.class)
     public void testInstanceSampleCannotBeContainedByGroupSample() throws Exception
     {
         DatabaseInstancePE databaseInstance = createDatabaseInstance(DB);
-        SamplePE newSample = createSharedSample(databaseInstance, SAMPLE_1);
-        SamplePE parent = createGroupSample(createGroup(databaseInstance, GROUP_1), SAMPLE_2);
-        newSample.setContainer(parent);
-        SampleGenericBusinessRules.assertValidParents(newSample);
+        SamplePE child = createSharedSample(databaseInstance, SAMPLE_1);
+        SamplePE container = createGroupSample(createGroup(databaseInstance, GROUP_1), SAMPLE_2);
+
+        setBidirectionalRelationships(child, null, container);
+        // two asserts need to fail
+        try
+        {
+            SampleGenericBusinessRules.assertValidParents(child);
+        } catch (UserFailureException e)
+        {
+            SampleGenericBusinessRules.assertValidChildren(container);
+        }
     }
 
     @Test(expectedExceptions = UserFailureException.class)
     public void testInstanceSampleCannotBeDerivedFromGroupSample() throws Exception
     {
         DatabaseInstancePE databaseInstance = createDatabaseInstance(DB);
-        SamplePE newSample = createSharedSample(databaseInstance, SAMPLE_1);
-        SamplePE parent = createGroupSample(createGroup(databaseInstance, GROUP_1), SAMPLE_2);
-        newSample.setGeneratedFrom(parent);
-        SampleGenericBusinessRules.assertValidParents(newSample);
+        SamplePE child = createSharedSample(databaseInstance, SAMPLE_1);
+        SamplePE generator = createGroupSample(createGroup(databaseInstance, GROUP_1), SAMPLE_2);
+
+        setBidirectionalRelationships(child, generator, null);
+        // two asserts need to fail
+        try
+        {
+            SampleGenericBusinessRules.assertValidParents(child);
+        } catch (UserFailureException e)
+        {
+            SampleGenericBusinessRules.assertValidChildren(generator);
+        }
     }
 
+    private void setBidirectionalRelationships(SamplePE child, SamplePE generatorOrNull,
+            SamplePE containerOrNull)
+    {
+        child.setContainer(containerOrNull);
+        child.setGeneratedFrom(generatorOrNull);
+        if (generatorOrNull != null)
+        {
+            generatorOrNull.getGenerated().add(child);
+        }
+        if (containerOrNull != null)
+        {
+            containerOrNull.getContained().add(child);
+        }
+    }
+
+    private void checkBusinessRules(SamplePE child)
+    {
+        SampleGenericBusinessRules.assertValidParents(child);
+        SampleGenericBusinessRules.assertValidChildren(child.getContainer());
+        SampleGenericBusinessRules.assertValidChildren(child.getGeneratedFrom());
+    }
 }
\ No newline at end of file