From ed6838bf653f24c48d1a623109f39916cdab2577 Mon Sep 17 00:00:00 2001
From: pkupczyk <pkupczyk>
Date: Wed, 25 Feb 2015 15:24:00 +0000
Subject: [PATCH] SSDM-1488 : V3 AS API - Improvements for Seek integration

SVN: 33531
---
 .../entity/dataset/DataSetTranslator.java     |  13 +
 .../dataset/ExternalDataTranslator.java       | 131 +++++++++
 .../dataset/FileFormatTypeTranslator.java     |  53 ++++
 .../entity/dataset/LocatorTypeTranslator.java |  53 ++++
 .../vocabulary/VocabularyTermTranslator.java  |  76 ++++++
 .../vocabulary/VocabularyTranslator.java      |  64 +++++
 .../systemtest/api/v3/SearchDataSetTest.java  | 119 +++++++--
 .../dto/entity/dataset/ArchivingStatus.java   |  28 ++
 .../api/v3/dto/entity/dataset/Complete.java   |  30 +++
 .../api/v3/dto/entity/dataset/DataSet.java    |  24 ++
 .../v3/dto/entity/dataset/ExternalData.java   | 251 ++++++++++++++++++
 .../v3/dto/entity/dataset/FileFormatType.java |  81 ++++++
 .../v3/dto/entity/dataset/LocatorType.java    |  81 ++++++
 .../v3/dto/entity/vocabulary/Vocabulary.java  | 138 ++++++++++
 .../dto/entity/vocabulary/VocabularyTerm.java | 210 +++++++++++++++
 .../dataset/DataSetFetchOptions.java          |  26 ++
 .../dataset/ExternalDataFetchOptions.java     | 108 ++++++++
 .../dataset/FileFormatTypeFetchOptions.java   |  30 +++
 .../dataset/LocatorTypeFetchOptions.java      |  30 +++
 .../vocabulary/VocabularyFetchOptions.java    |  56 ++++
 .../VocabularyTermFetchOptions.java           |  82 ++++++
 .../api/v3/dto/generators/Generator.java      |  82 ++++++
 22 files changed, 1750 insertions(+), 16 deletions(-)
 create mode 100644 openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/dataset/ExternalDataTranslator.java
 create mode 100644 openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/dataset/FileFormatTypeTranslator.java
 create mode 100644 openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/dataset/LocatorTypeTranslator.java
 create mode 100644 openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/vocabulary/VocabularyTermTranslator.java
 create mode 100644 openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/vocabulary/VocabularyTranslator.java
 create mode 100644 openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/ArchivingStatus.java
 create mode 100644 openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/Complete.java
 create mode 100644 openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/ExternalData.java
 create mode 100644 openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/FileFormatType.java
 create mode 100644 openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/LocatorType.java
 create mode 100644 openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/vocabulary/Vocabulary.java
 create mode 100644 openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/vocabulary/VocabularyTerm.java
 create mode 100644 openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/dataset/ExternalDataFetchOptions.java
 create mode 100644 openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/dataset/FileFormatTypeFetchOptions.java
 create mode 100644 openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/dataset/LocatorTypeFetchOptions.java
 create mode 100644 openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/vocabulary/VocabularyFetchOptions.java
 create mode 100644 openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/vocabulary/VocabularyTermFetchOptions.java

diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/dataset/DataSetTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/dataset/DataSetTranslator.java
index 4ad763e194f..4deeb3ef4c3 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/dataset/DataSetTranslator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/dataset/DataSetTranslator.java
@@ -29,12 +29,14 @@ import ch.ethz.sis.openbis.generic.server.api.v3.translator.entity.property.Prop
 import ch.ethz.sis.openbis.generic.server.api.v3.translator.entity.tag.TagTranslator;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.DataSet;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.DataSetType;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.ExternalData;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.experiment.Experiment;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.person.Person;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.tag.Tag;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.DataSetFetchOptions;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.id.dataset.DataSetPermId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 
 /**
@@ -159,6 +161,17 @@ public class DataSetTranslator extends AbstractCachingTranslator<DataPE, DataSet
             result.setModifier(modifier);
             result.getFetchOptions().withModifierUsing(getFetchOptions().withModifier());
         }
+
+        if (getFetchOptions().hasExternalData())
+        {
+            if (dataPe instanceof ExternalDataPE)
+            {
+                ExternalData externalData =
+                        new ExternalDataTranslator(getTranslationContext(), getFetchOptions().withExternalData()).translate((ExternalDataPE) dataPe);
+                result.setExternalData(externalData);
+            }
+            result.getFetchOptions().withExternalDataUsing(getFetchOptions().withExternalData());
+        }
     }
 
 }
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/dataset/ExternalDataTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/dataset/ExternalDataTranslator.java
new file mode 100644
index 00000000000..6e4a11d3015
--- /dev/null
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/dataset/ExternalDataTranslator.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright 2013 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.ethz.sis.openbis.generic.server.api.v3.translator.entity.dataset;
+
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.AbstractCachingTranslator;
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.Relations;
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.TranslationContext;
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.entity.vocabulary.VocabularyTermTranslator;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.ArchivingStatus;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.Complete;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.ExternalData;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.ExternalDataFetchOptions;
+import ch.systemsx.cisd.openbis.common.types.BooleanOrUnknown;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
+
+/**
+ * @author pkupczyk
+ */
+public class ExternalDataTranslator extends AbstractCachingTranslator<ExternalDataPE, ExternalData, ExternalDataFetchOptions>
+{
+    public ExternalDataTranslator(TranslationContext translationContext, ExternalDataFetchOptions fetchOptions)
+    {
+        super(translationContext, fetchOptions);
+    }
+
+    @Override
+    protected ExternalData createObject(ExternalDataPE data)
+    {
+        ExternalData result = new ExternalData();
+
+        result.setShareId(data.getShareId());
+        result.setLocation(data.getLocation());
+        result.setSize(data.getSize());
+        result.setComplete(translateComplete(data.getComplete()));
+        result.setStatus(translateStatus(data.getStatus()));
+        result.setPresentInArchive(data.isPresentInArchive());
+        result.setStorageConfirmation(data.isStorageConfirmation());
+        result.setSpeedHint(data.getSpeedHint());
+        result.setFetchOptions(new ExternalDataFetchOptions());
+
+        return result;
+    }
+
+    private Complete translateComplete(BooleanOrUnknown value)
+    {
+        if (value != null)
+        {
+            switch (value)
+            {
+                case T:
+                    return Complete.YES;
+                case F:
+                    return Complete.NO;
+                case U:
+                    return Complete.UNKNOWN;
+                default:
+                    throw new IllegalArgumentException("Unknown value: " + value);
+            }
+        }
+
+        return null;
+    }
+
+    private ArchivingStatus translateStatus(DataSetArchivingStatus value)
+    {
+        if (value != null)
+        {
+            switch (value)
+            {
+                case ARCHIVE_PENDING:
+                    return ArchivingStatus.ARCHIVE_PENDING;
+                case ARCHIVED:
+                    return ArchivingStatus.ARCHIVED;
+                case AVAILABLE:
+                    return ArchivingStatus.AVAILABLE;
+                case BACKUP_PENDING:
+                    return ArchivingStatus.BACKUP_PENDING;
+                case LOCKED:
+                    return ArchivingStatus.LOCKED;
+                case UNARCHIVE_PENDING:
+                    return ArchivingStatus.UNARCHIVE_PENDING;
+                default:
+                    throw new IllegalArgumentException("Unknown value: " + value);
+            }
+        }
+
+        return null;
+    }
+
+    @Override
+    protected void updateObject(ExternalDataPE data, ExternalData result, Relations relations)
+    {
+        if (getFetchOptions().hasFileFormatType())
+        {
+            result.setFileFormatType(new FileFormatTypeTranslator(getTranslationContext(), getFetchOptions().withFileFormatType()).translate(data
+                    .getFileFormatType()));
+            result.getFetchOptions().withFileFormatTypeUsing(getFetchOptions().withFileFormatType());
+        }
+
+        if (getFetchOptions().hasLocatorType())
+        {
+            result.setLocatorType(new LocatorTypeTranslator(getTranslationContext(), getFetchOptions().withLocatorType()).translate(data
+                    .getLocatorType()));
+            result.getFetchOptions().withLocatorTypeUsing(getFetchOptions().withLocatorType());
+        }
+
+        if (getFetchOptions().hasStorageFormatVocabularyTerm())
+        {
+            result.setStorageFormatVocabularyTerm(new VocabularyTermTranslator(getTranslationContext(), getFetchOptions()
+                    .withStorageFormatVocabularyTerm()).translate(data
+                    .getStorageFormatVocabularyTerm()));
+            result.getFetchOptions().withStorageFormatVocabularyTermUsing(getFetchOptions().withStorageFormatVocabularyTerm());
+        }
+    }
+
+}
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/dataset/FileFormatTypeTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/dataset/FileFormatTypeTranslator.java
new file mode 100644
index 00000000000..f56fbf6bf02
--- /dev/null
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/dataset/FileFormatTypeTranslator.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2013 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.ethz.sis.openbis.generic.server.api.v3.translator.entity.dataset;
+
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.AbstractCachingTranslator;
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.Relations;
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.TranslationContext;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.FileFormatType;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.FileFormatTypeFetchOptions;
+import ch.systemsx.cisd.openbis.generic.shared.dto.FileFormatTypePE;
+
+/**
+ * @author pkupczyk
+ */
+public class FileFormatTypeTranslator extends AbstractCachingTranslator<FileFormatTypePE, FileFormatType, FileFormatTypeFetchOptions>
+{
+    public FileFormatTypeTranslator(TranslationContext translationContext, FileFormatTypeFetchOptions fetchOptions)
+    {
+        super(translationContext, fetchOptions);
+    }
+
+    @Override
+    protected FileFormatType createObject(FileFormatTypePE type)
+    {
+        FileFormatType result = new FileFormatType();
+
+        result.setCode(type.getCode());
+        result.setDescription(type.getDescription());
+        result.setFetchOptions(new FileFormatTypeFetchOptions());
+
+        return result;
+    }
+
+    @Override
+    protected void updateObject(FileFormatTypePE type, FileFormatType result, Relations relations)
+    {
+    }
+
+}
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/dataset/LocatorTypeTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/dataset/LocatorTypeTranslator.java
new file mode 100644
index 00000000000..0b7436c6b0d
--- /dev/null
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/dataset/LocatorTypeTranslator.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2013 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.ethz.sis.openbis.generic.server.api.v3.translator.entity.dataset;
+
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.AbstractCachingTranslator;
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.Relations;
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.TranslationContext;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.LocatorType;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.LocatorTypeFetchOptions;
+import ch.systemsx.cisd.openbis.generic.shared.dto.LocatorTypePE;
+
+/**
+ * @author pkupczyk
+ */
+public class LocatorTypeTranslator extends AbstractCachingTranslator<LocatorTypePE, LocatorType, LocatorTypeFetchOptions>
+{
+    public LocatorTypeTranslator(TranslationContext translationContext, LocatorTypeFetchOptions fetchOptions)
+    {
+        super(translationContext, fetchOptions);
+    }
+
+    @Override
+    protected LocatorType createObject(LocatorTypePE type)
+    {
+        LocatorType result = new LocatorType();
+
+        result.setCode(type.getCode());
+        result.setDescription(type.getDescription());
+        result.setFetchOptions(new LocatorTypeFetchOptions());
+
+        return result;
+    }
+
+    @Override
+    protected void updateObject(LocatorTypePE type, LocatorType result, Relations relations)
+    {
+    }
+
+}
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/vocabulary/VocabularyTermTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/vocabulary/VocabularyTermTranslator.java
new file mode 100644
index 00000000000..6d95d0640fa
--- /dev/null
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/vocabulary/VocabularyTermTranslator.java
@@ -0,0 +1,76 @@
+/*
+ * Copyright 2013 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.ethz.sis.openbis.generic.server.api.v3.translator.entity.vocabulary;
+
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.AbstractCachingTranslator;
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.Relations;
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.TranslationContext;
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.entity.person.PersonTranslator;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.person.Person;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.vocabulary.Vocabulary;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.vocabulary.VocabularyTerm;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.vocabulary.VocabularyTermFetchOptions;
+import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyTermPE;
+
+/**
+ * @author pkupczyk
+ */
+public class VocabularyTermTranslator extends AbstractCachingTranslator<VocabularyTermPE, VocabularyTerm, VocabularyTermFetchOptions>
+{
+    public VocabularyTermTranslator(TranslationContext translationContext, VocabularyTermFetchOptions fetchOptions)
+    {
+        super(translationContext, fetchOptions);
+    }
+
+    @Override
+    protected VocabularyTerm createObject(VocabularyTermPE term)
+    {
+        VocabularyTerm result = new VocabularyTerm();
+
+        result.setCode(term.getCode());
+        result.setDescription(term.getDescription());
+        result.setLabel(term.getLabel());
+        result.setOfficial(term.isOfficial());
+        result.setOrdinal(term.getOrdinal());
+        result.setRegistrationDate(term.getRegistrationDate());
+        result.setModificationDate(term.getModificationDate());
+        result.setFetchOptions(new VocabularyTermFetchOptions());
+
+        return result;
+    }
+
+    @Override
+    protected void updateObject(VocabularyTermPE term, VocabularyTerm result, Relations relations)
+    {
+        if (getFetchOptions().hasRegistrator())
+        {
+            Person registrator =
+                    new PersonTranslator(getTranslationContext(), getFetchOptions().withRegistrator()).translate(term.getRegistrator());
+            result.setRegistrator(registrator);
+            result.getFetchOptions().withRegistratorUsing(getFetchOptions().withRegistrator());
+        }
+
+        if (getFetchOptions().hasVocabulary())
+        {
+            Vocabulary vocabulary =
+                    new VocabularyTranslator(getTranslationContext(), getFetchOptions().withVocabulary()).translate(term.getVocabulary());
+            result.setVocabulary(vocabulary);
+            result.getFetchOptions().withVocabularyUsing(getFetchOptions().withVocabulary());
+        }
+    }
+
+}
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/vocabulary/VocabularyTranslator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/vocabulary/VocabularyTranslator.java
new file mode 100644
index 00000000000..7991c20d1e5
--- /dev/null
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/api/v3/translator/entity/vocabulary/VocabularyTranslator.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright 2013 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.ethz.sis.openbis.generic.server.api.v3.translator.entity.vocabulary;
+
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.AbstractCachingTranslator;
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.Relations;
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.TranslationContext;
+import ch.ethz.sis.openbis.generic.server.api.v3.translator.entity.person.PersonTranslator;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.person.Person;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.vocabulary.Vocabulary;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.vocabulary.VocabularyFetchOptions;
+import ch.systemsx.cisd.openbis.generic.shared.dto.VocabularyPE;
+
+/**
+ * @author pkupczyk
+ */
+public class VocabularyTranslator extends AbstractCachingTranslator<VocabularyPE, Vocabulary, VocabularyFetchOptions>
+{
+    public VocabularyTranslator(TranslationContext translationContext, VocabularyFetchOptions fetchOptions)
+    {
+        super(translationContext, fetchOptions);
+    }
+
+    @Override
+    protected Vocabulary createObject(VocabularyPE vocabulary)
+    {
+        Vocabulary result = new Vocabulary();
+
+        result.setCode(vocabulary.getCode());
+        result.setDescription(vocabulary.getDescription());
+        result.setRegistrationDate(vocabulary.getRegistrationDate());
+        result.setModificationDate(vocabulary.getModificationDate());
+        result.setFetchOptions(new VocabularyFetchOptions());
+
+        return result;
+    }
+
+    @Override
+    protected void updateObject(VocabularyPE vocabulary, Vocabulary result, Relations relations)
+    {
+        if (getFetchOptions().hasRegistrator())
+        {
+            Person registrator =
+                    new PersonTranslator(getTranslationContext(), getFetchOptions().withRegistrator()).translate(vocabulary.getRegistrator());
+            result.setRegistrator(registrator);
+            result.getFetchOptions().withRegistratorUsing(getFetchOptions().withRegistrator());
+        }
+    }
+
+}
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/SearchDataSetTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/SearchDataSetTest.java
index e5a4ceaf418..909f1f92170 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/SearchDataSetTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/api/v3/SearchDataSetTest.java
@@ -17,10 +17,10 @@
 package ch.ethz.sis.openbis.systemtest.api.v3;
 
 import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertTrue;
 
