diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/AbstractDataSetRegistrationDetailsFactory.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/AbstractDataSetRegistrationDetailsFactory.java
index 5bb10d89d619db507766ffcbaf56317215136c1f..c3d0ed6af6b144ced12bda20de56eaa938061eb6 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/AbstractDataSetRegistrationDetailsFactory.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/AbstractDataSetRegistrationDetailsFactory.java
@@ -21,6 +21,7 @@ import java.util.List;
 
 import ch.systemsx.cisd.etlserver.registrator.AbstractOmniscientTopLevelDataSetRegistrator.OmniscientTopLevelDataSetRegistratorState;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.impl.DataSet;
+import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty;
@@ -71,7 +72,8 @@ public abstract class AbstractDataSetRegistrationDetailsFactory<T extends DataSe
     public DataSet<T> createDataSet(DataSetRegistrationDetails<T> registrationDetails,
             File stagingFile)
     {
-        return new DataSet<T>(registrationDetails, stagingFile);
+        IEncapsulatedOpenBISService service = registratorState.getGlobalState().getOpenBisService();
+        return new DataSet<T>(registrationDetails, stagingFile, service);
     }
 
     /**
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractDataSetImmutable.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractDataSetImmutable.java
new file mode 100644
index 0000000000000000000000000000000000000000..2f25492cee10c7a45fcc06881694fc24afecaa94
--- /dev/null
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractDataSetImmutable.java
@@ -0,0 +1,66 @@
+/*
+ * Copyright 2011 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.etlserver.registrator.api.v1.impl;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+
+import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
+import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.IDataSetImmutable;
+import ch.systemsx.cisd.openbis.generic.server.api.v1.Translator;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.ControlledVocabularyPropertyType;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetTypePropertyType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetTypeWithVocabularyTerms;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
+
+/**
+ * Abstract super class of all {@link IDataSetImmutable} implementations.
+ *
+ * @author Franz-Josef Elmer
+ */
+abstract class AbstractDataSetImmutable implements IDataSetImmutable 
+{
+    protected final IEncapsulatedOpenBISService service;
+
+    AbstractDataSetImmutable(IEncapsulatedOpenBISService service)
+    {
+        this.service = service;
+    }
+    
+    protected DataSetType getDataSetTypeWithPropertyTypes(String dataSetTypeCode)
+    {
+        DataSetTypeWithVocabularyTerms dataSetType = service.getDataSetType(dataSetTypeCode);
+        HashMap<Vocabulary, List<ControlledVocabularyPropertyType.VocabularyTerm>> termsMap =
+                new HashMap<Vocabulary, List<ControlledVocabularyPropertyType.VocabularyTerm>>();
+        for (DataSetTypePropertyType dataSetTypePropertyType : dataSetType.getDataSetType()
+                .getAssignedPropertyTypes())
+        {
+            Vocabulary vocabulary = dataSetTypePropertyType.getPropertyType().getVocabulary();
+            if (vocabulary != null)
+            {
+                Collection<VocabularyTerm> vocabularyTerms =
+                        service.listVocabularyTerms(vocabulary.getCode());
+                termsMap.put(vocabulary, Translator.translatePropertyTypeTerms(vocabularyTerms));
+            }
+        }
+        return Translator.translate(dataSetType.getDataSetType(), termsMap);
+    }
+
+}
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 d8c14cb60dcc395947cf1c4415416d14300b25f2..6de38830ec0394760ae7ed9d80384131c9342925 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
@@ -370,7 +370,7 @@ abstract class AbstractTransactionState<T extends DataSetInformation>
                 return null;
             } else
             {
-                return new DataSetImmutable(dataSet);
+                return new DataSetImmutable(dataSet, openBisService);
             }
         }
 
@@ -389,7 +389,7 @@ abstract class AbstractTransactionState<T extends DataSetInformation>
                 return null;
             } else
             {
-                result = new DataSetUpdatable(dataSet);
+                result = new DataSetUpdatable(dataSet, openBisService);
                 dataSetsToBeUpdated.add(result);
                 return result;
             }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSet.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSet.java
