diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java
index d4d05f9394936d54e1be66248ed81fc9e76d800c..8eb96cea9308f049b95304d55d145a6d785cf630 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAO.java
@@ -35,7 +35,6 @@ import org.hibernate.criterion.DetachedCriteria;
 import org.hibernate.criterion.Projections;
 import org.hibernate.criterion.Restrictions;
 import org.springframework.dao.DataAccessException;
-import org.springframework.dao.DataIntegrityViolationException;
 import org.springframework.orm.hibernate3.HibernateCallback;
 import org.springframework.orm.hibernate3.HibernateTemplate;
 
@@ -52,9 +51,9 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.DeletionPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.TableNames;
 import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils;
@@ -446,28 +445,26 @@ final class DataDAO extends AbstractGenericEntityWithPropertiesDAO<DataPE> imple
     public void delete(DataPE entity) throws DataAccessException
     {
         assert entity != null : "entity unspecified";
-        if (entity.getChildren().size() > 0)
+        // Remove children & components and flush changes before deletion.
+        // Otherwise constraint violation exception will be thrown.
+        List<DataPE> children = new ArrayList<DataPE>(entity.getChildren());
+        for (DataPE child : children)
         {
-            throw new DataIntegrityViolationException(String.format(
-                    "Data Set '%s' cannot be deleted because children datasets are connected.",
-                    entity.getCode()));
+            child.removeParent(entity);
         }
         if (entity.isContainer())
         {
-            // Remove components and flush changes before deletion of the container.
-            // Otherwise constraint violation exception will be thrown.
             List<DataPE> components = new ArrayList<DataPE>(entity.getContainedDataSets());
             for (DataPE component : components)
             {
                 entity.removeComponent(component);
             }
-            flush();
         }
+        flush();
         super.delete(entity);
     }
 
-    public void trash(List<DataPE> dataSets, DeletionPE deletion)
-            throws DataAccessException
+    public void trash(List<DataPE> dataSets, DeletionPE deletion) throws DataAccessException
     {
         // TODO 2011-06-16, Piotr Buczek: could be done faster with bulk update
         for (DataPE dataSet : dataSets)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAOTest.java
index 7355cf145b4768b2eed31626be365e8e9e2d581d..95528b00e5206cac1023293f22315e58bf2b7981 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/DataDAOTest.java
@@ -28,7 +28,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
 
-import org.springframework.dao.DataIntegrityViolationException;
 import org.testng.AssertJUnit;
 import org.testng.annotations.Test;
 
@@ -40,6 +39,7 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.ILocatorTypeDAO;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.ISampleDAO;
 import ch.systemsx.cisd.openbis.generic.shared.Constants;
 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.DataSetArchivingStatus;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetPropertyPE;
@@ -80,7 +80,6 @@ public final class DataDAOTest extends AbstractDAOTest
 
     private final String VIRTUAL_DATA_SET_TYPE_CODE = "CONTAINER_TYPE";
 
-
     @Test
     public final void testListSampleDataSets()
     {
@@ -366,7 +365,7 @@ public final class DataDAOTest extends AbstractDAOTest
             assertFalse(retrievedPropertyType.getPropertyValues().contains(property));
         }
 
-        // deleted sample had parent connected that should not have been deleted
+        // deleted data set had parent connected that should not have been deleted
         // NOTE: somehow cannot get parents even though connection is the same as with children
         // DataPE parent = deletedData.tryGetParent();
         // assertNotNull(parent);
@@ -392,17 +391,27 @@ public final class DataDAOTest extends AbstractDAOTest
         assertNull(preservedComponent.getContainer());
     }
 
-    @Test(expectedExceptions = DataIntegrityViolationException.class)
-    public final void testDeleteFailWithChildrenDatasets()
+    @Test
+    public final void testDeleteParentPreservesChildren()
     {
         final IDataDAO dataDAO = daoFactory.getDataDAO();
         final DataPE deletedData = findData(PARENT_CODE);
 
-        // Deleted data set should have 'child' data sets which prevent it from deletion.
+        // Deleted data set should have 'child' data sets.
         assertFalse(deletedData.getChildren().isEmpty());
+        List<String> childrenCodes = Code.extractCodes(deletedData.getChildren());
 
         // delete
         dataDAO.delete(deletedData);
+
+        // test successful deletion of data set
+        assertNull(dataDAO.tryGetByTechId(TechId.create(deletedData)));
+
+        // deleted data set had child connected that should not have been deleted
+        for (String child : childrenCodes)
+        {
+            findData(child);
+        }
     }
 
     protected VocabularyTermPE pickAStorageFormatVocabularyTerm()