diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/MixedExecuteOperationsTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/MixedExecuteOperationsTest.java
index bf2f5281930d39269826e8a62849bd023b3012b7..fa0026c3d9f78562c6598cc699edf5876b540d10 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/MixedExecuteOperationsTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/MixedExecuteOperationsTest.java
@@ -21,16 +21,19 @@ import static org.testng.Assert.assertEquals;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 
 import org.testng.annotations.Test;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.delete.DeleteObjectsWithTrashOperationResult;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.operation.IOperation;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.operation.IOperationResult;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.create.CreateDataSetsOperation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.create.DataSetCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.delete.DataSetDeletionOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.delete.DeleteDataSetsOperation;
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.delete.DeleteDataSetsOperationResult;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.fetchoptions.DataSetFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.DataSetPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.datastore.id.DataStorePermId;
@@ -47,14 +50,16 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.id.IMaterialId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.id.MaterialPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.operation.SynchronousOperationExecutionOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.operation.SynchronousOperationExecutionResults;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.create.CreateSamplesOperation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.create.SampleCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.delete.DeleteSamplesOperation;
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.delete.DeleteSamplesOperationResult;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.delete.SampleDeletionOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions.SampleFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.ISampleId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdentifier;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.update.SampleUpdate;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.update.UpdateSamplesOperation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.ISpaceId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.create.CreateVocabularyTermsOperation;
@@ -68,7 +73,8 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.id.VocabularyPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.id.VocabularyTermPermId;
 
 /**
- * 
+ * System tests for {@link IApplicationServerApi#executeOperations(String, List, ch.ethz.sis.openbis.generic.asapi.v3.dto.operation.IOperationExecutionOptions)}
+ * for various combinations.
  *
  * @author Franz-Josef Elmer
  */
@@ -135,10 +141,7 @@ public class MixedExecuteOperationsTest extends AbstractOperationExecutionTest
         List<IOperation> operations = new ArrayList<IOperation>();
         
         // Create a sample with a data set
-        SampleCreation sampleCreation = new SampleCreation();
-        sampleCreation.setTypeId(new EntityTypePermId("NORMAL"));
-        sampleCreation.setCode("S-" + time);
-        sampleCreation.setSpaceId(new SpacePermId("CISD"));
+        SampleCreation sampleCreation = createSample("S-" + time);
         ISampleId sampleId = getId(sampleCreation);
         operations.add(new CreateSamplesOperation(sampleCreation));
         DataSetCreation dataSetCreation = new DataSetCreation();
@@ -155,14 +158,11 @@ public class MixedExecuteOperationsTest extends AbstractOperationExecutionTest
         DataSetDeletionOptions dataSetDeletionOptions = new DataSetDeletionOptions();
         dataSetDeletionOptions.setReason("test data set deletion");
         operations.add(new DeleteDataSetsOperation(Arrays.asList(dataSetPermId), dataSetDeletionOptions));
-        SampleDeletionOptions sampleDeletionOptions = new SampleDeletionOptions();
-        sampleDeletionOptions.setReason("Test sample deletion");
+        SampleDeletionOptions sampleDeletionOptions = createSampleDeletionOptions();
         operations.add(new DeleteSamplesOperation(Arrays.asList(sampleId), sampleDeletionOptions));
         SynchronousOperationExecutionResults executionResults = execute(sessionToken, operations);
-        DeleteDataSetsOperationResult opResult1 = (DeleteDataSetsOperationResult) executionResults.getResults().get(0);
-        IDeletionId delId1 = opResult1.getDeletionId();
-        DeleteSamplesOperationResult opResult2 = (DeleteSamplesOperationResult) executionResults.getResults().get(1);
-        IDeletionId delId2 = opResult2.getDeletionId();
+        IDeletionId delId1 = getDeletionId(executionResults.getResults().get(0));
+        IDeletionId delId2 = getDeletionId(executionResults.getResults().get(1));
         assertEquals(v3api.getSamples(sessionToken, Arrays.asList(sampleId), new SampleFetchOptions()).size(), 0);
         assertEquals(v3api.getDataSets(sessionToken, Arrays.asList(dataSetPermId), new DataSetFetchOptions()).size(), 0);
         
@@ -174,6 +174,68 @@ public class MixedExecuteOperationsTest extends AbstractOperationExecutionTest
         v3api.logout(sessionToken);
     }
     
