diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
index 0facda344807d0c9428d09b8e961b6e378dbdd8f..16fc8cf5dc0c3493f4553ba7090bd1c64ef8f825 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
@@ -667,6 +667,11 @@ public abstract class Dict
 
     public static final String DATASET_NOT_AVAILABLE_MSG = "dataset_not_available_msg";
 
+    public static final String LINKED_DATA_SET = "linked_data_set";
+
+    public static final String LINKED_DATA_SET_URL_NOT_AVAILABLE_MSG =
+            "linked_data_set_url_not_available";
+
     //
     // Sample Registration
     //
@@ -782,6 +787,8 @@ public abstract class Dict
     // Data Set Edition
     //
 
+    public static final String EXTERNAL_CODE = "external_code";
+
     public static final String PARENTS = "parents";
 
     public static final String PARENTS_EMPTY = "parents_empty";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalDataGridColumnIDs.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalDataGridColumnIDs.java
index 84745625c01054347573e3ed1a4047f71949d5b5..5206beb69407bb6c5730fcc2a8323f1f1f1511da 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalDataGridColumnIDs.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalDataGridColumnIDs.java
@@ -23,6 +23,12 @@ public class ExternalDataGridColumnIDs
 {
     public static final String CODE = "CODE";
 
+    public static final String EXTERNAL_CODE = "EXTERNAL_CODE";
+
+    public static final String EXTERNAL_DMS_CODE = "EXTERNAL_DMS_CODE";
+
+    public static final String EXTERNAL_DMS_LABEL = "EXTERNAL_DMS_LABEL";
+
     public static final String DATA_SET_TYPE = "DATA_SET_TYPE";
 
     public static final String CONTAINER_DATASET = "CONTAINER_DATASET";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExternalDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExternalDataProvider.java
index 1881fe29dcf89f7348005131f973e6bd6cb5e945..7b102894603c41d26919ac69bfae3bc5919d1dfb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExternalDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/AbstractExternalDataProvider.java
@@ -24,8 +24,11 @@ import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDat
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.DATA_STORE_CODE;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.EXPERIMENT;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.EXPERIMENT_TYPE;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.EXTERNAL_CODE;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.EXTERNAL_DATA_EXPERIMENT_IDENTIFIER;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.EXTERNAL_DATA_SAMPLE_IDENTIFIER;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.EXTERNAL_DMS_CODE;
+import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.EXTERNAL_DMS_LABEL;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.FILE_FORMAT_TYPE;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.IS_COMPLETE;
 import static ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalDataGridColumnIDs.IS_DELETED;
@@ -57,7 +60,11 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 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.LinkDataSet;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSetUrl;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkTableCell;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TypedTableModel;
@@ -81,6 +88,7 @@ public abstract class AbstractExternalDataProvider extends
         List<ExternalData> dataSets = getDataSets();
         TypedTableModelBuilder<ExternalData> builder = new TypedTableModelBuilder<ExternalData>();
         builder.addColumn(CODE).withDefaultWidth(150);
+        builder.addColumn(EXTERNAL_CODE).withDefaultWidth(150).hideByDefault();
         builder.addColumn(DATA_SET_TYPE).withDefaultWidth(200);
         builder.addColumn(CONTAINER_DATASET).withDefaultWidth(150).hideByDefault();
         builder.addColumn(ORDER_IN_CONTAINER).withDefaultWidth(100).hideByDefault();
@@ -106,12 +114,33 @@ public abstract class AbstractExternalDataProvider extends
         builder.addColumn(PRODUCTION_DATE).withDefaultWidth(200).hideByDefault();
         builder.addColumn(DATA_PRODUCER_CODE).hideByDefault();
         builder.addColumn(DATA_STORE_CODE).hideByDefault();
+        builder.addColumn(EXTERNAL_DMS_CODE).withDefaultWidth(150).hideByDefault();
+        builder.addColumn(EXTERNAL_DMS_LABEL).withDefaultWidth(150).hideByDefault();
         builder.addColumn(PERM_ID).hideByDefault();
         builder.addColumn(SHOW_DETAILS_LINK).hideByDefault();
         for (ExternalData dataSet : dataSets)
         {
             builder.addRow(dataSet);
             builder.column(CODE).addEntityLink(dataSet, dataSet.getCode());
+
+            LinkDataSet linkDataSet = dataSet.tryGetAsLinkDataSet();
+            if (linkDataSet != null)
+            {
+                LinkTableCell externalCodeCell = new LinkTableCell();
+                externalCodeCell.setText(linkDataSet.getExternalCode());
+                externalCodeCell.setUrl(new LinkDataSetUrl(linkDataSet).toString());
+                externalCodeCell.setOpenInNewWindow(true);
+                builder.column(EXTERNAL_CODE).addValue(externalCodeCell);
+
+                ExternalDataManagementSystem externalDms =
+                        linkDataSet.getExternalDataManagementSystem();
+                if (externalDms != null)
+                {
+                    builder.column(EXTERNAL_DMS_CODE).addString(externalDms.getCode());
+                    builder.column(EXTERNAL_DMS_LABEL).addString(externalDms.getLabel());
+                }
+            }
+
             builder.column(DATA_SET_TYPE).addString(dataSet.getDataSetType().getCode());
             ContainerDataSet container = dataSet.tryGetContainer();
             if (container != null)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java
index 565239c837a6260942d271298cc2b78fa7d21945..d510ade54a33c4d069a3a04dc015149c726f5a76 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataBO.java
@@ -558,19 +558,6 @@ public class DataBO extends AbstractDataSetBusinessObject implements IDataBO
             checkSameSpace(data.getContainer(), data);
         }
 
-        if (data.isLinkData())
-        {
-            LinkDataPE linkData = data.tryAsLinkData();
-            linkData.setExternalCode(updates.getExternalCode());
-
-            ExternalDataManagementSystemPE pe =
-                    getExternalDataManagementSystemDAO()
-                            .tryToFindExternalDataManagementSystemByCode(
-                                    updates.getExternalDataManagementSystemCode());
-
-            linkData.setExternalDataManagementSystem(pe);
-        }
-
         setParents(data, asList(updates.getModifiedParentDatasetCodesOrNull()));
         updateComponents(updates.getModifiedContainedDatasetCodesOrNull());
         checkSameSpace(data, data.getContainedDataSets()); // even if components were not changed
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java
index 0a6a667a7508ca8994976542d70c3ba5a05736b6..31b75536c77c7cf214336358b55c7e4d6cf928ad 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTable.java
@@ -66,9 +66,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EntityTypePropertyTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataManagementSystemPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.LinkDataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
@@ -966,19 +964,6 @@ public final class DataSetTable extends AbstractDataSetBusinessObject implements
             checkSameSpace(dataSet.getContainer(), dataSet);
         }
 
