diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetUpdatable.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetUpdatable.java
index ab51cd279c3a8a6e65427c7a39e4e5e6ac63343b..c06b321684f9f379942b311c71b53e9cc7838e99 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetUpdatable.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/IDataSetUpdatable.java
@@ -20,6 +20,7 @@ import java.util.List;
 
 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.IExternalDataManagementSystemImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.ISampleImmutable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 
@@ -65,4 +66,8 @@ public interface IDataSetUpdatable extends IDataSetImmutable
 
     /** Set the codes for contained data sets. */
     public void setContainedDataSetCodes(List<String> containedDataSetCodes);
+
+    /** Set the external data management system */
+    public void setExternalDataManagementSystem(
+            IExternalDataManagementSystemImmutable externalDataManagementSystem);
 }
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 1b41d0094bd562588d68a16c474f1fd45f79c78d..3a43eece4d568d6c6ec259ec450f836e6dd22832 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
@@ -28,6 +28,7 @@ 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.IExternalDataManagementSystemImmutable;
 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;
@@ -44,7 +45,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifi
  * 
  * @author Chandrasekhar Ramakrishnan
  */
-public class DataSet<T extends DataSetInformation> extends AbstractDataSetImmutable implements IDataSet
+public class DataSet<T extends DataSetInformation> extends AbstractDataSetImmutable implements
+        IDataSet
 {
     private final DataSetRegistrationDetails<? extends T> registrationDetails;
 
@@ -55,6 +57,8 @@ public class DataSet<T extends DataSetInformation> extends AbstractDataSetImmuta
 
     private ISampleImmutable sampleOrNull;
 
+    private IExternalDataManagementSystemImmutable externalDataManagementSystemOrNull;
+
     public DataSet(DataSetRegistrationDetails<? extends T> registrationDetails, File dataSetFolder,
             IEncapsulatedOpenBISService service)
     {
@@ -301,7 +305,7 @@ public class DataSet<T extends DataSetInformation> extends AbstractDataSetImmuta
                 + "sets not existing prior the transaction start.");
     }
 
-    //the dataset cannot be contained before it is created
+    // the dataset cannot be contained before it is created
     @Override
     public boolean isContainedDataSet()
     {
@@ -313,4 +317,29 @@ public class DataSet<T extends DataSetInformation> extends AbstractDataSetImmuta
     {
         return null;
     }
+
+    @Override
+    public void setExternalDataManagementSystem(
+            IExternalDataManagementSystemImmutable externalDataManagementSystem)
+    {
+        this.externalDataManagementSystemOrNull = externalDataManagementSystem;
+        String codeToSet =
+                (externalDataManagementSystem != null) ? externalDataManagementSystem.getCode()
+                        : null;
+
+        this.registrationDetails.getDataSetInformation().setExternalDataManagementSystem(codeToSet);
+    }
+
+    @Override
+    public boolean isLinkDataSet()
+    {
+        return this.externalDataManagementSystemOrNull != null;
+    }
+
+    @Override
+    public IExternalDataManagementSystemImmutable getExternalDataManagementSystem()
+    {
+        return externalDataManagementSystemOrNull;
+    }
+
 }
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 b6fdf50998638d1241da0dd890fe2fb2063e5a6e..1569192b93ed8bd72b0fb4c78072c662328e8825 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
@@ -23,11 +23,13 @@ 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.IExternalDataManagementSystemImmutable;
 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.ContainerDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystem;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.util.EntityHelper;
 
@@ -188,4 +190,24 @@ public class DataSetImmutable extends AbstractDataSetImmutable
         }
         return result;
     }
+
+    @Override
+    public boolean isLinkDataSet()
+    {
+        return dataSet.tryGetAsLinkDataSet() != null;
+    }
+
+    @Override
+    public IExternalDataManagementSystemImmutable getExternalDataManagementSystem()
+    {
+        ExternalDataManagementSystem externalDMS =
+                dataSet.tryGetAsLinkDataSet().getExternalDataManagementSystem();
+        if (externalDMS != null)
+        {
+            return new ExternalDataManagementSystemImmutable(externalDMS);
+        } else
+        {
+            return null;
+        }
+    }
 }
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 8d7005b3d96d0047ffdaa36fc0a9ae72d9d56876..22fa2059c0b40c3e93088ffbe1e0cfbb1ccbce53 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
@@ -25,10 +25,12 @@ import java.util.Set;
 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.IExternalDataManagementSystemImmutable;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.ISampleImmutable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetBatchUpdateDetails;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystem;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PlaceholderDataSet;
@@ -202,4 +204,16 @@ public class DataSetUpdatable extends DataSetImmutable implements IDataSetUpdata
         return updates;
     }
 
+    @Override
+    public void setExternalDataManagementSystem(
+            IExternalDataManagementSystemImmutable externalDataManagementSystem)
+    {
+
+        ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystem dummy =
+                new ExternalDataManagementSystem();
+        dummy.setCode(externalDataManagementSystem.getCode());
+
+        dataSet.tryGetAsLinkDataSet().setExternalDataManagementSystem(dummy);
+    }
+
 }
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 cbab00ee1b35773a1fb084ee7d6a005914f8995b..8b17efb3d678a2cf6f3441308414769f29e2e8eb 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
@@ -73,7 +73,7 @@ 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.
@@ -127,5 +127,10 @@ public interface IDataSetImmutable
      * Return the code of the container in which this data set is contained
      */
     public String getContainerDataSet();
-    
+
+    /** @return true if this is a data set, that links to external data management system */
+    public boolean isLinkDataSet();
+
+    /** Get the external data management system */
+    public IExternalDataManagementSystemImmutable getExternalDataManagementSystem();
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/DataSetInformation.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/DataSetInformation.java
index 68d51bb95b59033d3a20a26ddf4b7448fbf112ca..2b2d28ae020537b74b9f7c2e105b6d208cc2d115 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/DataSetInformation.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/dto/DataSetInformation.java
@@ -78,7 +78,7 @@ public class DataSetInformation implements Serializable
 
     /** sample with properties, enriched with connected experiment with properties. */
     private transient Sample sample;
-    
+
     private transient boolean linkSample = true;
 
     private transient Experiment experiment;
@@ -87,6 +87,8 @@ public class DataSetInformation implements Serializable
 
     private List<String> containedDataSetCodes = new ArrayList<String>();
 
+    private String externalDataManagementSystem;
+
     /**
      * A subset of {@link NewExternalData} which gets set by the code extractor.
      * <p>
@@ -385,6 +387,21 @@ public class DataSetInformation implements Serializable
         return false == containedDataSetCodes.isEmpty();
     }
 
+    public void setExternalDataManagementSystem(final String code)
+    {
+        this.externalDataManagementSystem = code;
+    }
+
+    public String getExternalDataManagementSystem()
+    {
+        return this.externalDataManagementSystem;
+    }
+
+    public boolean isLinkDataSet()
+    {
+        return this.externalDataManagementSystem != null;
+    }
+
     public final String describe()
     {
         if (experimentIdentifier == null)