-import java.text.SimpleDateFormat;
 import java.util.Collections;
-import java.util.Date;
 import java.util.List;
 import java.util.TreeMap;
 
@@ -28,8 +28,18 @@ import junit.framework.Assert;
 
 import org.testng.annotations.Test;
 
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.ArchivingStatus;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.Complete;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.DataSet;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.ExternalData;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.FileFormatType;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.LocatorType;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.vocabulary.Vocabulary;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.vocabulary.VocabularyTerm;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.DataSetFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.ExternalDataFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.vocabulary.VocabularyFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.vocabulary.VocabularyTermFetchOptions;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.id.dataset.DataSetPermId;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.search.DataSetSearchCriterion;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.search.SampleSearchCriterion;
@@ -80,7 +90,7 @@ public class SearchDataSetTest extends AbstractDataSetTest
         criterion.withProperty("COMMENT").thatContains("non-virt");
         testSearch(TEST_USER, criterion, "20110509092359990-11", "20110509092359990-12");
     }
-    
+
     @Test
     public void testSearchWithRegistrationDateIsEarlierThan()
     {
@@ -88,7 +98,7 @@ public class SearchDataSetTest extends AbstractDataSetTest
         criterion.withRegistrationDate().thatIsEarlierThanOrEqualTo("2008-11-05 09:22:00");
         testSearch(TEST_USER, criterion, "20081105092159188-3");
     }
-    
+
     @Test
     public void testSearchWithModicationDateIsLaterThan()
     {
@@ -122,7 +132,7 @@ public class SearchDataSetTest extends AbstractDataSetTest
         criterion.withChildren().withCode().thatEquals("20081105092259000-9");
         testSearch(TEST_USER, criterion, "20081105092159111-1");
     }
-    
+
     @Test
     public void testSearchWithParent()
     {
@@ -130,7 +140,7 @@ public class SearchDataSetTest extends AbstractDataSetTest
         criterion.withParents().withCode().thatEquals("20081105092159111-1");
         testSearch(TEST_USER, criterion, "20081105092259000-9");
     }
-    
+
     @Test
     public void testSearchWithExperimentWithPermIdThatEquals()
     {
@@ -138,7 +148,7 @@ public class SearchDataSetTest extends AbstractDataSetTest
         criterion.withExperiment().withPermId().thatEquals("200902091255058-1035");
         testSearch(TEST_USER, criterion, "20081105092159333-3", "20110805092359990-17");
     }
-    
+
     @Test
     public void testSearchWithExperimentWithProperty()
     {
@@ -154,7 +164,7 @@ public class SearchDataSetTest extends AbstractDataSetTest
         criterion.withExperiment().withProperty("GENDER").thatEquals("MALE");
         testSearch(TEST_USER, criterion, "20081105092159188-3");
     }
-    
+
     @Test
     public void testSearchWithExperimentYoungerThan()
     {
@@ -162,7 +172,7 @@ public class SearchDataSetTest extends AbstractDataSetTest
         criterion.withExperiment().withRegistrationDate().thatIsLaterThanOrEqualTo("2009-02-09 12:11:00");
         testSearch(TEST_USER, criterion, "20081105092159333-3", "20110805092359990-17");
     }
