diff --git a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/harvester/synchronizer/MasterDataParser.java b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/harvester/synchronizer/MasterDataParser.java
index 88f422af2f5c31ebb54808d8340386d0cfdd8f7f..12cc343809016a1a32fa4513b94159216b8b6692 100644
--- a/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/harvester/synchronizer/MasterDataParser.java
+++ b/datastore_server/source/java/ch/ethz/sis/openbis/generic/server/dss/plugins/harvester/synchronizer/MasterDataParser.java
@@ -35,6 +35,7 @@ import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.IPropertyAssignment
 import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.IPropertyType;
 import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.ISampleType;
 import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.IVocabulary;
+import ch.systemsx.cisd.openbis.generic.server.jython.api.v1.IVocabularyTerm;
 
 /**
  * 
@@ -82,11 +83,16 @@ public class MasterDataParser
             for (int i = 0; i < vocabNodes.getLength(); i++)
             {
                 Element vocabElement = (Element) vocabNodes.item(i);
-                String code = vocabElement.getAttributes().getNamedItem("code").getTextContent();
+                String code = getAttribute(vocabElement, "code");
                 if (code.startsWith("$"))
                     continue;
                 //TODO complete other attributes
                 IVocabulary newVocabulary = masterDataRegistrationTransaction.getOrCreateNewVocabulary(code);
+                newVocabulary.setDescription(getAttribute(vocabElement, "description"));
+                newVocabulary.setUrlTemplate(getAttribute(vocabElement, "urlTemplate"));
+                newVocabulary.setInternalNamespace(Boolean.valueOf(getAttribute(vocabElement, "internalNamespace")));
+                newVocabulary.setManagedInternally(Boolean.valueOf(getAttribute(vocabElement, "managedInternally")));
+                newVocabulary.setChosenFromList(Boolean.valueOf(getAttribute(vocabElement, "chosenFromList")));
                 vocabularyMap.put(code, newVocabulary);
                 parseVocabularyTerms(vocabElement, newVocabulary);
             }
@@ -99,12 +105,21 @@ public class MasterDataParser
         for (int i = 0; i < termNodes.getLength(); i++)
         {
             Element termElement = (Element) termNodes.item(i);
-            // TODO set other attributes
-            String code = termElement.getAttributes().getNamedItem("code").getTextContent();
-            newVocabulary.addTerm(masterDataRegistrationTransaction.createNewVocabularyTerm(code));
+            String code = getAttribute(termElement, "code");
+            IVocabularyTerm newVocabularyTerm = masterDataRegistrationTransaction.createNewVocabularyTerm(code);
+            newVocabularyTerm.setLabel(getAttribute(termElement, "label"));
+            newVocabularyTerm.setDescription(getAttribute(termElement, "description"));
+            newVocabularyTerm.setOrdinal(Long.valueOf(getAttribute(termElement, "ordinal")));
+            // TODO setUrl?
+            newVocabulary.addTerm(newVocabularyTerm);
         }
     }
 
+    private String getAttribute(Element termElement, String attr)
+    {
+        return termElement.getAttributes().getNamedItem(attr).getTextContent();
+    }
+
     private void parseSampleTypes(NodeList sampleTypesNode)
     {
         if (sampleTypesNode.getLength() == 1)
@@ -114,7 +129,7 @@ public class MasterDataParser
             for (int i = 0; i < sampleTypeNodes.getLength(); i++)
             {
                 Element sampleTypeElement = (Element) sampleTypeNodes.item(i);
-                String code = sampleTypeElement.getAttributes().getNamedItem("code").getTextContent();
+                String code = getAttribute(sampleTypeElement, "code");
                 ISampleType newSampleType = masterDataRegistrationTransaction.getOrCreateNewSampleType(code);
                 newSampleType.setGeneratedCodePrefix("S");
 
@@ -133,18 +148,20 @@ public class MasterDataParser
             {
                 Element propertyAssignmentElement = (Element) propertyAssignmentNodes.item(i);
                 // TODO set other attributes
-                String property_type_code = propertyAssignmentElement.getAttributes().getNamedItem("property_type_code").getTextContent();
-                String data_type_code = propertyAssignmentElement.getAttributes().getNamedItem("data_type_code").getTextContent();
+                String property_type_code = getAttribute(propertyAssignmentElement, "property_type_code");
+                String data_type_code = getAttribute(propertyAssignmentElement, "data_type_code");
                 if (property_type_code.startsWith("$"))
                     continue;
-                boolean mandatory = Boolean.valueOf(propertyAssignmentElement.getAttributes().getNamedItem("mandatory").getTextContent());
-                int ordinal = Integer.valueOf(propertyAssignmentElement.getAttributes().getNamedItem("ordinal").getTextContent());
+                boolean mandatory = Boolean.valueOf(getAttribute(propertyAssignmentElement, "mandatory"));
+                long ordinal = Long.valueOf(getAttribute(propertyAssignmentElement, "ordinal"));
+                String section = getAttribute(propertyAssignmentElement, "section");
 
                 if (propertyTypeMap.get(property_type_code) != null)
                 {
                     IPropertyAssignment assignment =
                             masterDataRegistrationTransaction.assignPropertyType(newSampleType, propertyTypeMap.get(property_type_code));
                     assignment.setMandatory(mandatory);
+                    assignment.setSection(section);
                 }
             }
         }
@@ -159,15 +176,15 @@ public class MasterDataParser
             for (int i = 0; i < propertyTypeNodes.getLength(); i++)
             {
                 Element propertyTypeElement = (Element) propertyTypeNodes.item(i);
-                String code = propertyTypeElement.getAttributes().getNamedItem("code").getTextContent();
+                String code = getAttribute(propertyTypeElement, "code");
                 // TODO handle internal properties
                 if (code.startsWith("$"))
                     continue;
-                String label = propertyTypeElement.getAttributes().getNamedItem("label").getTextContent();
-                String dataType = propertyTypeElement.getAttributes().getNamedItem("dataType").getTextContent();
-                String description = propertyTypeElement.getAttributes().getNamedItem("description").getTextContent();
-                boolean internalNamespace = Boolean.valueOf(propertyTypeElement.getAttributes().getNamedItem("internalNamespace").getTextContent());
-                boolean managedInternally = Boolean.valueOf(propertyTypeElement.getAttributes().getNamedItem("managedInternally").getTextContent());
+                String label = getAttribute(propertyTypeElement, "label");
+                String dataType = getAttribute(propertyTypeElement, "dataType");
+                String description = getAttribute(propertyTypeElement, "description");
+                boolean internalNamespace = Boolean.valueOf(getAttribute(propertyTypeElement, "internalNamespace"));
+                boolean managedInternally = Boolean.valueOf(getAttribute(propertyTypeElement, "managedInternally"));
                 String vocabulary = null;
                 Node namedItem = propertyTypeElement.getAttributes().getNamedItem("vocabulary");
                 if (namedItem != null)