diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/common/MasterDataExtractor.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/common/MasterDataExtractor.java
index a4cc92b22870673cc0134e337eb2dc161e835cbb..cdadf650d1b4d90d34138c24e83be8cf141f2fd2 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/common/MasterDataExtractor.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/common/MasterDataExtractor.java
@@ -190,11 +190,11 @@ public class MasterDataExtractor
     {
         if (vocabularies.size() > 0)
         {
-            Element vocabsElement = doc.createElement("vocabularies");
+            Element vocabsElement = doc.createElement("controlledVocabularies");
             rootElement.appendChild(vocabsElement);
             for (IVocabularyImmutable vocabImmutable : vocabularies)
             {
-                Element vocabElement = doc.createElement("vocabulary");
+                Element vocabElement = doc.createElement("controlledVocabulary");
                 String code = vocabImmutable.isInternalNamespace()
                         && vocabImmutable.getCode().startsWith(INTERNAL_NAMESPACE_PREFIX) ? CodeConverter.tryToDatabase(vocabImmutable.getCode())
                                 : vocabImmutable.getCode();
@@ -267,12 +267,12 @@ public class MasterDataExtractor
     {
         if (experimentTypes.size() > 0)
         {
-            Element experimentTypesElement = doc.createElement("experimentTypes");
+            Element experimentTypesElement = doc.createElement("collectionTypes");
             rootElement.appendChild(experimentTypesElement);
             Map<String, List<PropertyAssignment>> expTypeCodePropAssignmentMap = loadExperimentTypesUsingV3WithPropertyAssignments();
             for (IExperimentTypeImmutable expType : experimentTypes)
             {
-                Element experimentTypeElement = getEntityTypeXML(doc, expType, "experimentType");
+                Element experimentTypeElement = getEntityTypeXML(doc, expType, "collectionType");
                 experimentTypeElement.setAttribute("description", expType.getDescription());
                 // TODO validation script?
                 experimentTypesElement.appendChild(experimentTypeElement);
@@ -286,13 +286,13 @@ public class MasterDataExtractor
     {
         if (sampleTypes.size() > 0)
         {
-            Element sampleTypesElement = doc.createElement("sampleTypes");
+            Element sampleTypesElement = doc.createElement("objectTypes");
             rootElement.appendChild(sampleTypesElement);
 
             Map<String, List<PropertyAssignment>> sampleTypeCodePropAssignmentMap = loadSampleTypesUsingV3WithPropertyAssignments();
             for (ISampleTypeImmutable sampleType : sampleTypes)
             {
-                Element sampleTypeElement = getEntityTypeXML(doc, sampleType, "sampleType");
+                Element sampleTypeElement = getEntityTypeXML(doc, sampleType, "objectType");
                 sampleTypeElement.setAttribute("description", sampleType.getDescription());
                 sampleTypeElement.setAttribute("listable", String.valueOf(sampleType.isListable()));
                 sampleTypeElement.setAttribute("showContainer", String.valueOf(sampleType.isShowContainer()));
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java
index a1dd6caab805d4de312fdfa5feeb6bdef5251b25..8a5533855cdbe8b249ecf123cfbe4074eb8b312a 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/EntitySynchronizer.java
@@ -584,7 +584,14 @@ public class EntitySynchronizer
         // delete materials
         MaterialDeletionOptions matDeletionOptions = new MaterialDeletionOptions();
         matDeletionOptions.setReason("sync materials");
-        v3Api.deleteMaterials(sessionToken, matPermIds, matDeletionOptions);
+
+        try
+        {
+            v3Api.deleteMaterials(sessionToken, matPermIds, matDeletionOptions);
+        } catch (Exception e)
+        {
+            operationLog.warn("One or more materials could not be deleted due to: " + e.getMessage());
+        }
 
         // confirm deletions
         ArrayList<IDeletionId> deletionIds = new ArrayList<IDeletionId>();
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterDataParser.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterDataParser.java
index 65fb0e249c989ccc0be68f980cb2e814e6dca9bd..30b7a11486a40940b27dec6e7c9c7a68f5633747 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterDataParser.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterDataParser.java
@@ -44,6 +44,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewETPTAssignment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewVocabulary;
@@ -59,6 +60,8 @@ public class MasterDataParser
 {
     private final INameTranslator nameTranslator;
     
+    private Map<String, FileFormatType> fileFormatTypes = new HashMap<String, FileFormatType>();
+
     private Map<String, PropertyType> propertyTypes = new HashMap<String, PropertyType>();
 
     private Map<String, SampleType> sampleTypes = new HashMap<String, SampleType>();
@@ -68,17 +71,11 @@ public class MasterDataParser
     private Map<String, ExperimentType> experimentTypes = new HashMap<String, ExperimentType>();
 
     private Map<String, MaterialType> materialTypes = new HashMap<String, MaterialType>();
-    private Map<String, NodeList> materialTypePropertyAssignmentsMap = new HashMap<String, NodeList>();
 
     private Map<String, NewVocabulary> vocabularies = new HashMap<String, NewVocabulary>();
 
     MultiKeyMap<String, List<NewETPTAssignment>> entityPropertyAssignments = new MultiKeyMap<String, List<NewETPTAssignment>>();
 
-    public Map<String, NewVocabulary> getVocabularies()
-    {
-        return vocabularies;
-    }
-
     private MasterDataParser(INameTranslator nameTranslator)
     {
         this.nameTranslator = nameTranslator;
@@ -108,12 +105,23 @@ public class MasterDataParser
             throw new XPathExpressionException("The master data resurce list should contain 1 master data element");
         }
         Element docElement = (Element) xdNode;
-        parseVocabularies(docElement.getElementsByTagName("vocabularies"));
+        parseFileFormatTypes(docElement.getElementsByTagName("fileFormatTypes"));
+        parseVocabularies(docElement.getElementsByTagName("controlledVocabularies"));
         parseMaterialTypes(docElement.getElementsByTagName("materialTypes"));
         parsePropertyTypes(docElement.getElementsByTagName("propertyTypes"));
-        parseSampleTypes(docElement.getElementsByTagName("sampleTypes"));
+        parseSampleTypes(docElement.getElementsByTagName("objectTypes"));
         parseDataSetTypes(docElement.getElementsByTagName("dataSetTypes"));
-        parseExperimentTypes(docElement.getElementsByTagName("experimentTypes"));
+        parseExperimentTypes(docElement.getElementsByTagName("collectionTypes"));
+    }
+
+    public Map<String, FileFormatType> getFileFormatTypes()
+    {
+        return fileFormatTypes;
+    }
+
+    public Map<String, NewVocabulary> getVocabularies()
+    {
+        return vocabularies;
     }
 
     public Map<String, PropertyType> getPropertyTypes()
@@ -146,28 +154,47 @@ public class MasterDataParser
         return materialTypes;
     }
 
-    private void parseVocabularies(NodeList vocabulariesNode)
+    private void parseFileFormatTypes(NodeList fileFormatTypesNode)
     {
-        if (vocabulariesNode.getLength() == 1)
+        assert fileFormatTypesNode.getLength() == 1 : "Resource List should contain a single 'fileFormatTypes' node";
+
+        Element fileFormatTypesElement = (Element) fileFormatTypesNode.item(0);
+        NodeList fileFormatTypeNodes = fileFormatTypesElement.getElementsByTagName("fileFormatType");
+
+        for (int i = 0; i < fileFormatTypeNodes.getLength(); i++)
         {
-            Element vocabsElement = (Element) vocabulariesNode.item(0);
-            NodeList vocabNodes = vocabsElement.getElementsByTagName("vocabulary");
+            Element typeElement = (Element) fileFormatTypeNodes.item(i);
+
+            FileFormatType type = new FileFormatType();
+            String code = getAttribute(typeElement, "code");
+            type.setCode(code);
+            type.setDescription(getAttribute(typeElement, "description"));
+            
+            fileFormatTypes.put(code, type);
+        }
+    }
 
-            for (int i = 0; i < vocabNodes.getLength(); i++)
-            {
-                Element vocabElement = (Element) vocabNodes.item(i);
-                String code = getAttribute(vocabElement, "code");
-
-                NewVocabulary newVocabulary = new NewVocabulary();
-                newVocabulary.setCode(code);
-                newVocabulary.setDescription(getAttribute(vocabElement, "description"));
-                newVocabulary.setURLTemplate(getAttribute(vocabElement, "urlTemplate"));
-                newVocabulary.setManagedInternally(Boolean.valueOf(getAttribute(vocabElement, "managedInternally")));
-                newVocabulary.setInternalNamespace(Boolean.valueOf(getAttribute(vocabElement, "internalNamespace")));
-                newVocabulary.setChosenFromList(Boolean.valueOf(getAttribute(vocabElement, "chosenFromList")));
-                vocabularies.put(CodeConverter.tryToBusinessLayer(newVocabulary.getCode(), newVocabulary.isInternalNamespace()), newVocabulary);
-                parseVocabularyTerms(vocabElement, newVocabulary);
-            }
+    private void parseVocabularies(NodeList vocabulariesNode)
+    {
+        assert vocabulariesNode.getLength() == 1 : "Resource List should contain a single 'controlledVocabularies' node";
+
+        Element vocabsElement = (Element) vocabulariesNode.item(0);
+        NodeList vocabNodes = vocabsElement.getElementsByTagName("controlledVocabulary");
+
+        for (int i = 0; i < vocabNodes.getLength(); i++)
+        {
+            Element vocabElement = (Element) vocabNodes.item(i);
+            String code = getAttribute(vocabElement, "code");
+
+            NewVocabulary newVocabulary = new NewVocabulary();
+            newVocabulary.setCode(code);
+            newVocabulary.setDescription(getAttribute(vocabElement, "description"));
+            newVocabulary.setURLTemplate(getAttribute(vocabElement, "urlTemplate"));
+            newVocabulary.setManagedInternally(Boolean.valueOf(getAttribute(vocabElement, "managedInternally")));
+            newVocabulary.setInternalNamespace(Boolean.valueOf(getAttribute(vocabElement, "internalNamespace")));
+            newVocabulary.setChosenFromList(Boolean.valueOf(getAttribute(vocabElement, "chosenFromList")));
+            vocabularies.put(CodeConverter.tryToBusinessLayer(newVocabulary.getCode(), newVocabulary.isInternalNamespace()), newVocabulary);
+            parseVocabularyTerms(vocabElement, newVocabulary);
         }
     }
 
@@ -194,172 +221,166 @@ public class MasterDataParser
 
     private void parseMaterialTypes(NodeList matTypesNode)
     {
-        if (matTypesNode.getLength() == 1)
+        assert matTypesNode.getLength() == 1 : "Resource List should contain a single 'materialTypes' node";
+
+        Element matTypesElement = (Element) matTypesNode.item(0);
+        NodeList matTypeNodes = matTypesElement.getElementsByTagName("materialType");
+        for (int i = 0; i < matTypeNodes.getLength(); i++)
         {
-            Element matTypesElement = (Element) matTypesNode.item(0);
-            NodeList matTypeNodes = matTypesElement.getElementsByTagName("materialType");
-            for (int i = 0; i < matTypeNodes.getLength(); i++)
-            {
-                Element materialTypeElement = (Element) matTypeNodes.item(i);
-                MaterialType materialType = new MaterialType();
-                materialType.setCode(getAttribute(materialTypeElement, "code"));
-                materialType.setDescription(getAttribute(materialTypeElement, "description"));
-                materialTypes.put(materialType.getCode(), materialType);
+            Element materialTypeElement = (Element) matTypeNodes.item(i);
+            MaterialType materialType = new MaterialType();
+            materialType.setCode(getAttribute(materialTypeElement, "code"));
+            materialType.setDescription(getAttribute(materialTypeElement, "description"));
+            materialTypes.put(materialType.getCode(), materialType);
 
-                parsePropertyAssignments(EntityKind.MATERIAL, materialType, materialTypeElement.getElementsByTagName("propertyAssignments"));
-            }
+            parsePropertyAssignments(EntityKind.MATERIAL, materialType, materialTypeElement.getElementsByTagName("propertyAssignments"));
         }
     }
 
     private void parseExperimentTypes(NodeList expTypesNode)
     {
-        if (expTypesNode.getLength() == 1)
+        assert expTypesNode.getLength() == 1 : "Resource List should contain a single 'collectionTypes' node";
+
+        Element expTypesElement = (Element) expTypesNode.item(0);
+        NodeList expTypeNodes = expTypesElement.getElementsByTagName("collectionType");
+        for (int i = 0; i < expTypeNodes.getLength(); i++)
         {
-            Element expTypesElement = (Element) expTypesNode.item(0);
-            NodeList expTypeNodes = expTypesElement.getElementsByTagName("experimentType");
-            for (int i = 0; i < expTypeNodes.getLength(); i++)
-            {
-                Element expTypeElement = (Element) expTypeNodes.item(i);
-                String code = getAttribute(expTypeElement, "code");
-                ExperimentType expType = new ExperimentType();
-                expType.setCode(code);
-                expType.setDescription(getAttribute(expTypeElement, "description"));
-                experimentTypes.put(expType.getCode(), expType);
-
-                parsePropertyAssignments(EntityKind.EXPERIMENT, expType, expTypeElement.getElementsByTagName("propertyAssignments"));
-            }
+            Element expTypeElement = (Element) expTypeNodes.item(i);
+            String code = getAttribute(expTypeElement, "code");
+            ExperimentType expType = new ExperimentType();
+            expType.setCode(code);
+            expType.setDescription(getAttribute(expTypeElement, "description"));
+            experimentTypes.put(expType.getCode(), expType);
+
+            parsePropertyAssignments(EntityKind.EXPERIMENT, expType, expTypeElement.getElementsByTagName("propertyAssignments"));
         }
     }
 
     private void parseSampleTypes(NodeList sampleTypesNode)
     {
-        if (sampleTypesNode.getLength() == 1)
+        assert sampleTypesNode.getLength() == 1 : "Resource List should contain a single 'objectTypes' node";
+
+        Element sampleTypesElement = (Element) sampleTypesNode.item(0);
+        NodeList sampleTypeNodes = sampleTypesElement.getElementsByTagName("objectType");
+        for (int i = 0; i < sampleTypeNodes.getLength(); i++)
         {
-            Element sampleTypesElement = (Element) sampleTypesNode.item(0);
-            NodeList sampleTypeNodes = sampleTypesElement.getElementsByTagName("sampleType");
-            for (int i = 0; i < sampleTypeNodes.getLength(); i++)
-            {
-                Element sampleTypeElement = (Element) sampleTypeNodes.item(i);
-                SampleType sampleType = new SampleType();
-                sampleType.setCode(getAttribute(sampleTypeElement, "code"));
-                sampleType.setDescription(getAttribute(sampleTypeElement, "description"));
-                sampleType.setListable(Boolean.valueOf(getAttribute(sampleTypeElement, "listable")));
-                sampleType.setShowContainer(Boolean.valueOf(getAttribute(sampleTypeElement, "showContainer")));
-                sampleType.setShowParents(Boolean.valueOf(getAttribute(sampleTypeElement, "showParents")));
-                sampleType.setShowParentMetadata(Boolean.valueOf(getAttribute(sampleTypeElement, "showParentMetadata")));
-                sampleType.setSubcodeUnique(Boolean.valueOf(getAttribute(sampleTypeElement, "subcodeUnique")));
-                sampleType.setAutoGeneratedCode(Boolean.valueOf(getAttribute(sampleTypeElement, "autoGeneratedCode")));
-                sampleType.setGeneratedCodePrefix(getAttribute(sampleTypeElement, "generatedCodePrefix"));
-                sampleTypes.put(sampleType.getCode(), sampleType);
-
-                parsePropertyAssignments(EntityKind.SAMPLE, sampleType, sampleTypeElement.getElementsByTagName("propertyAssignments"));
-            }
+            Element sampleTypeElement = (Element) sampleTypeNodes.item(i);
+            SampleType sampleType = new SampleType();
+            sampleType.setCode(getAttribute(sampleTypeElement, "code"));
+            sampleType.setDescription(getAttribute(sampleTypeElement, "description"));
+            sampleType.setListable(Boolean.valueOf(getAttribute(sampleTypeElement, "listable")));
+            sampleType.setShowContainer(Boolean.valueOf(getAttribute(sampleTypeElement, "showContainer")));
+            sampleType.setShowParents(Boolean.valueOf(getAttribute(sampleTypeElement, "showParents")));
+            sampleType.setShowParentMetadata(Boolean.valueOf(getAttribute(sampleTypeElement, "showParentMetadata")));
+            sampleType.setSubcodeUnique(Boolean.valueOf(getAttribute(sampleTypeElement, "subcodeUnique")));
+            sampleType.setAutoGeneratedCode(Boolean.valueOf(getAttribute(sampleTypeElement, "autoGeneratedCode")));
+            sampleType.setGeneratedCodePrefix(getAttribute(sampleTypeElement, "generatedCodePrefix"));
+            sampleTypes.put(sampleType.getCode(), sampleType);
+
+            parsePropertyAssignments(EntityKind.SAMPLE, sampleType, sampleTypeElement.getElementsByTagName("propertyAssignments"));
         }
     }
 
     private void parseDataSetTypes(NodeList dataSetTypesNode)
     {
-        if (dataSetTypesNode.getLength() == 1)
+        assert dataSetTypesNode.getLength() == 1 : "Resource List should contain a single 'dataSetTypes' node";
+
+        Element dataSetTypesElement = (Element) dataSetTypesNode.item(0);
+        NodeList dataSetTypeNodes = dataSetTypesElement.getElementsByTagName("dataSetType");
+        for (int i = 0; i < dataSetTypeNodes.getLength(); i++)
         {
-            Element dataSetTypesElement = (Element) dataSetTypesNode.item(0);
-            NodeList dataSetTypeNodes = dataSetTypesElement.getElementsByTagName("dataSetType");
-            for (int i = 0; i < dataSetTypeNodes.getLength(); i++)
+            Element dataSetTypeElement = (Element) dataSetTypeNodes.item(i);
+            String code = getAttribute(dataSetTypeElement, "code");
+            DataSetType dataSetType = new DataSetType();
+            dataSetType.setCode(code);
+            dataSetType.setDescription(getAttribute(dataSetTypeElement, "description"));
+            dataSetType.setDataSetKind(DataSetKind.valueOf(getAttribute(dataSetTypeElement, "dataSetKind")));
+            String mainDataSetPattern = getAttribute(dataSetTypeElement, "mainDataSetPattern");
+            if (mainDataSetPattern.length() < 1)
             {
-                Element dataSetTypeElement = (Element) dataSetTypeNodes.item(i);
-                String code = getAttribute(dataSetTypeElement, "code");
-                DataSetType dataSetType = new DataSetType();
-                dataSetType.setCode(code);
-                dataSetType.setDescription(getAttribute(dataSetTypeElement, "description"));
-                dataSetType.setDataSetKind(DataSetKind.valueOf(getAttribute(dataSetTypeElement, "dataSetKind")));
-                String mainDataSetPattern = getAttribute(dataSetTypeElement, "mainDataSetPattern");
-                if (mainDataSetPattern.length() < 1)
-                {
-                    dataSetType.setMainDataSetPattern(null);
-                }
-                else
-                {
-                    dataSetType.setMainDataSetPattern(mainDataSetPattern);
-                }
-                if (mainDataSetPattern.length() < 1)
-                {
-                    dataSetType.setMainDataSetPath(null);
-                }
-                else
-                {
-                    dataSetType.setMainDataSetPath(mainDataSetPattern);
-                }
-                dataSetType.setDeletionDisallow(Boolean.valueOf(getAttribute(dataSetTypeElement, "deletionDisallowed")));
-                dataSetTypes.put(dataSetType.getCode(), dataSetType);
-
-                parsePropertyAssignments(EntityKind.DATA_SET, dataSetType, dataSetTypeElement.getElementsByTagName("propertyAssignments"));
+                dataSetType.setMainDataSetPattern(null);
             }
+            else
+            {
+                dataSetType.setMainDataSetPattern(mainDataSetPattern);
+            }
+            if (mainDataSetPattern.length() < 1)
+            {
+                dataSetType.setMainDataSetPath(null);
+            }
+            else
+            {
+                dataSetType.setMainDataSetPath(mainDataSetPattern);
+            }
+            dataSetType.setDeletionDisallow(Boolean.valueOf(getAttribute(dataSetTypeElement, "deletionDisallowed")));
+            dataSetTypes.put(dataSetType.getCode(), dataSetType);
+
+            parsePropertyAssignments(EntityKind.DATA_SET, dataSetType, dataSetTypeElement.getElementsByTagName("propertyAssignments"));
         }
     }
 
     private void parsePropertyAssignments(EntityKind entityKind, EntityType entityType, NodeList propertyAssignmentsNode)
     {
-        if (propertyAssignmentsNode.getLength() == 1)
+        assert propertyAssignmentsNode.getLength() == 1 : "Resource List should contain a single property assignments node";
+
+        List<NewETPTAssignment> list = new ArrayList<NewETPTAssignment>();
+        Element propertyAssignmentsElement = (Element) propertyAssignmentsNode.item(0);
+        NodeList propertyAssignmentNodes = propertyAssignmentsElement.getElementsByTagName("propertyAssignment");
+        for (int i = 0; i < propertyAssignmentNodes.getLength(); i++)
         {
-            List<NewETPTAssignment> list = new ArrayList<NewETPTAssignment>();
-            Element propertyAssignmentsElement = (Element) propertyAssignmentsNode.item(0);
-            NodeList propertyAssignmentNodes = propertyAssignmentsElement.getElementsByTagName("propertyAssignment");
-            for (int i = 0; i < propertyAssignmentNodes.getLength(); i++)
-            {
-                Element propertyAssignmentElement = (Element) propertyAssignmentNodes.item(i);
-                String propertyTypeCode = getAttribute(propertyAssignmentElement, "property_type_code");
-                NewETPTAssignment assignment = new NewETPTAssignment();
-                assignment.setPropertyTypeCode(propertyTypeCode);
-                assignment.setEntityKind(entityType.getEntityKind());
-                assignment.setEntityTypeCode(entityType.getCode());
-                assignment.setMandatory(Boolean.valueOf(getAttribute(propertyAssignmentElement, "mandatory")));
-                assignment.setDefaultValue(ERROR_PROPERTY_PREFIX);
-                assignment.setSection(getAttribute(propertyAssignmentElement, "section"));
-                assignment.setOrdinal(Long.valueOf(getAttribute(propertyAssignmentElement, "ordinal")));
-                assignment.setShownInEditView(Boolean.valueOf(getAttribute(propertyAssignmentElement, "showInEdit")));
-                list.add(assignment);
-            }
-            entityPropertyAssignments.put(entityType.getEntityKind().name(), entityType.getCode(), list);
+            Element propertyAssignmentElement = (Element) propertyAssignmentNodes.item(i);
+            String propertyTypeCode = getAttribute(propertyAssignmentElement, "propertyTypeCode");
+            NewETPTAssignment assignment = new NewETPTAssignment();
+            assignment.setPropertyTypeCode(propertyTypeCode);
+            assignment.setEntityKind(entityType.getEntityKind());
+            assignment.setEntityTypeCode(entityType.getCode());
+            assignment.setMandatory(Boolean.valueOf(getAttribute(propertyAssignmentElement, "mandatory")));
+            assignment.setDefaultValue(ERROR_PROPERTY_PREFIX);
+            assignment.setSection(getAttribute(propertyAssignmentElement, "section"));
+            assignment.setOrdinal(Long.valueOf(getAttribute(propertyAssignmentElement, "ordinal")));
+            assignment.setShownInEditView(Boolean.valueOf(getAttribute(propertyAssignmentElement, "showInEdit")));
+            list.add(assignment);
         }
+        entityPropertyAssignments.put(entityType.getEntityKind().name(), entityType.getCode(), list);
     }
 
     private void parsePropertyTypes(NodeList propertyTypesNode)
     {
-        if (propertyTypesNode.getLength() == 1)
+        assert propertyTypesNode.getLength() == 1 : "Resource List should contain a single 'propertyTypes' node";
+
+        Element propertyTypesElement = (Element) propertyTypesNode.item(0);
+        NodeList propertyTypeNodes = propertyTypesElement.getElementsByTagName("propertyType");
+        for (int i = 0; i < propertyTypeNodes.getLength(); i++)
         {
-            Element propertyTypesElement = (Element) propertyTypesNode.item(0);
-            NodeList propertyTypeNodes = propertyTypesElement.getElementsByTagName("propertyType");
-            for (int i = 0; i < propertyTypeNodes.getLength(); i++)
+            Element propertyTypeElement = (Element) propertyTypeNodes.item(i);
+            PropertyType newPropertyType = new PropertyType();
+
+            String code = getAttribute(propertyTypeElement, "code");
+            newPropertyType.setLabel(getAttribute(propertyTypeElement, "label"));
+            DataTypeCode dataTypeCode = DataTypeCode.valueOf(getAttribute(propertyTypeElement, "dataType"));
+            newPropertyType.setDataType(new DataType(dataTypeCode));
+            newPropertyType.setDescription(getAttribute(propertyTypeElement, "description"));
+            newPropertyType.setManagedInternally(Boolean.valueOf(getAttribute(propertyTypeElement, "managedInternally")));
+            newPropertyType.setInternalNamespace(Boolean.valueOf(getAttribute(propertyTypeElement, "internalNamespace")));
+            newPropertyType.setCode(CodeConverter.tryToBusinessLayer(code, newPropertyType.isInternalNamespace()));
+
+            propertyTypes.put(newPropertyType.getCode(), newPropertyType);
+            if (dataTypeCode.equals(DataTypeCode.CONTROLLEDVOCABULARY))
             {
-                Element propertyTypeElement = (Element) propertyTypeNodes.item(i);
-                PropertyType newPropertyType =  new PropertyType();
-                
-                String code = getAttribute(propertyTypeElement, "code");
-                newPropertyType.setLabel(getAttribute(propertyTypeElement, "label"));
-                DataTypeCode dataTypeCode = DataTypeCode.valueOf(getAttribute(propertyTypeElement, "dataType"));
-                newPropertyType.setDataType(new DataType(dataTypeCode));
-                newPropertyType.setDescription(getAttribute(propertyTypeElement, "description"));
-                newPropertyType.setManagedInternally(Boolean.valueOf(getAttribute(propertyTypeElement, "managedInternally")));
-                newPropertyType.setInternalNamespace(Boolean.valueOf(getAttribute(propertyTypeElement, "internalNamespace")));
-                newPropertyType.setCode(CodeConverter.tryToBusinessLayer(code, newPropertyType.isInternalNamespace()));
-
-                propertyTypes.put(newPropertyType.getCode(), newPropertyType);
-                if (dataTypeCode.equals(DataTypeCode.CONTROLLEDVOCABULARY))
+                String vocabularyCode = getAttribute(propertyTypeElement, "vocabulary");
+                newPropertyType.setVocabulary(vocabularies.get(vocabularyCode));
+            }
+            else if (dataTypeCode.equals(DataTypeCode.MATERIAL))
+            {
+                String materialCode = getAttribute(propertyTypeElement, "material");
+                if (materialCode.trim().length() < 1)
                 {
-                    String vocabularyCode = getAttribute(propertyTypeElement, "vocabulary");
-                    newPropertyType.setVocabulary(vocabularies.get(vocabularyCode));
+                    newPropertyType.setMaterialType(null); // material of any type
                 }
-                else if (dataTypeCode.equals(DataTypeCode.MATERIAL))
+                else
                 {
-                    String materialCode = getAttribute(propertyTypeElement, "material");
-                    if (materialCode.trim().length() < 1)
-                    {
-                        newPropertyType.setMaterialType(null); // material of any type
-                    }
-                    else
-                    {
-                        newPropertyType.setMaterialType(materialTypes.get(materialCode));
-                    }
-              }
+                    newPropertyType.setMaterialType(materialTypes.get(materialCode));
+                }
             }
         }
     }
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterDataSynchronizer.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterDataSynchronizer.java
index 3bd0f9d96c04b71caf60f1161a853ec7bf22d754..5aa900f229c7d0bdcc587a73afcce6c5b92ab8ed 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterDataSynchronizer.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterDataSynchronizer.java
@@ -35,6 +35,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewETPTAssignment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewVocabulary;
@@ -69,6 +70,7 @@ public class MasterDataSynchronizer
     
     public void synchronizeMasterData() {
         MultiKeyMap<String, List<NewETPTAssignment>> propertyAssignmentsToProcess = masterData.getPropertyAssignmentsToProcess();
+        processFileFormatTypes(masterData.getFileFormatTypesToProcess());
         processVocabularies(masterData.getVocabulariesToProcess());
         // materials are registered but their property assignments are deferred until after property types are processed
         processEntityTypes(masterData.getMaterialTypesToProcess(), propertyAssignmentsToProcess);
@@ -102,6 +104,31 @@ public class MasterDataSynchronizer
         }
     }
     
+    private void processFileFormatTypes(Map<String, FileFormatType> fileFormatTypesToProcess)
+    {
+        List<FileFormatType> fileFormatTypes = commonServer.listFileFormatTypes(sessionToken);
+        Map<String, FileFormatType> typeMap = new HashMap<String, FileFormatType>();
+        for (FileFormatType type : fileFormatTypes)
+        {
+            typeMap.put(type.getCode(), type);
+        }
+
+        for (String typeCode : fileFormatTypesToProcess.keySet())
+        {
+            FileFormatType incomingType = fileFormatTypesToProcess.get(typeCode);
+            FileFormatType existingTypeOrNull = typeMap.get(typeCode);
+            if (existingTypeOrNull != null)
+            {
+                existingTypeOrNull.setDescription(incomingType.getDescription());
+                commonServer.updateFileFormatType(sessionToken, existingTypeOrNull);
+            }
+            else
+            {
+                commonServer.registerFileFormatType(sessionToken, incomingType);
+            }
+        }
+    }
+
     private void processVocabularies(Map<String, NewVocabulary> vocabulariesToProcess)
     {
         List<Vocabulary> existingVocabularies = commonServer.listVocabularies(sessionToken, true, false);
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/ResourceListParser.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/ResourceListParser.java
index f846888e5d87f4d7eab7e57111ba21dac48cab1e..f25c3eed3734e7a56ed9ad1a15733a645047abbe 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/ResourceListParser.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/ResourceListParser.java
@@ -192,6 +192,7 @@ public class ResourceListParser
         MasterDataParser mdParser = MasterDataParser.create(nameTranslator);
         mdParser.parseMasterData(doc, xpath, uri);
         MasterData masterData = data.getMasterData();
+        masterData.setFileFormatTypesToProcess(mdParser.getFileFormatTypes());
         masterData.setVocabulariesToProcess(mdParser.getVocabularies());
         masterData.setPropertyTypesToProcess(mdParser.getPropertyTypes());
         masterData.setSampleTypesToProcess(mdParser.getSampleTypes());
diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/ResourceListParserData.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/ResourceListParserData.java
index 165f5585263fd4eb337b825bb58c9f19faa1b52f..7f383e89f6c20073b1fd0c606707007083c5eb0b 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/ResourceListParserData.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/ResourceListParserData.java
@@ -29,6 +29,7 @@ import org.apache.commons.collections.map.MultiKeyMap;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSetKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewETPTAssignment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
@@ -307,6 +308,8 @@ public class ResourceListParserData
 
     class MasterData
     {
+        private Map<String, FileFormatType> fileFormatTypesToProcess = new HashMap<String, FileFormatType>();
+
         private Map<String, NewVocabulary> vocabulariesToProcess = new HashMap<String, NewVocabulary>();
 
         private Map<String, PropertyType> propertyTypesToProcess = new HashMap<String, PropertyType>();
@@ -356,6 +359,16 @@ public class ResourceListParserData
             return vocabulariesToProcess;
         }
 
+        public Map<String, FileFormatType> getFileFormatTypesToProcess()
+        {
+            return fileFormatTypesToProcess;
+        }
+
+        public void setFileFormatTypesToProcess(Map<String, FileFormatType> fileFormatTypesToProcess)
+        {
+            this.fileFormatTypesToProcess = fileFormatTypesToProcess;
+        }
+
         public void setVocabulariesToProcess(Map<String, NewVocabulary> vocabulariesToProcess)
         {
             this.vocabulariesToProcess = vocabulariesToProcess;