-    
+
     @Test
     public void testSearchWithSampleWithAnyPropertyThatContains()
     {
@@ -170,7 +180,7 @@ public class SearchDataSetTest extends AbstractDataSetTest
         criterion.withSample().withAnyProperty().thatContains("er");
         testSearch(TEST_USER, criterion, "20081105092159111-1", "20081105092159333-3", "20110805092359990-17", "20081105092159222-2");
     }
-    
+
     @Test
     public void testSearchWithSampleWithPropertiesThatContains()
     {
@@ -180,7 +190,7 @@ public class SearchDataSetTest extends AbstractDataSetTest
         sampleSearchCriterion.withProperty("ORGANISM").thatContains("LY");
         testSearch(TEST_USER, criterion, "20081105092159111-1", "20081105092159333-3", "20110805092359990-17");
     }
-    
+
     @Test
     public void testSearchWithFetchOptionExperiment()
     {
@@ -188,9 +198,9 @@ public class SearchDataSetTest extends AbstractDataSetTest
         criterion.withPermId().thatEquals("20110805092359990-17");
         DataSetFetchOptions fetchOptions = new DataSetFetchOptions();
         fetchOptions.withExperiment().withProperties();
-        
+
         List<DataSet> dataSets = searchDataSets(TEST_USER, criterion, fetchOptions);
-        
+
         Collections.sort(dataSets, DATA_SET_COMPARATOR);
         assertEquals(dataSets.get(0).getCode(), "20110805092359990-17");
         assertEquals(dataSets.get(0).getPermId().toString(), "20110805092359990-17");
@@ -204,11 +214,88 @@ public class SearchDataSetTest extends AbstractDataSetTest
         assertContainersNotFetched(dataSets.get(0));
         assertContainedNotFetched(dataSets.get(0));
         assertEquals(dataSets.get(0).getExperiment().getIdentifier().toString(), "/CISD/NEMO/EXP-TEST-2");
-        assertEquals(new TreeMap<String, String>(dataSets.get(0).getExperiment().getProperties()).toString(), 
+        assertEquals(new TreeMap<String, String>(dataSets.get(0).getExperiment().getProperties()).toString(),
                 "{DESCRIPTION=very important expertiment, GENDER=FEMALE, PURCHASE_DATE=2009-02-09 10:00:00 +0100}");
         assertEquals(dataSets.size(), 1);
     }
-    
+
+    @Test
+    public void testSearchWithFetchOptionExternalDataForPhysicalDataSet()
+    {
+        DataSetSearchCriterion criterion = new DataSetSearchCriterion();
+        criterion.withPermId().thatEquals("20081105092159111-1");
+        DataSetFetchOptions fetchOptions = new DataSetFetchOptions();
+
+        ExternalDataFetchOptions externalDataFetchOptions = fetchOptions.withExternalData();
+        externalDataFetchOptions.withFileFormatType();
+        externalDataFetchOptions.withLocatorType();
+
+        VocabularyTermFetchOptions storageFormatTermFetchOptions = externalDataFetchOptions.withStorageFormatVocabularyTerm();
+        storageFormatTermFetchOptions.withRegistrator();
+
+        VocabularyFetchOptions storageFormatVocabularyFetchOptions = storageFormatTermFetchOptions.withVocabulary();
+        storageFormatVocabularyFetchOptions.withRegistrator();
+
+        List<DataSet> dataSets = searchDataSets(TEST_USER, criterion, fetchOptions);
+
+        assertEquals(dataSets.size(), 1);
+        DataSet dataSet = dataSets.get(0);
+
+        assertEquals(dataSet.getCode(), "20081105092159111-1");
+
+        ExternalData externalData = dataSet.getExternalData();
+        assertEquals(externalData.getShareId(), "42");
+        assertEquals(externalData.getLocation(), "a/1");
+        assertEquals(externalData.getSize(), Long.valueOf(4711));
+        assertEquals(externalData.getComplete(), Complete.UNKNOWN);
+        assertEquals(externalData.getStatus(), ArchivingStatus.AVAILABLE);
+        assertFalse(externalData.isPresentInArchive());
+        assertFalse(externalData.isStorageConfirmation());
+
+        FileFormatType fileFormatType = externalData.getFileFormatType();
+        assertEquals(fileFormatType.getCode(), "TIFF");
+        assertEquals(fileFormatType.getDescription(), "TIFF File");
+
+        LocatorType locatorType = externalData.getLocatorType();
+        assertEquals(locatorType.getCode(), "RELATIVE_LOCATION");
+        assertEquals(locatorType.getDescription(), "Relative Location");
+
+        VocabularyTerm storageFormatTerm = externalData.getStorageFormatVocabularyTerm();
+        assertEquals(storageFormatTerm.getCode(), "PROPRIETARY");
+        assertEquals(storageFormatTerm.getLabel(), null);
+        assertEquals(storageFormatTerm.getDescription(), null);
+        assertEquals(storageFormatTerm.getOrdinal(), Long.valueOf(1));
+        assertTrue(storageFormatTerm.isOfficial());
+        assertEquals(storageFormatTerm.getRegistrator().getUserId(), "system");
+        assertEqualsDate(storageFormatTerm.getRegistrationDate(), "2008-11-05 09:18:00");
+        assertEqualsDate(storageFormatTerm.getModificationDate(), "2008-11-05 09:18:00");
+
+        Vocabulary storageFormatVocabulary = storageFormatTerm.getVocabulary();
+        assertEquals(storageFormatVocabulary.getCode(), "$STORAGE_FORMAT");
+        assertEquals(storageFormatVocabulary.getDescription(), "The on-disk storage format of a data set");
+        assertEquals(storageFormatVocabulary.getRegistrator().getUserId(), "system");
+        assertEqualsDate(storageFormatVocabulary.getRegistrationDate(), "2008-11-05 09:18:00");
+        assertEqualsDate(storageFormatVocabulary.getModificationDate(), "2009-03-23 15:34:44");
+    }
+
+    @Test
+    public void testSearchWithFetchOptionExternalDataForContainerDataSet()
+    {
+        DataSetSearchCriterion criterion = new DataSetSearchCriterion();
+        criterion.withPermId().thatEquals("ROOT_CONTAINER");
+
+        DataSetFetchOptions fetchOptions = new DataSetFetchOptions();
+        fetchOptions.withExternalData();
+
+        List<DataSet> dataSets = searchDataSets(TEST_USER, criterion, fetchOptions);
+
+        assertEquals(dataSets.size(), 1);
+        DataSet dataSet = dataSets.get(0);
+
+        assertEquals(dataSet.getCode(), "ROOT_CONTAINER");
+        assertEquals(dataSet.getExternalData(), null);
+    }
+
     // @Test
     // public void testSearchWithPermId()
     // {
@@ -723,6 +810,6 @@ public class SearchDataSetTest extends AbstractDataSetTest
         {
             v3api.logout(sessionToken);
         }
-   
+
     }
 }
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/ArchivingStatus.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/ArchivingStatus.java
new file mode 100644
index 00000000000..8088593569f
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/ArchivingStatus.java
@@ -0,0 +1,28 @@
+/*
+ * Copyright 2015 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.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset;
+
+import ch.systemsx.cisd.base.annotation.JsonObject;
+
+/**
+ * @author pkupczyk
+ */
+@JsonObject("dto.entity.dataset.ArchivingStatus")
+public enum ArchivingStatus
+{
+    AVAILABLE, LOCKED, ARCHIVED, UNARCHIVE_PENDING, ARCHIVE_PENDING, BACKUP_PENDING
+}
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/Complete.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/Complete.java
new file mode 100644
index 00000000000..7831dffbdb0
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/Complete.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2015 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.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset;
+
+import ch.systemsx.cisd.base.annotation.JsonObject;
+
+/**
+ * @author pkupczyk
+ */
+@JsonObject("dto.entity.dataset.Complete")
+public enum Complete
+{
+
+    YES, NO, UNKNOWN
+
+}
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/DataSet.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/DataSet.java
index f65c6f1f5b2..fc0e5879a34 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/DataSet.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/DataSet.java
@@ -16,6 +16,7 @@
 package ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset;
 
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.DataSetType;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.ExternalData;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.experiment.Experiment;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.person.Person;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.sample.Sample;
@@ -70,6 +71,9 @@ public class DataSet implements Serializable
     @JsonProperty
     private List<DataSet> contained;
 
