diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DefaultEntityOperationService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DefaultEntityOperationService.java
index ae6cacfd85436dc5181a55b820905b9d2b04a7ea..56329c9fcd46be4a036643726c21d37b963f9e87 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DefaultEntityOperationService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/DefaultEntityOperationService.java
@@ -25,6 +25,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.AtomicEntityOperationDetails;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetRegistrationInformation;
+import ch.systemsx.cisd.openbis.generic.server.business.bo.MaterialUpdateDTO;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewProject;
@@ -81,6 +82,7 @@ public class DefaultEntityOperationService<T extends DataSetInformation> impleme
         List<SampleUpdatesDTO> sampleUpdates = details.getSampleUpdates();
         List<NewSample> sampleRegistrations = details.getSampleRegistrations();
         Map<String, List<NewMaterial>> materialRegistrations = details.getMaterialRegistrations();
+        List<MaterialUpdateDTO> materialUpdates = details.getMaterialUpdates();
         List<DataSetBatchUpdatesDTO> dataSetUpdates = details.getDataSetUpdates();
 
         List<NewExternalData> dataSetRegistrations = new ArrayList<NewExternalData>();
@@ -93,7 +95,7 @@ public class DefaultEntityOperationService<T extends DataSetInformation> impleme
         return new ch.systemsx.cisd.openbis.generic.shared.dto.AtomicEntityOperationDetails(
                 details.getRegistrationId(), details.tryUserIdOrNull(), spaceRegistrations,
                 projectRegistrations, experimentRegistrations, sampleUpdates, sampleRegistrations,
-                materialRegistrations, dataSetRegistrations, dataSetUpdates);
+                materialRegistrations, materialUpdates, dataSetRegistrations, dataSetUpdates);
     }
 
 }
\ No newline at end of file
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetRegistrationTransaction.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetRegistrationTransaction.java
index 75156ceae77c51cc5459fdcdae358cd299a834fc..48dd85ba877184d311b11864d3980095ce77e2e3 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetRegistrationTransaction.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetRegistrationTransaction.java
@@ -172,6 +172,14 @@ public interface IDataSetRegistrationTransaction
      */
     IMaterialImmutable getMaterial(String materialCode, String materialType);
 
+    /**
+     * Get a material from the openBIS AS for the purpose of modifying it. Returns null if the
+     * material does not exist.
+     * 
+     * @return A material or null
+     */
+    IMaterial getMaterialForUpdate(String materialCode, String materialType);
+
     /**
      * Create a new material to register with the openBIS AS.
      * 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
index 2842d473844f0686073948b59c80629f2def06e4..82fcd200321d7d94764f3bb02e547589ed70de45 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
@@ -24,6 +24,7 @@ import java.util.List;
 import java.util.Map;
 
 import net.lemnik.eodsql.DynamicTransactionQuery;
+
 import ch.systemsx.cisd.base.exceptions.CheckedExceptionTunnel;
 import ch.systemsx.cisd.base.exceptions.IOExceptionUnchecked;
 import ch.systemsx.cisd.base.exceptions.InterruptedExceptionUnchecked;
@@ -52,8 +53,10 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.ISampleImmuta
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.AtomicEntityOperationDetails;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetRegistrationInformation;
+import ch.systemsx.cisd.openbis.generic.server.business.bo.MaterialUpdateDTO;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewProject;
@@ -162,6 +165,8 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
 
         private final List<Material> materialsToBeRegistered = new ArrayList<Material>();
 
+        private final List<Material> materialsToBeUpdated = new ArrayList<Material>();
+
         private final Map<String, DynamicTransactionQuery> queriesToCommit =
                 new HashMap<String, DynamicTransactionQuery>();
 
@@ -573,6 +578,24 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
             return material;
         }
 
+        public IMaterial getMaterialForUpdate(String materialCode, String materialType)
+        {
+
+            MaterialIdentifier materialIdentifier =
+                    new MaterialIdentifier(materialCode, materialType);
+            ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material materialOrNull =
+                    openBisService.tryGetMaterial(materialIdentifier);
+
+            Material result = null;
+            if (materialOrNull != null)
+            {
+                result = new Material(materialOrNull);
+                materialsToBeUpdated.add(result);
+            }
+
+            return result;
+        }
+
         public String moveFile(String src, IDataSet dst)
         {
             File srcFile = new File(src);
@@ -822,6 +845,7 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
             List<SampleUpdatesDTO> sampleUpdates = convertSamplesToBeUpdated();
             List<NewSample> sampleRegistrations = convertSamplesToBeRegistered();
             Map<String, List<NewMaterial>> materialRegistrations = convertMaterialsToBeRegistered();
+            List<MaterialUpdateDTO> materialUpdates = convertMaterialsToBeUpdated();
             List<DataSetBatchUpdatesDTO> dataSetUpdates = convertDataSetsToBeUpdated();
 
             // experiment updates not yet supported
@@ -831,7 +855,8 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
                     new AtomicEntityOperationDetails<T>(registrationId, getUserId(),
                             spaceRegistrations, projectRegistrations, experimentUpdates,
                             experimentRegistrations, sampleUpdates, sampleRegistrations,
-                            materialRegistrations, dataSetRegistrations, dataSetUpdates);
+                            materialRegistrations, materialUpdates, dataSetRegistrations,
+                            dataSetUpdates);
             return registrationDetails;
         }
 
@@ -913,6 +938,17 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
             return result;
         }
 
+        private List<MaterialUpdateDTO> convertMaterialsToBeUpdated()
+        {
+            List<MaterialUpdateDTO> result = new ArrayList<MaterialUpdateDTO>();
+            for (Material material : materialsToBeUpdated)
+            {
+                MaterialUpdateDTO converted = ConversionUtils.convertToMaterialUpdateDTO(material);
+                result.add(converted);
+            }
+            return result;
+        }
+
         @Override
         public boolean isCommitted()
         {
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java
index a6b60e9265cf0fbd436feeb070a111b5593e3fdd..cb5bfb7f1ce900e800f224b10f99e0e0e8fd23fa 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java
@@ -24,6 +24,7 @@ import ch.systemsx.cisd.common.exceptions.NotImplementedException;
 import ch.systemsx.cisd.common.types.BooleanOrUnknown;
 import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationDetails;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
+import ch.systemsx.cisd.openbis.generic.server.business.bo.MaterialUpdateDTO;
 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.ContainerDataSet;
@@ -355,4 +356,9 @@ public class ConversionUtils
         return newMaterial;
     }
 
+    public static MaterialUpdateDTO convertToMaterialUpdateDTO(Material material)
+    {
+        return new MaterialUpdateDTO(new TechId(material.getMaterial().getId()), material
+                .getMaterial().getProperties(), material.getMaterial().getModificationDate());
+    }
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java
index 354de43a9facc00ec1751021afbf64169a3a8bf0..c3cd6e828c89a3c8089777fa87e79d3bcbed10cb 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransaction.java
@@ -381,6 +381,12 @@ public class DataSetRegistrationTransaction<T extends DataSetInformation> implem
         return (null == materialOrNull) ? null : new MaterialImmutable(materialOrNull);
     }
 
+    @Override
+    public IMaterial getMaterialForUpdate(String materialCode, String materialType)
+    {
+        return getStateAsLiveState().getMaterialForUpdate(materialCode, materialType);
+    }
+
     @Override
     public IMaterial createNewMaterial(String materialCode, String materialType)
     {
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/DataSetRegistrationTransactionV2Delegate.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/DataSetRegistrationTransactionV2Delegate.java
index 24da50e4e04c56283bfd159507d73718af5e605d..b90833524e522cce6811ceb121aafd2a52081de3 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/DataSetRegistrationTransactionV2Delegate.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/DataSetRegistrationTransactionV2Delegate.java
@@ -161,6 +161,12 @@ public class DataSetRegistrationTransactionV2Delegate implements IDataSetRegistr
         return transaction.getMaterial(materialCode, materialType);
     }
 
+    @Override
+    public IMaterial getMaterialForUpdate(String materialCode, String materialType)
+    {
+        return transaction.getMaterialForUpdate(materialCode, materialType);
+    }
+
     @Override
     public IMaterial createNewMaterial(String materialCode, String materialType)
     {
@@ -252,4 +258,5 @@ public class DataSetRegistrationTransactionV2Delegate implements IDataSetRegistr
     {
         return transaction.getExternalDataManagementSystem(externalDataManagementSystemCode);
     }
+
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java
index 29345b1546596aec918a78bb2aa95ee4f26c6f3c..2f104a258cb3dd3287e8a55e9ea8dcc9c0ebd9ad 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/IDataSetRegistrationTransactionV2.java
@@ -168,6 +168,13 @@ public interface IDataSetRegistrationTransactionV2
      */
     IMaterialImmutable getMaterial(String materialCode, String materialType);
 