-        if (dataSet.isLinkData())
-        {
-            LinkDataPE linkData = dataSet.tryAsLinkData();
-            linkData.setExternalCode(dataSetUpdates.getExternalCode());
-
-            String externalSystemCode = dataSetUpdates.getExternalDataManagementSystemCode();
-            ExternalDataManagementSystemPE externalSystem =
-                    getExternalDataManagementSystemDAO()
-                            .tryToFindExternalDataManagementSystemByCode(externalSystemCode);
-
-            linkData.setExternalDataManagementSystem(externalSystem);
-        }
-
         checkSameSpace(dataSet, dataSet.getContainedDataSets()); // even if components were not
                                                                  // changed
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/BasicConstant.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/BasicConstant.java
index 2e14c707553337b99550ef7d6148bf4f3a87469b..99a2e7ab106683e6fa26993492076493da35836c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/BasicConstant.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/BasicConstant.java
@@ -58,6 +58,18 @@ public class BasicConstant
     public static final String VOCABULARY_URL_TEMPLATE_TERM_PATTERN =
             VOCABULARY_URL_TEMPLATE_TERM_PART.replaceAll("\\$", "\\\\\\$");
 
+    /**
+     * Template part of an external DMS URL that is replaced with an external data set code.
+     */
+    public static final String EXTERNAL_DMS_URL_TEMPLATE_CODE_PART = "$code$";
+
+    /**
+     * Pattern for template part of an external DMS URL that is replaced with an external data set
+     * code.
+     */
+    public static final String EXTERNAL_DMS_URL_TEMPLATE_CODE_PATTERN =
+            EXTERNAL_DMS_URL_TEMPLATE_CODE_PART.replaceAll("\\$", "\\\\\\$");
+
     /**
      * Canonical date format pattern used to save dates in DB. Holds date, time and time zone
      * information. It is less readable then the one used in GUI (
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/URLMethodWithParameters.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/URLMethodWithParameters.java
index b6aacaa3ea6056641d7892b0c34267209f3e50ee..5c5f36073b5f6cceb0f8a2fb256e2f501d399ea3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/URLMethodWithParameters.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/URLMethodWithParameters.java
@@ -132,7 +132,7 @@ public class URLMethodWithParameters implements IsSerializable
     }
 
     /** Creates HTML which displays a link. */
