diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterData.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterData.java
index fc7822dd1274b760bb7baf988700e6982b3c2914..3758d566d3d054c35226c85dcd7c9f3321b43d74 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterData.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/sync/harvester/synchronizer/MasterData.java
@@ -22,6 +22,7 @@ import java.util.Map;
 
 import org.apache.commons.collections4.map.MultiKeyMap;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.ExternalDms;
 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;
@@ -36,6 +37,8 @@ class MasterData
 {
     private Map<String, FileFormatType> fileFormatTypesToProcess = new HashMap<String, FileFormatType>();
 
+    private Map<String, ExternalDms> externalDataManagementSystemsToProcess = new HashMap<>();
+
     private Map<String, Script> validationPluginsToProcess = new HashMap<String, Script>();
 
     private Map<String, NewVocabulary> vocabulariesToProcess = new HashMap<String, NewVocabulary>();
@@ -107,6 +110,16 @@ class MasterData
         this.fileFormatTypesToProcess = fileFormatTypesToProcess;
     }
 
+    public Map<String, ExternalDms> getExternalDataManagementSystemsToProcess()
+    {
+        return externalDataManagementSystemsToProcess;
+    }
+
+    public void setExternalDataManagementSystemsToProcess(Map<String, ExternalDms> edmsToProcess)
+    {
+        this.externalDataManagementSystemsToProcess = edmsToProcess;
+    }
+
     public void setVocabulariesToProcess(Map<String, NewVocabulary> vocabulariesToProcess)
     {
         this.vocabulariesToProcess = vocabulariesToProcess;
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 58dd1b31517b223581b2959ed845fe455d727324..457de8e9e01de6eb56079c10e56c84d46d7d4a8a 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
@@ -35,6 +35,8 @@ import org.w3c.dom.Element;
 import org.w3c.dom.Node;
 import org.w3c.dom.NodeList;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.ExternalDms;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.ExternalDmsAddressType;
 import ch.ethz.sis.openbis.generic.server.dss.plugins.sync.harvester.synchronizer.translator.DefaultNameTranslator;
 import ch.ethz.sis.openbis.generic.server.dss.plugins.sync.harvester.synchronizer.translator.INameTranslator;
 import ch.systemsx.cisd.openbis.generic.shared.basic.CodeConverter;
@@ -65,6 +67,7 @@ public class MasterDataParser
     
     private Map<String, Script> validationPlugins = new HashMap<String, Script>();
 
+    private Map<String, ExternalDms> externalDataManagementSystems = new HashMap<>();
     private Map<String, FileFormatType> fileFormatTypes = new HashMap<String, FileFormatType>();
 
     private Map<String, PropertyType> propertyTypes = new HashMap<String, PropertyType>();
@@ -122,6 +125,7 @@ public class MasterDataParser
         parseSampleTypes(docElement.getElementsByTagName("xmd:objectTypes"));
         parseDataSetTypes(docElement.getElementsByTagName("xmd:dataSetTypes"));
         parseExperimentTypes(docElement.getElementsByTagName("xmd:collectionTypes"));
+        parseExternalDataManagementSystems(docElement.getElementsByTagName("xml:externalDataManagementSystems"));
     }
 
 
@@ -170,6 +174,11 @@ public class MasterDataParser
         return materialTypes;
     }
 
+    public Map<String, ExternalDms> getExternalDataManagementSystems()
+    {
+        return externalDataManagementSystems;
+    }
+
     private void parseValidationPlugins(NodeList validationPluginsNode) throws XPathExpressionException
     {
         if (validationPluginsNode.getLength() == 0)
@@ -196,6 +205,29 @@ public class MasterDataParser
         }
     }
 