index 99e2d4a6ebc27ccef1bcbd077d1273ae87aba357..f83c3e7ccde505dff0c5eb355c690476a2b25415 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSet.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSet.java
@@ -22,12 +22,15 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.etlserver.registrator.DataSetRegistrationDetails;
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSet;
+import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.IDataSetImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.IExperimentImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.ISampleImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -41,7 +44,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifi
  * 
  * @author Chandrasekhar Ramakrishnan
  */
-public class DataSet<T extends DataSetInformation> implements IDataSet
+public class DataSet<T extends DataSetInformation> extends AbstractDataSetImmutable implements IDataSet
 {
     private final DataSetRegistrationDetails<? extends T> registrationDetails;
 
@@ -52,8 +55,10 @@ public class DataSet<T extends DataSetInformation> implements IDataSet
 
     private ISampleImmutable sampleOrNull;
 
-    public DataSet(DataSetRegistrationDetails<? extends T> registrationDetails, File dataSetFolder)
+    public DataSet(DataSetRegistrationDetails<? extends T> registrationDetails, File dataSetFolder,
+            IEncapsulatedOpenBISService service)
     {
+        super(service);
         this.registrationDetails = registrationDetails;
         this.dataSetFolder = dataSetFolder;
     }
@@ -186,6 +191,18 @@ public class DataSet<T extends DataSetInformation> implements IDataSet
         return registrationDetails.getDataSetType().getCode();
     }
 