-    public static String createEmbededLinkHtml(String linkText, String linkUrl)
+    public static String createEmbededLinkHtml(String linkText, String linkUrl, String linkAlign)
     {
         String linkStart = "", linkEnd = "";
         if (linkUrl != null)
@@ -141,6 +141,7 @@ public class URLMethodWithParameters implements IsSerializable
             linkEnd = "</a>";
         }
 
-        return "<div align='center'>" + linkStart + linkText + linkEnd + "</div>";
+        String align = linkAlign != null ? "align='" + linkAlign + "'" : "";
+        return "<div " + align + ">" + linkStart + linkText + linkEnd + "</div>";
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DssLinkTableCell.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DssLinkTableCell.java
index 0bf754c485d1ec3f825d192c4aa4ee17d0ec829c..23acb1d1a17ce9f72a0a075066d9a28ace9f7fe5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DssLinkTableCell.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DssLinkTableCell.java
@@ -89,7 +89,7 @@ public class DssLinkTableCell implements ISerializableComparable
     public String getHtmlString(String sessionId)
     {
         return URLMethodWithParameters.createEmbededLinkHtml(linkText,
-                getLinkUrl(linkModel, sessionId));
+                getLinkUrl(linkModel, sessionId), "center");
     }
 
     /**
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/LinkDataSetUrl.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/LinkDataSetUrl.java
new file mode 100644
index 0000000000000000000000000000000000000000..7357f1a5690136d1249ca9c2a907c61373431384
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/LinkDataSetUrl.java
@@ -0,0 +1,58 @@
+/*
+ * Copyright 2012 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
+import ch.systemsx.cisd.openbis.generic.shared.basic.BasicURLEncoder;
+
+/**
+ * @author pkupczyk
+ */
+public class LinkDataSetUrl
+{
+
+    private LinkDataSet dataset;
+
+    public LinkDataSetUrl(LinkDataSet dataset)
+    {
+        this.dataset = dataset;
+    }
+
+    protected String maybeUnescape(String str)
+    {
+        return str;
+    }
+
+    @Override
+    public String toString()
+    {
+        if (dataset.getExternalCode() != null && dataset.getExternalDataManagementSystem() != null
+                && dataset.getExternalDataManagementSystem().getUrlTemplate() != null)
+        {
+            String externalCode = maybeUnescape(dataset.getExternalCode());
+            String urlTemplate =
+                    maybeUnescape(dataset.getExternalDataManagementSystem().getUrlTemplate());
+
+            return urlTemplate.replaceAll(BasicConstant.EXTERNAL_DMS_URL_TEMPLATE_CODE_PATTERN,
+                    BasicURLEncoder.encode(externalCode));
+        } else
+        {
+            return null;
+        }
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/LinkTableCell.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/LinkTableCell.java
new file mode 100644
index 0000000000000000000000000000000000000000..7d64ea7af8264a81744412254bb84c0bd9b7dcdf
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/LinkTableCell.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright 2012 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.URLMethodWithParameters;
+
+/**
+ * @author pkupczyk
+ */
+public class LinkTableCell implements ISerializableComparable
+{
+    private static final long serialVersionUID = ServiceVersionHolder.VERSION;
+
+    private String text;
+
+    private String url;
+
+    private boolean openInNewWindow;
+
+    public LinkTableCell()
+    {
+    }
+
+    public void setText(String text)
+    {
+        this.text = text;
+    }
+
+    public String getText()
+    {
+        return text;
+    }
+
+    public void setUrl(String url)
+    {
+        this.url = url;
+    }
+
+    public String getUrl()
+    {
+        return url;
+    }
+
+    public void setOpenInNewWindow(boolean openInNewWindow)
+    {
+        this.openInNewWindow = openInNewWindow;
+    }
+
+    public boolean isOpenInNewWindow()
+    {
+        return openInNewWindow;
+    }
+
+    public String getHtmlString()
+    {
+        return URLMethodWithParameters.createEmbededLinkHtml(text, url, null);
+    }
+
+    @Override
+    public int compareTo(ISerializableComparable o)
+    {
+        return toString().compareTo(String.valueOf(o));
+    }
+
+    @Override
+    public boolean equals(Object obj)
+    {
+        if (this == obj)
+            return true;
+
+        if (!(obj instanceof LinkTableCell))
+            return false;
+
+        LinkTableCell other = (LinkTableCell) obj;
+        return other.toString().equals(toString());
+    }
+
+    @Override
+    public int hashCode()
+    {
+        return toString().hashCode();
+    }
+
+    @Override
+    public String toString()
+    {
+        return url != null ? url : "";
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/TypedTableGridColumnDefinition.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/TypedTableGridColumnDefinition.java
index 9e1f1353b711c46bea70d48f4b623882f2740447..bba96e8f7ae99520860e7c699bd0b4b6d741d3ca 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/TypedTableGridColumnDefinition.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/TypedTableGridColumnDefinition.java
@@ -91,6 +91,10 @@ public class TypedTableGridColumnDefinition<T extends Serializable> implements
         {
             return ((DssLinkTableCell) cell).getHtmlString(sessionID);
         }
+        if (cell instanceof LinkTableCell)
+        {
+            return ((LinkTableCell) cell).getHtmlString();
+        }
         return cell.toString();
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
index 6073949fc6a6ae52e2ac70f153dad644155724bf..6255c7f16dd39b1423a2a69a07f6e44ada6f641a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslator.java
@@ -310,6 +310,9 @@ public class DataSetTranslator
         } else if (dataPE.isExternalData())
         {
             result = new DataSet();
+        } else if (dataPE.isLinkData())
+        {
+            result = new LinkDataSet();
         } else
         {
             assert dataPE.isPlaceholder() == true;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetPropertiesPanel.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetPropertiesPanel.java
index 2f1fa8041c068837b92e24886f104bcd370aa459..64827ab52c56b381a1ca6b660f9125355ba4c3b0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetPropertiesPanel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetPropertiesPanel.java
@@ -83,8 +83,23 @@ public class DataSetPropertiesPanel extends ContentPanel
 
         properties.put(messageProvider.getMessage(Dict.DATA_SET),
                 new ExternalHyperlink(dataset.getPermId(), dataset.getPermlink()));
-        properties.put(messageProvider.getMessage(Dict.DATA_SET_TYPE), datasetType);
 
+        if (dataset.isLinkData())
+        {
+            LinkDataSetAnchor anchor =
+                    LinkDataSetAnchor.tryCreateWithExternalCodeAsText(dataset.tryGetAsLinkDataSet());
+
+            if (anchor != null)
+            {
+                properties.put(messageProvider.getMessage(Dict.LINKED_DATA_SET), anchor);
+            } else
+            {
+                properties.put(messageProvider.getMessage(Dict.LINKED_DATA_SET), dataset
+                        .tryGetAsLinkDataSet().getExternalCode());
+            }
+        }
+
+        properties.put(messageProvider.getMessage(Dict.DATA_SET_TYPE), datasetType);
         properties.put(messageProvider.getMessage(Dict.SOURCE_TYPE), dataset.getSourceType());
 
         properties.put(messageProvider.getMessage(Dict.DATA_PRODUCER_CODE),
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetEditForm.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetEditForm.java
index 96be00796f0208f5dcebc48368acf5ec4561785c..1dd565dfab7d9f6744e2f07eb9b895258a9913f4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetEditForm.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetEditForm.java
@@ -40,11 +40,13 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.Da
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.FileFormatTypeSelectionWidget;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.FileFormatTypeSelectionWidget.FileFormatTypeModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.CheckBoxField;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.CodeField;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ExperimentChooserField;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.ExperimentChooserField.ExperimentChooserFieldAdaptor;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserField;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.SampleChooserField.SampleChooserFieldAdaptor;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.FieldUtil;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.lang.StringEscapeUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DataSetUpdates;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentIdentifier;
@@ -58,6 +60,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetTypePropertyType
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientServiceAsync;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.AbstractGenericEntityRegistrationForm;
@@ -212,10 +215,7 @@ public final class GenericDataSetEditForm extends
         fields.add(wrapUnaware(sampleChooser.getField()));
         fields.add(wrapUnaware(experimentChooser.getField()));
         fields.add(wrapUnaware(parentsArea));
-        for (DatabaseModificationAwareField<?> field : builder.getEntitySpecificFormFields())
-        {
-            fields.add(field);
-        }
+        builder.addEntitySpecificFormFields(fields);
         return fields;
     }
 
@@ -318,10 +318,17 @@ public final class GenericDataSetEditForm extends
     private void setOriginalData(ExternalData data)
     {
         this.originalDataSet = data;
-        this.builder =
-                data.isContainer() ? new ContainerDataSetEditFormBuilder(
-                        data.tryGetAsContainerDataSet()) : new ExternalDataEditFormBuilder(
-                        data.tryGetAsDataSet());
+
+        if (data.isContainer())
+        {
+            this.builder = new ContainerDataSetEditFormBuilder(data.tryGetAsContainerDataSet());
+        } else if (data.isLinkData())
+        {
+            this.builder = new LinkDataSetEditFormBuilder(data.tryGetAsLinkDataSet());
+        } else
+        {
+            this.builder = new ExternalDataEditFormBuilder(data.tryGetAsDataSet());
+        }
     }
 
     @Override
@@ -389,7 +396,7 @@ public final class GenericDataSetEditForm extends
 
         void fillUpdates(DataSetUpdates result);
 
-        List<DatabaseModificationAwareField<?>> getEntitySpecificFormFields();
+        void addEntitySpecificFormFields(List<DatabaseModificationAwareField<?>> fields);
 
         void createEntitySpecificFormFields();
 
@@ -434,12 +441,9 @@ public final class GenericDataSetEditForm extends
         }
 
         @Override
-        public List<DatabaseModificationAwareField<?>> getEntitySpecificFormFields()
+        public void addEntitySpecificFormFields(List<DatabaseModificationAwareField<?>> fields)
         {
-            ArrayList<DatabaseModificationAwareField<?>> fields =
-                    new ArrayList<DatabaseModificationAwareField<?>>();
             fields.add(wrapUnaware(fileFormatTypeSelectionWidget));
-            return fields;
         }
 
         @Override
@@ -496,12 +500,9 @@ public final class GenericDataSetEditForm extends
         }
 
         @Override
-        public List<DatabaseModificationAwareField<?>> getEntitySpecificFormFields()
+        public void addEntitySpecificFormFields(List<DatabaseModificationAwareField<?>> fields)
         {
-            ArrayList<DatabaseModificationAwareField<?>> fields =
-                    new ArrayList<DatabaseModificationAwareField<?>>();
             fields.add(wrapUnaware(containedArea));
-            return fields;
         }
 
         @Override
@@ -547,4 +548,59 @@ public final class GenericDataSetEditForm extends
 
     }
 
+    /** {@link IDataSetEditorBuilder} implementation for {@link LinkDataSet}-s */
+    private class LinkDataSetEditFormBuilder implements IDataSetEditorBuilder
+    {
+        private LinkDataSet dataSet;
+
+        private CodeField externalCodeField;
+
+        public LinkDataSetEditFormBuilder(LinkDataSet dataSet)
+        {
+            this.dataSet = dataSet;
+        }
+
+        @Override
+        public void createEntitySpecificFormFields()
+        {
+            externalCodeField =
+                    new CodeField(viewContext, viewContext.getMessage(Dict.EXTERNAL_CODE));
+            externalCodeField.setId(getId() + "_externalCode");
+            externalCodeField.setReadOnly(true);
+            externalCodeField.setHideTrigger(true);
+            externalCodeField.disable();
+        }
+
+        @Override
+        public void updateOriginalValues(DataSetUpdateResult result)
+        {
+            // nothing to do
+        }
+
+        @Override
+        public void fillUpdates(DataSetUpdates result)
+        {
+            // nothing to do
+        }
+
+        @Override
+        public void addEntitySpecificFormFields(List<DatabaseModificationAwareField<?>> fields)
+        {
+            fields.add(0, wrapUnaware(externalCodeField));
+        }
+
+        @Override
+        public void initializeFormFields()
+        {
+            externalCodeField.setValue(StringEscapeUtils.unescapeHtml(dataSet.getExternalCode()));
+        }
+
+        @Override
+        public void loadDataInBackground()
+        {
+            // nothing to do
+        }
+
+    }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
index 1aa16f4e9d499457a34b08165306c604b5fb2b3d..da2fe5b6673b67887bb2e7bdbb1eb213259e9c3b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/GenericDataSetViewer.java
@@ -84,6 +84,8 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
 
     protected final TechId datasetId;
 
+    private boolean toolbarInitialized;
+
     public static DatabaseModificationAwareComponent create(
             final IViewContext<IGenericClientServiceAsync> localViewContext,
             final IIdAndCodeHolder identifiable)
@@ -108,7 +110,6 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
         setLayout(new BorderLayout());
         this.datasetId = TechId.create(identifiable);
         this.processButtonHolder = new ProcessButtonHolder();
-        extendToolBar();
     }
 
     private IViewContext<?> getViewContext()