+    @Test
+    public void testDeleteAndReplaceParentSample()
+    {
+        String sessionToken = v3api.login(TEST_USER, PASSWORD);
+        long time = System.currentTimeMillis();
+        List<IOperation> operations = new ArrayList<IOperation>();
+        
+        // Create parentA and parentB and a child
+        SampleCreation pa = createSample("P-" + time + "_A");
+        ISampleId paId = getId(pa);
+        SampleCreation pb = createSample("P-" + time + "_B");
+        ISampleId pbId = getId(pb);
+        SampleCreation child = createSample("C-" + time);
+        ISampleId childId = getId(child);
+        child.setParentIds(Arrays.asList(paId, pbId));
+        operations.add(new CreateSamplesOperation(pa, pb, child));
+        execute(sessionToken, operations);
+        Sample parentA = getSample(sessionToken, paId);
+        assertEquals(parentA.getCode(), pa.getCode());
+        assertEquals(parentA.getChildren().get(0).getCode(), child.getCode());
+        Sample parentB = getSample(sessionToken, pbId);
+        assertEquals(parentB.getCode(), pb.getCode());
+        assertEquals(parentB.getChildren().get(0).getCode(), child.getCode());
+        Sample childSample = getSample(sessionToken, childId);
+        assertEquals(childSample.getCode(), child.getCode());
+        List<String> parentsCode = extractCodes(childSample.getParents());
+        Collections.sort(parentsCode);
+        assertEquals(parentsCode.toString(), "[" + pa.getCode() + ", " + pb.getCode() + "]");
+        
+        // Create parentC, delete parentB, and replace parentB by parentC
+        operations.clear();
+        SampleCreation pc = createSample("P-" + time + "_C");
+        ISampleId pcId = getId(pc);
+        operations.add(new CreateSamplesOperation(pc));
+        SampleUpdate sampleUpdate = new SampleUpdate();
+        sampleUpdate.setSampleId(childId);
+        sampleUpdate.getParentIds().add(paId, pcId);
+        operations.add(new UpdateSamplesOperation(sampleUpdate));
+        operations.add(new DeleteSamplesOperation(Arrays.asList(pbId), createSampleDeletionOptions()));
+        SynchronousOperationExecutionResults executionResults = execute(sessionToken, operations);
+        IDeletionId deletionId = getDeletionId(executionResults.getResults().get(2));
+        assertNotNull(deletionId);
+        v3api.confirmDeletions(sessionToken, Arrays.asList(deletionId));
+        assertEquals(getSample(sessionToken, paId).getChildren().get(0).getCode(), child.getCode());
+        assertEquals(getSample(sessionToken, pbId), null);
+        assertEquals(getSample(sessionToken, pcId).getChildren().get(0).getCode(), child.getCode());
+        parentsCode = extractCodes(getSample(sessionToken, childId).getParents());
+        Collections.sort(parentsCode);
+        assertEquals(parentsCode.toString(), "[" + pa.getCode() + ", " + pc.getCode() + "]");
+        
+        v3api.logout(sessionToken);
+    }
+    
+    private SampleCreation createSample(String code)
+    {
+        SampleCreation sampleCreation = new SampleCreation();
+        sampleCreation.setTypeId(new EntityTypePermId("NORMAL"));
+        sampleCreation.setCode(code);
+        sampleCreation.setSpaceId(new SpacePermId("CISD"));
+        return sampleCreation;
+    }
+    
     private ISampleId getId(SampleCreation sampleCreation)
     {
         ISpaceId spaceId = sampleCreation.getSpaceId();
@@ -192,6 +254,22 @@ public class MixedExecuteOperationsTest extends AbstractOperationExecutionTest
         return new VocabularyTermPermId(vt.getCode(), ((VocabularyPermId) vocabularyId).getPermId());
     }
     
+    private IDeletionId getDeletionId(IOperationResult operationResult)
+    {
+        if (operationResult instanceof DeleteObjectsWithTrashOperationResult)
+        {
+            return ((DeleteObjectsWithTrashOperationResult) operationResult).getDeletionId();
+        }
+        return null;
+    }
+
+    private SampleDeletionOptions createSampleDeletionOptions()
+    {
+        SampleDeletionOptions sampleDeletionOptions = new SampleDeletionOptions();
+        sampleDeletionOptions.setReason("Test sample deletion");
+        return sampleDeletionOptions;
+    }
+    
     private VocabularyTermDeletionOptions createVocabularyTermDeletionOptions()
     {
         VocabularyTermDeletionOptions termDeletionOptions = new VocabularyTermDeletionOptions();
@@ -206,6 +284,15 @@ public class MixedExecuteOperationsTest extends AbstractOperationExecutionTest
         return v3api.getMaterials(sessionToken, Arrays.asList(materialId), materialFetchOptions).get(materialId);
     }
     
+    private Sample getSample(String sessionToken, ISampleId sampleId)
+    {
+        SampleFetchOptions fetchOptions = new SampleFetchOptions();
+        fetchOptions.withProperties();
+        fetchOptions.withChildren();
+        fetchOptions.withParents();
+        return v3api.getSamples(sessionToken, Arrays.asList(sampleId), fetchOptions).get(sampleId);
+    }
+    
     private SynchronousOperationExecutionResults execute(String sessionToken, List<IOperation> operations)
     {
         SynchronousOperationExecutionOptions options = new SynchronousOperationExecutionOptions();