+    public DataSetType getDataSetTypeWithPropertyTypes()
+    {
+        String dataSetTypeCode = getDataSetType();
+        if (dataSetTypeCode == null)
+        {
+            throw new UserFailureException(
+                    "Unkown data set type. Data set type code has to be set "
+                            + "before invoking getDataSetTypeWithPropertyTypes().");
+        }
+        return getDataSetTypeWithPropertyTypes(dataSetTypeCode);
+    }
+
     public void setDataSetType(String dataSetTypeCode)
     {
         registrationDetails.setDataSetType(dataSetTypeCode);
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetImmutable.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetImmutable.java
index 36969b95cf4a38797366d41b64ccde69a8df2cc6..bf92954dd7ad36fe2b93c4abc897b14820561aba 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetImmutable.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetImmutable.java
@@ -20,9 +20,11 @@ import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
+import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.IDataSetImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.IExperimentImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.ISampleImmutable;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
@@ -33,12 +35,13 @@ import ch.systemsx.cisd.openbis.generic.shared.util.EntityHelper;
  * 
  * @author Chandrasekhar Ramakrishnan
  */
-public class DataSetImmutable implements IDataSetImmutable
+public class DataSetImmutable extends AbstractDataSetImmutable
 {
     protected final ExternalData dataSet;
 
-    public DataSetImmutable(ExternalData dataSet)
+    public DataSetImmutable(ExternalData dataSet, IEncapsulatedOpenBISService service)
     {
+        super(service);
         this.dataSet = dataSet;
     }
 
@@ -96,6 +99,11 @@ public class DataSetImmutable implements IDataSetImmutable
         return dataSet.getDataSetType().getCode();
     }
 
+    public DataSetType getDataSetTypeWithPropertyTypes()
+    {
+        return getDataSetTypeWithPropertyTypes(getDataSetType());
+    }
+
     public String getPropertyValue(String propertyCode)
     {
         return EntityHelper.tryFindPropertyValue(dataSet, propertyCode);
@@ -141,7 +149,7 @@ public class DataSetImmutable implements IDataSetImmutable
         {
             for (ExternalData child : children)
             {
-                result.add(new DataSetImmutable(child));
+                result.add(new DataSetImmutable(child, service));
             }
         }
         return result;
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetUpdatable.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetUpdatable.java
index 84a0cde25c8e63f395a91ea2d6164d5a413164a2..d926ed801dc2f914394b4683d9c001031ffbd161 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetUpdatable.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetUpdatable.java
@@ -20,6 +20,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import ch.systemsx.cisd.etlserver.registrator.api.v1.IDataSetUpdatable;
+import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.IExperimentImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.ISampleImmutable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
@@ -36,9 +37,9 @@ import ch.systemsx.cisd.openbis.generic.shared.util.EntityHelper;
  */
 public class DataSetUpdatable extends DataSetImmutable implements IDataSetUpdatable
 {
-    public DataSetUpdatable(ExternalData dataSet)
+    public DataSetUpdatable(ExternalData dataSet, IEncapsulatedOpenBISService service)
     {
-        super(dataSet);
+        super(dataSet, service);
         if (dataSet.getProperties() == null)
         {
             dataSet.setDataSetProperties(new ArrayList<IEntityProperty>());
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/SearchService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/SearchService.java
index 31886fa5b2a69c9aa30e435383eb5d6af54b4ea2..9f3f2b2f4abd5a513db7cfadd709c2f36c5d2143 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/SearchService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/SearchService.java
@@ -102,7 +102,7 @@ class SearchService implements ISearchService
                 new ArrayList<IDataSetImmutable>(serverDataSets.size());
         for (ExternalData dataSet : serverDataSets)
         {
-            dataSets.add(new DataSetImmutable(dataSet));
+            dataSets.add(new DataSetImmutable(dataSet, openBisService));
         }
         return dataSets;
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/v1/IDataSetImmutable.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/v1/IDataSetImmutable.java
index 639fd29b2620008f498f314dec943e15fbbb8a76..96df62cc75baeb3bb2f6a4f5aa233430be10203d 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/v1/IDataSetImmutable.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/api/internal/v1/IDataSetImmutable.java
@@ -18,6 +18,8 @@ package ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1;
 
 import java.util.List;
 
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 
 /**
@@ -71,6 +73,14 @@ public interface IDataSetImmutable
      * data set.
      */
     public String getDataSetType();
+    
+    /**
+     * Returns data set type with property types and vocabulary terms for all property types with
+     * vocabulary data type.
+     * 
+     * @throws UserFailureException if data set type code hasn't been defined.
+     */
+    public DataSetType getDataSetTypeWithPropertyTypes();
 
     /**
      * Returns the speed hint.
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java
index b5f8a0e968cd1c9ef5bac777ab99acdfbc5c0d8d..206e5e7dd1ec6bced92a89f13d0e13ccc7d16d9c 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetRegistrationTransactionTest.java
@@ -701,7 +701,7 @@ public class DataSetRegistrationTransactionTest extends AbstractFileSystemTestCa
         public DataSet<DataSetInformation> createDataSet(
                 DataSetRegistrationDetails<DataSetInformation> registrationDetails, File stagingFile)
         {
-            return new DataSet<DataSetInformation>(registrationDetails, stagingFile);
+            return new DataSet<DataSetInformation>(registrationDetails, stagingFile, openBisService);
         }
     }
 
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetTest.java
index 11882db360b16fe43a8deab5cc34f8504046b2e3..152f0dfbd02968edd167568db25de17fc06c82db 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/DataSetTest.java
@@ -40,7 +40,7 @@ public class DataSetTest extends AssertJUnit
         DataSetRegistrationDetails<DataSetInformation> registrationDetails =
                 new DataSetRegistrationDetails<DataSetInformation>();
         registrationDetails.setDataSetInformation(new DataSetInformation());
-        IDataSet dataSet = new DataSet<DataSetInformation>(registrationDetails, new File("."));
+        IDataSet dataSet = new DataSet<DataSetInformation>(registrationDetails, new File("."), null);
         
         assertEquals(Constants.DEFAULT_SPEED_HINT, dataSet.getSpeedHint());
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/Translator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/Translator.java
index 25b049b7aeb5377d7b37532d509b6fcf25678a05..e2651e6347651013603654d90c2ceb29a83d4905 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/Translator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/Translator.java
@@ -161,7 +161,7 @@ public class Translator
         return new Experiment(initializer);
     }
 
-    static DataSetType translate(
+    public static DataSetType translate(
             ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType privateDataSetType,
             HashMap<ch.systemsx.cisd.openbis.generic.shared.basic.dto.Vocabulary, List<ControlledVocabularyPropertyType.VocabularyTerm>> vocabTerms)
     {