@@ -148,33 +149,45 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
         super.fillBreadcrumbWidgets(widgets);
     }
 
-    private void extendToolBar()
+    private void extendToolBar(final ExternalData result)
     {
-        Button exportButton = new Button(viewContext.getMessage(Dict.BUTTON_UPLOAD_DATASETS));
-        exportButton.addListener(Events.Select, new Listener<BaseEvent>()
-            {
-                @Override
-                public void handleEvent(BaseEvent be)
+        if (toolbarInitialized)
+        {
+            return;
+        } else
+        {
+            toolbarInitialized = true;
+        }
+
+        if (result.isLinkData() == false)
+        {
+            Button exportButton = new Button(viewContext.getMessage(Dict.BUTTON_UPLOAD_DATASETS));
+            exportButton.addListener(Events.Select, new Listener<BaseEvent>()
                 {
-                    TableModelRowWithObject<ExternalData> row =
-                            new TableModelRowWithObject<ExternalData>(originalData, Arrays
-                                    .<ISerializableComparable> asList());
-                    @SuppressWarnings("unchecked")
-                    final List<TableModelRowWithObject<ExternalData>> dataSets =
-                            Arrays.<TableModelRowWithObject<ExternalData>> asList(row);
-                    IDelegatedActionWithResult<SelectedAndDisplayedItems> action =
-                            new IDelegatedActionWithResult<SelectedAndDisplayedItems>()
-                                {
-                                    @Override
-                                    public SelectedAndDisplayedItems execute()
+                    @Override
+                    public void handleEvent(BaseEvent be)
+                    {
+                        TableModelRowWithObject<ExternalData> row =
+                                new TableModelRowWithObject<ExternalData>(originalData, Arrays
+                                        .<ISerializableComparable> asList());
+                        @SuppressWarnings("unchecked")
+                        final List<TableModelRowWithObject<ExternalData>> dataSets =
+                                Arrays.<TableModelRowWithObject<ExternalData>> asList(row);
+                        IDelegatedActionWithResult<SelectedAndDisplayedItems> action =
+                                new IDelegatedActionWithResult<SelectedAndDisplayedItems>()
                                     {
-                                        return new SelectedAndDisplayedItems(dataSets, null, 1);
-                                    }
-                                };
-                    new DataSetUploadConfirmationDialog(dataSets, action, 1, viewContext).show();
-                }
-            });
-        addToolBarButton(exportButton);
+                                        @Override
+                                        public SelectedAndDisplayedItems execute()
+                                        {
+                                            return new SelectedAndDisplayedItems(dataSets, null, 1);
+                                        }
+                                    };
+                        new DataSetUploadConfirmationDialog(dataSets, action, 1, viewContext)
+                                .show();
+                    }
+                });
+            addToolBarButton(exportButton);
+        }
         if (getViewContext().isSimpleOrEmbeddedMode())
         {
             return;
@@ -253,8 +266,13 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
             container.addSection(panel);
         }
         // data
