diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java
index 423ca7462362118dc579fa0ab7e237ab5b49604b..c08c58e991d61ffa93e1c2f6b72f2292afc25227 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractBusinessObject.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.server.business.bo;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Date;
 import java.util.HashMap;
@@ -29,6 +30,7 @@ import org.apache.commons.lang.StringUtils;
 import org.hibernate.SessionFactory;
 import org.springframework.dao.DataAccessException;
 
+import ch.systemsx.cisd.common.collection.CollectionUtils;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.business.IDataStoreServiceFactory;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.util.DataSetTypeWithoutExperimentChecker;
@@ -731,18 +733,29 @@ abstract class AbstractBusinessObject implements IDAOFactory
         }
     }
     
-    protected void checkSampleWithoutDatasets(IDataDAO dataDAO, SamplePE sample)
+    protected void checkSampleWithoutDatasets(SamplePE sample)
     {
         List<DataPE> dataSets = getDataDAO().listDataSets(sample);
+        String sampleIdentifier = sample.getIdentifier();
+        checkDataSetsDoNotNeedAnExperiment(sampleIdentifier, dataSets);
+    }
+
+    private void checkDataSetsDoNotNeedAnExperiment(String sampleIdentifier, List<DataPE> dataSets)
+    {
+        List<String> dataSetsNeedingExperiment = new ArrayList<String>();
         for (DataPE dataSet : dataSets)
         {
+            String dataSetTypeCode = dataSet.getDataSetType().getCode();
+            if (dataSetTypeChecker.isDataSetTypeWithoutExperiment(dataSetTypeCode) == false)
+            {
+                dataSetsNeedingExperiment.add(dataSet.getCode());
+            }
         }
-        if (hasDatasets2(dataDAO, sample))
+        if (dataSetsNeedingExperiment.isEmpty() == false)
         {
-            throw UserFailureException
-                    .fromTemplate(
-                            "Operation cannot be performed, because some datasets have been already produced for the sample '%s'.",
-                            sample.getSampleIdentifier());
+            throw new UserFailureException("Operation cannot be performed, because the sample "
+                    + sampleIdentifier + " has the following datasets which need an experiment: "
+                    + CollectionUtils.abbreviate(dataSetsNeedingExperiment, 10));
         }
     }
     
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
index ccafafc89c1443951296613289597a894fced629..0484f767014bf793b238e23f8f6f3272f936448e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
@@ -517,7 +517,7 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper
     {
         for (SamplePE sample : samples)
         {
-            checkSampleWithoutDatasets(getDataDAO(), sample);
+            checkSampleWithoutDatasets(sample);
 
             relationshipService.unassignSampleFromExperiment(session, sample);
         }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java
index 7706876db036376577c0008666df8330df20c3b5..e3142b829b6e23e7e664098c59a119a983499734 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/SampleBO.java
@@ -239,7 +239,7 @@ public final class SampleBO extends AbstractSampleBusinessObject implements ISam
         checkAvailable(sample);
         checkSpaceSample(sample);
         checkSampleUnused(sample);
-        checkSampleWithoutDatasets(getDataDAO(), sample);
+        checkSampleWithoutDatasets(sample);
 
         this.relationshipService.assignSampleToExperiment(session, sample, experiment);
         try
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/util/DataSetTypeWithoutExperimentChecker.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/util/DataSetTypeWithoutExperimentChecker.java
index fc9d912efb045eb3049639e8a549084465595337..a104cd35731f06e6b3f8d2e59d133909c5afd033 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/util/DataSetTypeWithoutExperimentChecker.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/util/DataSetTypeWithoutExperimentChecker.java
@@ -41,7 +41,12 @@ public class DataSetTypeWithoutExperimentChecker
 
     public DataSetTypeWithoutExperimentChecker(Properties properties)
     {
-        regularExpressions = properties.getProperty(PROPERTY_KEY);
+        this(properties.getProperty(PROPERTY_KEY));
+    }
+
+    public DataSetTypeWithoutExperimentChecker(String regularExpressions)
+    {
+        this.regularExpressions = regularExpressions;
         if (StringUtils.isNotBlank(regularExpressions))
         {
             String[] splittedRegexes = regularExpressions.split(",");
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBOTest.java
index e81e36b1be7cda556091284455de286ead02f6b3..d8017e338925e4fd919ac4d15097b56bb98014a0 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBOTest.java
@@ -36,6 +36,7 @@ import org.testng.annotations.Test;
 import ch.rinn.restrictions.Friend;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.business.ManagerTestTool;
+import ch.systemsx.cisd.openbis.generic.server.business.bo.util.DataSetTypeWithoutExperimentChecker;
 import ch.systemsx.cisd.openbis.generic.server.util.TimeIntervalChecker;
 import ch.systemsx.cisd.openbis.generic.shared.CommonTestUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
@@ -43,6 +44,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.dto.AttachmentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityPropertyPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE;
@@ -93,7 +96,7 @@ public final class ExperimentBOTest extends AbstractBOTest
     private final ExperimentBO createExperimentBO()
     {
         return new ExperimentBO(daoFactory, ManagerTestTool.EXAMPLE_SESSION, relationshipService,
-                managedPropertyEvaluatorFactory, null);
+                managedPropertyEvaluatorFactory, new DataSetTypeWithoutExperimentChecker("NE.*"));
     }
 
     @BeforeMethod
@@ -811,7 +814,7 @@ public final class ExperimentBOTest extends AbstractBOTest
         context.assertIsSatisfied();
     }
 
-    @Test(expectedExceptionsMessageRegExp = ".*datasets.*", expectedExceptions = UserFailureException.class)
+    @Test
     public void testUpdateByRemovingASampleWithDataSets()
     {
         ExperimentIdentifier identifier = CommonTestUtils.createExperimentIdentifier();
@@ -826,7 +829,15 @@ public final class ExperimentBOTest extends AbstractBOTest
         prepareRemoveSamplesFromExperiment(experiment, true, "S1");
         ExperimentBO experimentBO = loadExperiment(identifier, experiment);
 
-        experimentBO.update(update);
+        try
+        {
+            experimentBO.update(update);
+            fail("UserFailureException expected");
+        } catch (UserFailureException ex)
+        {
+            assertEquals("Operation cannot be performed, because the sample /S1 has the "
+                    + "following datasets which need an experiment: [DS1]", ex.getMessage());
+        }
 
         context.assertIsSatisfied();
     }
@@ -901,11 +912,19 @@ public final class ExperimentBOTest extends AbstractBOTest
                         SamplePE sample = createSampleWithCode(sampleCode);
                         will(returnValue(sample));
 
-                        one(dataDAO).hasDataSet(sample);
-                        will(returnValue(samplesHaveDataSets));
+                        one(dataDAO).listDataSets(sample);
                         if (samplesHaveDataSets)
                         {
+                            DataPE dataPE = new DataPE();
+                            dataPE.setCode("DS1");
+                            DataSetTypePE dataSetType = new DataSetTypePE();
+                            dataSetType.setCode("A");
+                            dataPE.setDataSetType(dataSetType);
+                            will(returnValue(Arrays.asList(dataPE)));
                             break;
+                        } else
+                        {
+                            will(returnValue(Arrays.asList()));
                         }
                         one(relationshipService).unassignSampleFromExperiment(EXAMPLE_SESSION,
                                 sample);