+    /**
+     * Get a material from the openBIS AS. Returns null if the material does not exist.
+     * 
+     * @return A material or null
+     */
+    IMaterial getMaterialForUpdate(String materialCode, String materialType);
+
     /**
      * Create a new material to register with the openBIS AS.
      * 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/AtomicEntityOperationDetails.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/AtomicEntityOperationDetails.java
index 014d054dbb467a419f44ca0f64f27046d6443e28..2e57064d5a07c3bdf750334c25b15a0546828c61 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/AtomicEntityOperationDetails.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/AtomicEntityOperationDetails.java
@@ -22,6 +22,7 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import ch.systemsx.cisd.openbis.generic.server.business.bo.MaterialUpdateDTO;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial;
@@ -62,6 +63,8 @@ public class AtomicEntityOperationDetails<T extends DataSetInformation> implemen
 
     private final Map<String /* material type */, List<NewMaterial>> materialRegistrations;
 
+    private final List<MaterialUpdateDTO> materialUpdates;
+
     private final List<DataSetRegistrationInformation<T>> dataSetRegistrations;
 
     private final List<DataSetBatchUpdatesDTO> dataSetUpdates;
@@ -72,6 +75,7 @@ public class AtomicEntityOperationDetails<T extends DataSetInformation> implemen
             List<NewExperiment> experimentRegistrations, List<SampleUpdatesDTO> sampleUpdates,
             List<NewSample> sampleRegistrations,
             Map<String, List<NewMaterial>> materialRegistrations,
+            List<MaterialUpdateDTO> materialUpdates,
             List<DataSetRegistrationInformation<T>> dataSetRegistrations,
             List<DataSetBatchUpdatesDTO> dataSetUpdates)
     {
@@ -87,6 +91,7 @@ public class AtomicEntityOperationDetails<T extends DataSetInformation> implemen
         this.dataSetRegistrations =
                 new ArrayList<DataSetRegistrationInformation<T>>(dataSetRegistrations);
         this.dataSetUpdates = new ArrayList<DataSetBatchUpdatesDTO>(dataSetUpdates);
+        this.materialUpdates = materialUpdates;
     }
 
     public TechId getRegistrationId()
@@ -144,4 +149,8 @@ public class AtomicEntityOperationDetails<T extends DataSetInformation> implemen
         return materialRegistrations;
     }
 
+    public List<MaterialUpdateDTO> getMaterialUpdates()
+    {
+        return materialUpdates;
+    }
 }