-        final TabContent dataSection = new DataViewSection(context, dataset);
-        container.addSection(dataSection);
+        if (dataset.isLinkData())
+        {
+            container.addSection(new LinkDataViewSection(context, dataset.tryGetAsLinkDataSet()));
+        } else
+        {
+            container.addSection(new DataViewSection(context, dataset));
+        }
 
         if (dataset.isContainer())
         {
@@ -306,6 +324,7 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
         @Override
         protected final void process(final ExternalData result)
         {
+            genericDataSetViewer.extendToolBar(result);
             genericDataSetViewer.updateOriginalData(result);
             DataSet dataSet = result.tryGetAsDataSet();
             if (dataSet != null && dataSet.getStatus().isAvailable() == false)
@@ -322,7 +341,6 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
             genericDataSetViewer.add(rightPanel, createRightBorderLayoutData());
 
             genericDataSetViewer.layout();
-
         }
 
         @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/LinkDataSetAnchor.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/LinkDataSetAnchor.java
new file mode 100644
index 0000000000000000000000000000000000000000..bb020a8f31b40176003854e72c966e94dd057ea9
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/LinkDataSetAnchor.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2012 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset;
+
+import com.google.gwt.user.client.ui.Anchor;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.lang.StringEscapeUtils;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSet;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSetUrl;
+
+/**
+ * @author pkupczyk
+ */
+public class LinkDataSetAnchor extends Anchor
+{
+
+    private LinkDataSetAnchor(String text, String url)
+    {
+        super(text, url);
+        setTarget("_blank");
+    }
+
+    public static final LinkDataSetAnchor tryCreateWithExternalCodeAsText(LinkDataSet dataset)
+    {
+        String url = new UnescapingLinkDataSetUrl(dataset).toString();
+
+        if (url != null)
+        {
+            return new LinkDataSetAnchor(StringEscapeUtils.unescapeHtml(dataset.getExternalCode()),
+                    url);
+        } else
+        {
+            return null;
+        }
+    }
+
+    public static final LinkDataSetAnchor tryCreateWithUrlAsText(LinkDataSet dataset)
+    {
+        String url = new UnescapingLinkDataSetUrl(dataset).toString();
+
+        if (url != null)
+        {
+            return new LinkDataSetAnchor(url, url);
+        } else
+        {
+            return null;
+        }
+    }
+
+    private static class UnescapingLinkDataSetUrl extends LinkDataSetUrl
+    {
+        public UnescapingLinkDataSetUrl(LinkDataSet dataset)
+        {
+            super(dataset);
+        }
+
+        @Override
+        protected String maybeUnescape(String str)
+        {
+            return StringEscapeUtils.unescapeHtml(str);
+        }
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/LinkDataViewSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/LinkDataViewSection.java
new file mode 100644
index 0000000000000000000000000000000000000000..1a360f7f0ee6c557ecca01421c413370aff1066c
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/LinkDataViewSection.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright 2012 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset;
+
+import com.google.gwt.user.client.ui.Label;
+import com.google.gwt.user.client.ui.Panel;
+import com.google.gwt.user.client.ui.SimplePanel;
+
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.TabContent;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSet;
+
+/**
+ * @author pkupczyk
+ */
+public class LinkDataViewSection extends TabContent
+{
+    private final LinkDataSet dataset;
+
+    public LinkDataViewSection(final IViewContext<?> viewContext, final LinkDataSet dataset)
+    {
+        super(viewContext.getMessage(Dict.DATA_VIEW), viewContext, dataset);
+        this.dataset = dataset;
+        setIds(DisplayTypeIDGenerator.DATA_SET_DATA_SECTION);
+    }
+
+    @Override
+    protected void showContent()
+    {
+        Panel content = new SimplePanel();
+        content.setStyleName("linkDataViewContent");
+
+        LinkDataSetAnchor anchor = LinkDataSetAnchor.tryCreateWithUrlAsText(dataset);
+
+        if (anchor != null)
+        {
+            content.add(anchor);
+        } else
+        {
+            content.add(new Label(viewContext
+                    .getMessage(Dict.LINKED_DATA_SET_URL_NOT_AVAILABLE_MSG)));
+        }
+
+        add(content);
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
index e721802e263a25c7507b6eaafdded9270c6962f7..79c67b3f7fe041da76bd61905cf5e64aa6a0d7d4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/common-dictionary.js
@@ -732,6 +732,9 @@ var common = {
  confirm_dataset_upload_comment_field: "Comment",
  confirm_dataset_upload_user_field: "CIFEX user",
  confirm_dataset_upload_password_field: "CIFEX password",
+ external_code: "External Code",
+ external_dms_code: "External DMS Code",
+ external_dms_label: "External DMS Label",
  
  //
  // Data Set Viewer
@@ -740,6 +743,8 @@ var common = {
  processing_info_title: "Processing",
  processing_info_msg: "'{0}' has been scheduled successfully. Email will be send to you when it is finished.",
  dataset_not_available_msg: "Data Set {0} is {1}. You can not perform any operation using its data.",
+ linked_data_set: "Linked Data Set",
+ linked_data_set_url_not_available: "A link to an external DMS is not available.",
  
  //
  // Material Browser
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/public/css/openbis.css b/openbis/source/java/ch/systemsx/cisd/openbis/public/css/openbis.css
index 60d5c0fe3407f30bf6835a9aa0fec79b3582dce8..a3797d82eab0400d2a27a4c889cf0de65f1c9a7b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/public/css/openbis.css
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/public/css/openbis.css
@@ -297,3 +297,11 @@ body,div,td,.default-text {
 	margin: 10px;
 	margin-bottom: 0px;
 }
+
+/********************
+ * Link data set
+ ********************/
+ 
+.linkDataViewContent {
+	margin: 10px;	
+}
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DssLinkTableCellTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DssLinkTableCellTest.java
index 1fc188e0f20c61a940747523e19d1dfb685c2c4a..695db56ce658e726dc5662548fd833bc5d044aad 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DssLinkTableCellTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DssLinkTableCellTest.java
@@ -33,7 +33,8 @@ public class DssLinkTableCellTest extends AssertJUnit
         urlMethod.addParameter(LinkModel.SESSION_ID_PARAMETER_NAME, "sessionToken");
 
         String basicHtml =
-                URLMethodWithParameters.createEmbededLinkHtml("linkText", urlMethod.toString());
+                URLMethodWithParameters.createEmbededLinkHtml("linkText", urlMethod.toString(),
+                        "center");
         assertEquals(basicHtml, cellHtml);
     }
 }