+    @JsonProperty
+    private ExternalData externalData;
+
     @JsonProperty
     private Set<Tag> tags;
 
@@ -255,6 +259,26 @@ public class DataSet implements Serializable
         this.contained = contained;
     }
 
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public ExternalData getExternalData()
+    {
+        if (getFetchOptions().hasExternalData())
+        {
+            return externalData;
+        }
+        else
+        {
+            throw new NotFetchedException("External data has not been fetched.");
+        }
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setExternalData(ExternalData externalData)
+    {
+        this.externalData = externalData;
+    }
+
     // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
     @JsonIgnore
     public Set<Tag> getTags()
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/ExternalData.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/ExternalData.java
new file mode 100644
index 00000000000..72fa9f0fa96
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/ExternalData.java
@@ -0,0 +1,251 @@
+/*
+ * Copyright 2014 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.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset;
+
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.ArchivingStatus;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.Complete;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.FileFormatType;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.LocatorType;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.vocabulary.VocabularyTerm;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.ExternalDataFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.exceptions.NotFetchedException;
+import ch.systemsx.cisd.base.annotation.JsonObject;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
+/**
+ * Class automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+ */
+@JsonObject("dto.entity.dataset.ExternalData")
+public class ExternalData implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    @JsonProperty
+    private ExternalDataFetchOptions fetchOptions;
+
+    @JsonProperty
+    private String shareId;
+
+    @JsonProperty
+    private String location;
+
+    @JsonProperty
+    private Long size;
+
+    @JsonProperty
+    private VocabularyTerm storageFormatVocabularyTerm;
+
+    @JsonProperty
+    private FileFormatType fileFormatType;
+
+    @JsonProperty
+    private LocatorType locatorType;
+
+    @JsonProperty
+    private Complete complete;
+
+    @JsonProperty
+    private ArchivingStatus status;
+
+    @JsonProperty
+    private Boolean presentInArchive;
+
+    @JsonProperty
+    private Boolean storageConfirmation;
+
+    @JsonProperty
+    private Integer speedHint;
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public ExternalDataFetchOptions getFetchOptions()
+    {
+        return fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setFetchOptions(ExternalDataFetchOptions fetchOptions)
+    {
+        this.fetchOptions = fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public String getShareId()
+    {
+        return shareId;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setShareId(String shareId)
+    {
+        this.shareId = shareId;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public String getLocation()
+    {
+        return location;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setLocation(String location)
+    {
+        this.location = location;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public Long getSize()
+    {
+        return size;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setSize(Long size)
+    {
+        this.size = size;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public VocabularyTerm getStorageFormatVocabularyTerm()
+    {
+        if (getFetchOptions().hasStorageFormatVocabularyTerm())
+        {
+            return storageFormatVocabularyTerm;
+        }
+        else
+        {
+            throw new NotFetchedException("Storage format vocabulary term has not been fetched.");
+        }
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setStorageFormatVocabularyTerm(VocabularyTerm storageFormatVocabularyTerm)
+    {
+        this.storageFormatVocabularyTerm = storageFormatVocabularyTerm;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public FileFormatType getFileFormatType()
+    {
+        if (getFetchOptions().hasFileFormatType())
+        {
+            return fileFormatType;
+        }
+        else
+        {
+            throw new NotFetchedException("File Format Type has not been fetched.");
+        }
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setFileFormatType(FileFormatType fileFormatType)
+    {
+        this.fileFormatType = fileFormatType;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public LocatorType getLocatorType()
+    {
+        if (getFetchOptions().hasLocatorType())
+        {
+            return locatorType;
+        }
+        else
+        {
+            throw new NotFetchedException("Locator Type has not been fetched.");
+        }
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setLocatorType(LocatorType locatorType)
+    {
+        this.locatorType = locatorType;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public Complete getComplete()
+    {
+        return complete;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setComplete(Complete complete)
+    {
+        this.complete = complete;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public ArchivingStatus getStatus()
+    {
+        return status;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setStatus(ArchivingStatus status)
+    {
+        this.status = status;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public Boolean isPresentInArchive()
+    {
+        return presentInArchive;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setPresentInArchive(Boolean presentInArchive)
+    {
+        this.presentInArchive = presentInArchive;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public Boolean isStorageConfirmation()
+    {
+        return storageConfirmation;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setStorageConfirmation(Boolean storageConfirmation)
+    {
+        this.storageConfirmation = storageConfirmation;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public Integer getSpeedHint()
+    {
+        return speedHint;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setSpeedHint(Integer speedHint)
+    {
+        this.speedHint = speedHint;
+    }
+
+}
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/FileFormatType.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/FileFormatType.java
new file mode 100644
index 00000000000..009bae1bc49
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/FileFormatType.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2014 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.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset;
+
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.FileFormatTypeFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.exceptions.NotFetchedException;
+import ch.systemsx.cisd.base.annotation.JsonObject;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
+/**
+ * Class automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+ */
+@JsonObject("dto.entity.dataset.FileFormatType")
+public class FileFormatType implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    @JsonProperty
+    private FileFormatTypeFetchOptions fetchOptions;
+
+    @JsonProperty
+    private String code;
+
+    @JsonProperty
+    private String description;
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public FileFormatTypeFetchOptions getFetchOptions()
+    {
+        return fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setFetchOptions(FileFormatTypeFetchOptions fetchOptions)
+    {
+        this.fetchOptions = fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public String getCode()
+    {
+        return code;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setCode(String code)
+    {
+        this.code = code;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public String getDescription()
+    {
+        return description;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setDescription(String description)
+    {
+        this.description = description;
+    }
+
+}
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/LocatorType.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/LocatorType.java
new file mode 100644
index 00000000000..b5a4b949def
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/dataset/LocatorType.java
@@ -0,0 +1,81 @@
+/*
+ * Copyright 2014 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.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset;
+
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.LocatorTypeFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.exceptions.NotFetchedException;
+import ch.systemsx.cisd.base.annotation.JsonObject;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
+/**
+ * Class automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+ */
+@JsonObject("dto.entity.dataset.LocatorType")
+public class LocatorType implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    @JsonProperty
+    private LocatorTypeFetchOptions fetchOptions;
+
+    @JsonProperty
+    private String code;
+
+    @JsonProperty
+    private String description;
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public LocatorTypeFetchOptions getFetchOptions()
+    {
+        return fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setFetchOptions(LocatorTypeFetchOptions fetchOptions)
+    {
+        this.fetchOptions = fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public String getCode()
+    {
+        return code;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setCode(String code)
+    {
+        this.code = code;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public String getDescription()
+    {
+        return description;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setDescription(String description)
+    {
+        this.description = description;
+    }
+
+}
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/vocabulary/Vocabulary.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/vocabulary/Vocabulary.java
new file mode 100644
index 00000000000..a5912acd631
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/vocabulary/Vocabulary.java
@@ -0,0 +1,138 @@
+/*
+ * Copyright 2014 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.ethz.sis.openbis.generic.shared.api.v3.dto.entity.vocabulary;
+
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.person.Person;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.vocabulary.VocabularyFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.exceptions.NotFetchedException;
+import ch.systemsx.cisd.base.annotation.JsonObject;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Class automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+ */
+@JsonObject("dto.entity.vocabulary.Vocabulary")
+public class Vocabulary implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    @JsonProperty
+    private VocabularyFetchOptions fetchOptions;
+
+    @JsonProperty
+    private String code;
+
+    @JsonProperty
+    private String description;
+
+    @JsonProperty
+    private Date registrationDate;
+
+    @JsonProperty
+    private Person registrator;
+
+    @JsonProperty
+    private Date modificationDate;
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public VocabularyFetchOptions getFetchOptions()
+    {
+        return fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setFetchOptions(VocabularyFetchOptions fetchOptions)
+    {
+        this.fetchOptions = fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public String getCode()
+    {
+        return code;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setCode(String code)
+    {
+        this.code = code;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public String getDescription()
+    {
+        return description;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setDescription(String description)
+    {
+        this.description = description;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public Date getRegistrationDate()
+    {
+        return registrationDate;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setRegistrationDate(Date registrationDate)
+    {
+        this.registrationDate = registrationDate;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public Person getRegistrator()
+    {
+        if (getFetchOptions().hasRegistrator())
+        {
+            return registrator;
+        }
+        else
+        {
+            throw new NotFetchedException("Registrator has not been fetched.");
+        }
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setRegistrator(Person registrator)
+    {
+        this.registrator = registrator;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public Date getModificationDate()
+    {
+        return modificationDate;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setModificationDate(Date modificationDate)
+    {
+        this.modificationDate = modificationDate;
+    }
+
+}
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/vocabulary/VocabularyTerm.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/vocabulary/VocabularyTerm.java
new file mode 100644
index 00000000000..6086efb2f8d
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/entity/vocabulary/VocabularyTerm.java
@@ -0,0 +1,210 @@
+/*
+ * Copyright 2014 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.ethz.sis.openbis.generic.shared.api.v3.dto.entity.vocabulary;
+
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.person.Person;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.vocabulary.Vocabulary;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.vocabulary.VocabularyTermFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.exceptions.NotFetchedException;
+import ch.systemsx.cisd.base.annotation.JsonObject;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * Class automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+ */
+@JsonObject("dto.entity.vocabulary.VocabularyTerm")
+public class VocabularyTerm implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    @JsonProperty
+    private VocabularyTermFetchOptions fetchOptions;
+
+    @JsonProperty
+    private String code;
+
+    @JsonProperty
+    private String label;
+
+    @JsonProperty
+    private String description;
+
+    @JsonProperty
+    private Long ordinal;
+
+    @JsonProperty
+    private Boolean official;
+
+    @JsonProperty
+    private Vocabulary vocabulary;
+
+    @JsonProperty
+    private Date registrationDate;
+
+    @JsonProperty
+    private Person registrator;
+
+    @JsonProperty
+    private Date modificationDate;
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public VocabularyTermFetchOptions getFetchOptions()
+    {
+        return fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setFetchOptions(VocabularyTermFetchOptions fetchOptions)
+    {
+        this.fetchOptions = fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public String getCode()
+    {
+        return code;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setCode(String code)
+    {
+        this.code = code;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public String getLabel()
+    {
+        return label;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setLabel(String label)
+    {
+        this.label = label;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public String getDescription()
+    {
+        return description;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setDescription(String description)
+    {
+        this.description = description;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public Long getOrdinal()
+    {
+        return ordinal;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setOrdinal(Long ordinal)
+    {
+        this.ordinal = ordinal;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public Boolean isOfficial()
+    {
+        return official;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setOfficial(Boolean official)
+    {
+        this.official = official;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public Vocabulary getVocabulary()
+    {
+        if (getFetchOptions().hasVocabulary())
+        {
+            return vocabulary;
+        }
+        else
+        {
+            throw new NotFetchedException("Vocabulary has not been fetched.");
+        }
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setVocabulary(Vocabulary vocabulary)
+    {
+        this.vocabulary = vocabulary;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public Date getRegistrationDate()
+    {
+        return registrationDate;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setRegistrationDate(Date registrationDate)
+    {
+        this.registrationDate = registrationDate;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public Person getRegistrator()
+    {
+        if (getFetchOptions().hasRegistrator())
+        {
+            return registrator;
+        }
+        else
+        {
+            throw new NotFetchedException("Registrator has not been fetched.");
+        }
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setRegistrator(Person registrator)
+    {
+        this.registrator = registrator;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    @JsonIgnore
+    public Date getModificationDate()
+    {
+        return modificationDate;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public void setModificationDate(Date modificationDate)
+    {
+        this.modificationDate = modificationDate;
+    }
+
+}
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/dataset/DataSetFetchOptions.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/dataset/DataSetFetchOptions.java
index 06fafcc1ce9..d4eb2622462 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/dataset/DataSetFetchOptions.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/dataset/DataSetFetchOptions.java
@@ -17,6 +17,7 @@ package ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset;
 
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.DataSetFetchOptions;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.DataSetTypeFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.ExternalDataFetchOptions;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.experiment.ExperimentFetchOptions;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.person.PersonFetchOptions;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.property.PropertyFetchOptions;
@@ -46,6 +47,9 @@ public class DataSetFetchOptions implements Serializable
     @JsonProperty
     private DataSetFetchOptions contained;
 
+    @JsonProperty
+    private ExternalDataFetchOptions externalData;
+
     @JsonProperty
     private TagFetchOptions tags;
 
@@ -155,6 +159,28 @@ public class DataSetFetchOptions implements Serializable
         return contained != null;
     }
 
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public ExternalDataFetchOptions withExternalData()
+    {
+        if (externalData == null)
+        {
+            externalData = new ExternalDataFetchOptions();
+        }
+        return externalData;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public ExternalDataFetchOptions withExternalDataUsing(ExternalDataFetchOptions fetchOptions)
+    {
+        return externalData = fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public boolean hasExternalData()
+    {
+        return externalData != null;
+    }
+
     // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
     public TagFetchOptions withTags()
     {
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/dataset/ExternalDataFetchOptions.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/dataset/ExternalDataFetchOptions.java
new file mode 100644
index 00000000000..50cf52beadd
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/dataset/ExternalDataFetchOptions.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright 2014 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.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset;
+
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.FileFormatTypeFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.LocatorTypeFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.vocabulary.VocabularyTermFetchOptions;
+import ch.systemsx.cisd.base.annotation.JsonObject;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
+/**
+ * Class automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+ */
+@JsonObject("dto.fetchoptions.dataset.ExternalDataFetchOptions")
+public class ExternalDataFetchOptions implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    @JsonProperty
+    private VocabularyTermFetchOptions storageFormatVocabularyTerm;
+
+    @JsonProperty
+    private FileFormatTypeFetchOptions fileFormatType;
+
+    @JsonProperty
+    private LocatorTypeFetchOptions locatorType;
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public VocabularyTermFetchOptions withStorageFormatVocabularyTerm()
+    {
+        if (storageFormatVocabularyTerm == null)
+        {
+            storageFormatVocabularyTerm = new VocabularyTermFetchOptions();
+        }
+        return storageFormatVocabularyTerm;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public VocabularyTermFetchOptions withStorageFormatVocabularyTermUsing(VocabularyTermFetchOptions fetchOptions)
+    {
+        return storageFormatVocabularyTerm = fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public boolean hasStorageFormatVocabularyTerm()
+    {
+        return storageFormatVocabularyTerm != null;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public FileFormatTypeFetchOptions withFileFormatType()
+    {
+        if (fileFormatType == null)
+        {
+            fileFormatType = new FileFormatTypeFetchOptions();
+        }
+        return fileFormatType;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public FileFormatTypeFetchOptions withFileFormatTypeUsing(FileFormatTypeFetchOptions fetchOptions)
+    {
+        return fileFormatType = fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public boolean hasFileFormatType()
+    {
+        return fileFormatType != null;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public LocatorTypeFetchOptions withLocatorType()
+    {
+        if (locatorType == null)
+        {
+            locatorType = new LocatorTypeFetchOptions();
+        }
+        return locatorType;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public LocatorTypeFetchOptions withLocatorTypeUsing(LocatorTypeFetchOptions fetchOptions)
+    {
+        return locatorType = fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public boolean hasLocatorType()
+    {
+        return locatorType != null;
+    }
+
+}
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/dataset/FileFormatTypeFetchOptions.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/dataset/FileFormatTypeFetchOptions.java
new file mode 100644
index 00000000000..0e51ef2141e
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/dataset/FileFormatTypeFetchOptions.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2014 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.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset;
+
+import ch.systemsx.cisd.base.annotation.JsonObject;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
+/**
+ * Class automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+ */
+@JsonObject("dto.fetchoptions.dataset.FileFormatTypeFetchOptions")
+public class FileFormatTypeFetchOptions implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+}
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/dataset/LocatorTypeFetchOptions.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/dataset/LocatorTypeFetchOptions.java
new file mode 100644
index 00000000000..e32631e1a7e
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/dataset/LocatorTypeFetchOptions.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2014 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.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset;
+
+import ch.systemsx.cisd.base.annotation.JsonObject;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
+/**
+ * Class automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+ */
+@JsonObject("dto.fetchoptions.dataset.LocatorTypeFetchOptions")
+public class LocatorTypeFetchOptions implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+}
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/vocabulary/VocabularyFetchOptions.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/vocabulary/VocabularyFetchOptions.java
new file mode 100644
index 00000000000..095cdf1f8b2
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/vocabulary/VocabularyFetchOptions.java
@@ -0,0 +1,56 @@
+/*
+ * Copyright 2014 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.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.vocabulary;
+
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.person.PersonFetchOptions;
+import ch.systemsx.cisd.base.annotation.JsonObject;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
+/**
+ * Class automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+ */
+@JsonObject("dto.fetchoptions.vocabulary.VocabularyFetchOptions")
+public class VocabularyFetchOptions implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    @JsonProperty
+    private PersonFetchOptions registrator;
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public PersonFetchOptions withRegistrator()
+    {
+        if (registrator == null)
+        {
+            registrator = new PersonFetchOptions();
+        }
+        return registrator;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public PersonFetchOptions withRegistratorUsing(PersonFetchOptions fetchOptions)
+    {
+        return registrator = fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public boolean hasRegistrator()
+    {
+        return registrator != null;
+    }
+
+}
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/vocabulary/VocabularyTermFetchOptions.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/vocabulary/VocabularyTermFetchOptions.java
new file mode 100644
index 00000000000..6b4971f2b67
--- /dev/null
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/fetchoptions/vocabulary/VocabularyTermFetchOptions.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2014 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.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.vocabulary;
+
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.person.PersonFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.vocabulary.VocabularyFetchOptions;
+import ch.systemsx.cisd.base.annotation.JsonObject;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.io.Serializable;
+
+/**
+ * Class automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+ */
+@JsonObject("dto.fetchoptions.vocabulary.VocabularyTermFetchOptions")
+public class VocabularyTermFetchOptions implements Serializable
+{
+    private static final long serialVersionUID = 1L;
+
+    @JsonProperty
+    private VocabularyFetchOptions vocabulary;
+
+    @JsonProperty
+    private PersonFetchOptions registrator;
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public VocabularyFetchOptions withVocabulary()
+    {
+        if (vocabulary == null)
+        {
+            vocabulary = new VocabularyFetchOptions();
+        }
+        return vocabulary;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public VocabularyFetchOptions withVocabularyUsing(VocabularyFetchOptions fetchOptions)
+    {
+        return vocabulary = fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public boolean hasVocabulary()
+    {
+        return vocabulary != null;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public PersonFetchOptions withRegistrator()
+    {
+        if (registrator == null)
+        {
+            registrator = new PersonFetchOptions();
+        }
+        return registrator;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public PersonFetchOptions withRegistratorUsing(PersonFetchOptions fetchOptions)
+    {
+        return registrator = fetchOptions;
+    }
+
+    // Method automatically generated with {@link ch.ethz.sis.openbis.generic.shared.api.v3.dto.generators.DtoGenerator}
+    public boolean hasRegistrator()
+    {
+        return registrator != null;
+    }
+
+}
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/generators/Generator.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/generators/Generator.java
index 18999581f30..564e3639c51 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/generators/Generator.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/shared/api/v3/dto/generators/Generator.java
@@ -5,16 +5,26 @@ import java.util.LinkedList;
 import java.util.List;
 
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.attachment.Attachment;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.ArchivingStatus;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.Complete;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.DataSetType;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.ExternalData;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.FileFormatType;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.dataset.LocatorType;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.experiment.ExperimentType;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.person.Person;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.project.Project;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.sample.Sample;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.sample.SampleType;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.vocabulary.Vocabulary;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.entity.vocabulary.VocabularyTerm;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.EmptyFetchOptions;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.attachment.AttachmentFetchOptions;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.DataSetFetchOptions;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.DataSetTypeFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.ExternalDataFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.FileFormatTypeFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.dataset.LocatorTypeFetchOptions;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.experiment.ExperimentFetchOptions;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.experiment.ExperimentTypeFetchOptions;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.person.PersonFetchOptions;
@@ -23,6 +33,8 @@ import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.sample.SampleF
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.sample.SampleTypeFetchOptions;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.space.SpaceFetchOptions;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.tag.TagFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.vocabulary.VocabularyFetchOptions;
+import ch.ethz.sis.openbis.generic.shared.api.v3.dto.fetchoptions.vocabulary.VocabularyTermFetchOptions;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.id.dataset.DataSetPermId;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.id.entitytype.EntityTypePermId;
 import ch.ethz.sis.openbis.generic.shared.api.v3.dto.id.experiment.ExperimentIdentifier;
@@ -168,6 +180,7 @@ public class Generator extends AbstractGenerator
         gen.addFetchedField("List<DataSet>", List.class.getName(), "children", "Children", DataSetFetchOptions.class);
         gen.addFetchedField("List<DataSet>", List.class.getName(), "containers", "Container data sets", DataSetFetchOptions.class);
         gen.addFetchedField("List<DataSet>", List.class.getName(), "contained", "Contained data sets", DataSetFetchOptions.class);
+        gen.addFetchedField("ExternalData", ExternalData.class.getName(), "externalData", "External data", ExternalDataFetchOptions.class);
         addTags(gen);
 
         gen.addFetchedField(DataSetType.class, "type", "Data Set type", DataSetTypeFetchOptions.class);
@@ -200,6 +213,75 @@ public class Generator extends AbstractGenerator
         return gen;
     }
 
+    private static DtoGenerator createExternalDataGenerator()
+    {
+        DtoGenerator gen = new DtoGenerator("dataset", "ExternalData", ExternalDataFetchOptions.class);
+
+        gen.addStringField("shareId");
+        gen.addStringField("location");
+        gen.addSimpleField(Long.class, "size");
+        gen.addFetchedField(VocabularyTerm.class, "storageFormatVocabularyTerm", "Storage format vocabulary term", VocabularyTermFetchOptions.class);
+        gen.addFetchedField(FileFormatType.class, "fileFormatType", "File Format Type", FileFormatTypeFetchOptions.class);
+        gen.addFetchedField(LocatorType.class, "locatorType", "Locator Type", LocatorTypeFetchOptions.class);
+        gen.addSimpleField(Complete.class, "complete");
+        gen.addSimpleField(ArchivingStatus.class, "status");
+        gen.addBooleanField("presentInArchive");
+        gen.addBooleanField("storageConfirmation");
+        gen.addSimpleField(Integer.class, "speedHint");
+
+        return gen;
+    }
+
+    private static DtoGenerator createFileFormatType()
+    {
+        DtoGenerator gen = new DtoGenerator("dataset", "FileFormatType", FileFormatTypeFetchOptions.class);
+
+        gen.addStringField("code");
+        gen.addStringField("description");
+
+        return gen;
+    }
+
+    private static DtoGenerator createLocatorType()
+    {
+        DtoGenerator gen = new DtoGenerator("dataset", "LocatorType", LocatorTypeFetchOptions.class);
+
+        gen.addStringField("code");
+        gen.addStringField("description");
+
+        return gen;
+    }
+
+    private static DtoGenerator createVocabulary()
+    {
+        DtoGenerator gen = new DtoGenerator("vocabulary", "Vocabulary", VocabularyFetchOptions.class);
+
+        addCode(gen);
+        addDescription(gen);
+        addRegistrationDate(gen);
+        addRegistrator(gen);
+        addModificationDate(gen);
+
+        return gen;
+    }
+
+    private static DtoGenerator createVocabularyTerm()
+    {
+        DtoGenerator gen = new DtoGenerator("vocabulary", "VocabularyTerm", VocabularyTermFetchOptions.class);
+
+        addCode(gen);
+        gen.addStringField("label");
+        addDescription(gen);
+        gen.addSimpleField(Long.class, "ordinal");
+        gen.addBooleanField("official");
+        gen.addFetchedField(Vocabulary.class, "vocabulary", "Vocabulary", VocabularyFetchOptions.class);
+        addRegistrationDate(gen);
+        addRegistrator(gen);
+        addModificationDate(gen);
+
+        return gen;
+    }
+
     private static DtoGenerator createPersonGenerator()
     {
         DtoGenerator gen = new DtoGenerator("person", "Person", PersonFetchOptions.class);
-- 
GitLab