+    private void parseExternalDataManagementSystems(NodeList edmsNode) throws XPathExpressionException
+    {
+        if (edmsNode.getLength() == 0)
+        {
+            return;
+        }
+        validateElementNode(edmsNode, "externalDataManagementSystems");
+
+        NodeList edmsNodes = ((Element) edmsNode.item(0)).getElementsByTagName("xmd:externalDataManagementSystem");
+
+        for (int i = 0; i < edmsNodes.getLength(); i++)
+        {
+            Element element = (Element) edmsNodes.item(i);
+            ExternalDms edms = new ExternalDms();
+            String code = getAttribute(element, "code");
+            edms.setCode(code);
+            edms.setLabel(getAttribute(element, "label"));
+            edms.setAddressType(ExternalDmsAddressType.valueOf(getAttribute(element, "addressType")));
+            edms.setAddress(getAttribute(element, "address"));
+            externalDataManagementSystems.put(code, edms);
+        }
+    }
+
     private void parseFileFormatTypes(NodeList fileFormatTypesNode) throws XPathExpressionException
     {
         if (fileFormatTypesNode.getLength() == 0)
@@ -203,14 +235,14 @@ public class MasterDataParser
             return;
         }
         validateElementNode(fileFormatTypesNode, "fileFormatTypes");
-
+        
         Element fileFormatTypesElement = (Element) fileFormatTypesNode.item(0);
         NodeList fileFormatTypeNodes = fileFormatTypesElement.getElementsByTagName("xmd:fileFormatType");
-
+        
         for (int i = 0; i < fileFormatTypeNodes.getLength(); i++)
         {
             Element typeElement = (Element) fileFormatTypeNodes.item(i);
-
+            
             FileFormatType type = new FileFormatType();
             String code = getAttribute(typeElement, "code");
             type.setCode(code);
@@ -219,7 +251,7 @@ public class MasterDataParser
             fileFormatTypes.put(code, type);
         }
     }
-
+    
     private void validateElementNode(NodeList nodeList, String tagName) throws XPathExpressionException
     {
         if (nodeList.getLength() != 1)
@@ -257,7 +289,7 @@ public class MasterDataParser
 
     private void parseVocabularyTerms(Element vocabElement, NewVocabulary newVocabulary)
     {
-        NodeList termNodes = vocabElement.getElementsByTagName("term");
+        NodeList termNodes = vocabElement.getElementsByTagName("xmd:term");
         for (int i = 0; i < termNodes.getLength(); i++)
         {
             Element termElement = (Element) termNodes.item(i);
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 136c2475e356b0ea43dc555b5b9580ec9cef89d6..80b5b1c37d5d65c0dce72b213ec734104226c9e6 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
@@ -25,6 +25,7 @@ import java.util.Map;
 import org.apache.commons.collections4.map.MultiKeyMap;
 import org.apache.log4j.Logger;
 
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.ExternalDms;
 import ch.ethz.sis.openbis.generic.server.dss.plugins.sync.common.ServiceFinderUtils;
 import ch.ethz.sis.openbis.generic.server.dss.plugins.sync.harvester.synchronizer.util.Monitor;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
@@ -96,6 +97,8 @@ public class MasterDataSynchronizer
         processEntityTypes(masterData.getExperimentTypesToProcess(), propertyAssignmentsToProcess);
         monitor.log("process material type property assignments");
         processDeferredMaterialTypePropertyAssignments(propertyAssignmentsToProcess);
+        monitor.log("process external data management systems");
+        processExternalDataManagementSystems(masterData.getExternalDataManagementSystemsToProcess());
 
         synchronizerFacade.printSummary();
     }
@@ -149,6 +152,11 @@ public class MasterDataSynchronizer
         }
     }
 
+    private void processExternalDataManagementSystems(Map<String, ExternalDms> externalDataManagementSystems)
+    {
+        // TODO
+    }
+
     private void processFileFormatTypes(Map<String, FileFormatType> fileFormatTypesToProcess)
     {
         List<FileFormatType> fileFormatTypes = commonServer.listFileFormatTypes(sessionToken);
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 4eeb57a876438b6d7574262dc3a48443103d03d8..afab0a07c088d7074e13c22e7528486805846bd2 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
@@ -235,7 +235,7 @@ public class ResourceListParser
         masterData.setExperimentTypesToProcess(mdParser.getExperimentTypes());
         masterData.setMaterialTypesToProcess(mdParser.getMaterialTypes());
         masterData.setPropertyAssignmentsToProcess(mdParser.getEntityPropertyAssignments());
-//        masterData.setExternalDataManagementSystemsToProcess(mdParser.getExternalDataManagementSystems());
+        masterData.setExternalDataManagementSystemsToProcess(mdParser.getExternalDataManagementSystems());
     }
 
     private void parseMetaData(String uri, Date lastModificationDate, Node xdNode) throws XPathExpressionException