diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/LinkRenderer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/LinkRenderer.java
new file mode 100644
index 0000000000000000000000000000000000000000..0c675fd2ddeebe5249b6628d948c7df4fd629fcb
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/renderer/LinkRenderer.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright 2009 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.client.web.client.application.renderer;
+
+import com.google.gwt.user.client.DOM;
+import com.google.gwt.user.client.Element;
+
+/**
+ * 
+ *
+ * @author Franz-Josef Elmer
+ */
+public class LinkRenderer
+{
+
+    public static String renderAsLink(final String message)
+    {
+        final Element div = DOM.createDiv();
+        div.setInnerText(message);
+        div.setClassName("link-style");
+        return DOM.toString(div);
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/framework/AbstractColumnDefinitionKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/framework/AbstractColumnDefinitionKind.java
index b29e54a1dc3849809f861ffdd6bcb0fdaa3ea38e..364fef2e840d707328a628c98f8b03f3bd3f31aa 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/framework/AbstractColumnDefinitionKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/framework/AbstractColumnDefinitionKind.java
@@ -16,6 +16,7 @@
 
 package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework;
 
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.LinkRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.renderers.SimpleDateRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.renderers.SimplePersonRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.renderers.SimpleYesNoRenderer;
@@ -89,6 +90,11 @@ public abstract class AbstractColumnDefinitionKind<T>
     {
         return headerMsgKey;
     }
+    
+    protected String renderLink(String cellContent)
+    {
+        return LinkRenderer.renderAsLink(cellContent);
+    }
 
     protected String renderRegistrationDate(final AbstractRegistrationHolder entity)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/data/CommonExternalDataColDefKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/data/CommonExternalDataColDefKind.java
index c6cbf8fc3e31cbcad20a35481dd57c02d5fb6976..78c361d3b9a73ba5d777b1a9b1e0a79927df64ee 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/data/CommonExternalDataColDefKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/data/CommonExternalDataColDefKind.java
@@ -33,7 +33,7 @@ public enum CommonExternalDataColDefKind implements IColumnDefinitionKind<Extern
             @Override
             public String tryGetValue(ExternalData entity)
             {
-                return entity.getCode();
+                return renderLink(entity.getCode());
             }
         }),
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalData.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalData.java
index 0c9a82770c9670e3c2ab40a9bf1bb12b7ca87a80..cfd3cc2b79d82443c88db9a07aa51f88e3935530 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalData.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/ExternalData.java
@@ -32,6 +32,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.ExternalDataPE;
 public class ExternalData extends CodeWithRegistration<ExternalData> implements
         IInvalidationProvider
 {
+    private String dataStoreBaseURL;
+    
     private ProcedureType procedureType;
 
     private boolean derived;
@@ -223,4 +225,14 @@ public class ExternalData extends CodeWithRegistration<ExternalData> implements
     {
         this.sampleProperties = sampleProperties;
     }
+
+    public final String getDataStoreBaseURL()
+    {
+        return dataStoreBaseURL;
+    }
+
+    public final void setDataStoreBaseURL(String dataStoreBaseURL)
+    {
+        this.dataStoreBaseURL = dataStoreBaseURL;
+    }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index 58c327fc7b0a3e3e4600b67d31a0cd6f302bbbed..5510b28bb65a14307adc4ea233e0c251f802eaeb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
@@ -108,12 +108,14 @@ public final class CommonClientService extends AbstractClientService implements
         ICommonClientService
 {
     private final ICommonServer commonServer;
+    private final String dataStoreBaseURL;
 
     public CommonClientService(final ICommonServer commonServer,
-            final IRequestContextProvider requestContextProvider)
+            final IRequestContextProvider requestContextProvider, String dataStoreBaseURL)
     {
         super(requestContextProvider);
         this.commonServer = commonServer;
+        this.dataStoreBaseURL = dataStoreBaseURL;
     }
 
     @Override
@@ -631,7 +633,7 @@ public final class CommonClientService extends AbstractClientService implements
             final SampleIdentifier identifier = SampleIdentifierFactory.parse(sampleIdentifier);
             final List<ExternalDataPE> externalData =
                     commonServer.listExternalData(sessionToken, identifier);
-            return ExternalDataTranslator.translate(externalData);
+            return ExternalDataTranslator.translate(externalData, dataStoreBaseURL);
         } catch (final ch.systemsx.cisd.common.exceptions.UserFailureException e)
         {
             throw UserFailureExceptionTranslator.translate(e);
@@ -648,7 +650,7 @@ public final class CommonClientService extends AbstractClientService implements
                     new ExperimentIdentifierFactory(experimentIdentifier).createIdentifier();
             final List<ExternalDataPE> externalData =
                     commonServer.listExternalData(sessionToken, identifier);
-            return ExternalDataTranslator.translate(externalData);
+            return ExternalDataTranslator.translate(externalData, dataStoreBaseURL);
         } catch (final ch.systemsx.cisd.common.exceptions.UserFailureException e)
         {
             throw UserFailureExceptionTranslator.translate(e);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/translator/ExternalDataTranslator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/translator/ExternalDataTranslator.java
index 24ae9de569e95d6c79d5aa7914b38c52afcd5884..c9e697a4aeba2aebd2e44de72c1450a6588acd77 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/translator/ExternalDataTranslator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/translator/ExternalDataTranslator.java
@@ -49,12 +49,14 @@ public class ExternalDataTranslator
     {
     }
 
-    public static List<ExternalData> translate(List<ExternalDataPE> list)
+    public static List<ExternalData> translate(List<ExternalDataPE> list, String dataStoreBaseURL)
     {
         ArrayList<ExternalData> result = new ArrayList<ExternalData>(list.size());
         for (ExternalDataPE externalDataPE : list)
         {
-            result.add(translate(externalDataPE));
+            ExternalData data = translate(externalDataPE);
+            data.setDataStoreBaseURL(dataStoreBaseURL);
+            result.add(data);
         }
         return result;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
index 23a6dc572858aa6b13b3ced9a56f198ab7401008..aa11fb40ad50f3356f673e0333f030f84499015b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/AbstractServer.java
@@ -96,10 +96,10 @@ public abstract class AbstractServer<T extends IServer> implements IServer,
             final PersonPE person)
     {
         final RoleAssignmentPE roleAssignmentPE = new RoleAssignmentPE();
-        roleAssignmentPE.setPerson(person);
         roleAssignmentPE.setDatabaseInstance(daoFactory.getHomeDatabaseInstance());
         roleAssignmentPE.setRegistrator(registrator);
         roleAssignmentPE.setRole(RoleCode.ADMIN);
+        person.addRoleAssignment(roleAssignmentPE);
         return roleAssignmentPE;
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/RoleAssignmentTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/RoleAssignmentTable.java
index 077d2eb5042651e07e92e5ce063299011562da1e..202411559fd29660a0a29d89c167f9d7b6548bdb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/RoleAssignmentTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/RoleAssignmentTable.java
@@ -103,7 +103,7 @@ public final class RoleAssignmentTable extends AbstractBusinessObject implements
         }
         roleAssignment.setRegistrator(findRegistrator());
         roleAssignment.setRole(newRoleAssignment.getRole());
-        roleAssignment.setPerson(getPerson(newRoleAssignment.getUserId()));
+        getPerson(newRoleAssignment.getUserId()).addRoleAssignment(roleAssignment);
         roleAssignments.add(roleAssignment);
     }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IETLLIMSService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IETLLIMSService.java
index 89e780edbf38de7b659ce01d7db91c18f053bdee..d790e96b026794618af1e6eda6d9a5e51dd5c812 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IETLLIMSService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IETLLIMSService.java
@@ -97,7 +97,7 @@ public interface IETLLIMSService extends IWebService, IDataStoreInfoProvider, IS
      * Tries to return the data set specified by its code.
      */
     @Transactional
-    @RolesAllowed(RoleSet.ETL_SERVER)
+    @RolesAllowed(RoleSet.OBSERVER)
     public ExternalDataPE tryGetDataSet(String sessionToken, String dataSetCode)
             throws UserFailureException;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/PersonPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/PersonPE.java
index 3a984a8bc0a943017a4720308cc5ba1de2cc5784..2c8a1823b3cdf2807a5db917193a11afeae14abb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/PersonPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/PersonPE.java
@@ -45,6 +45,7 @@ import org.hibernate.validator.Email;
 import org.hibernate.validator.Length;
 import org.hibernate.validator.NotNull;
 
+import ch.rinn.restrictions.Friend;
 import ch.systemsx.cisd.common.collections.UnmodifiableSetDecorator;
 import ch.systemsx.cisd.common.utilities.ModifiedShortPrefixToStringStyle;
 import ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants;
@@ -59,6 +60,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstant
 @Table(name = TableNames.PERSONS_TABLE, uniqueConstraints =
     { @UniqueConstraint(columnNames =
         { ColumnNames.USER_COLUMN, ColumnNames.DATABASE_INSTANCE_COLUMN }) })
+@Friend(toClasses=RoleAssignmentPE.class)
 public final class PersonPE extends HibernateAbstractRegistrationHolder implements
         Comparable<PersonPE>, IIdHolder, Serializable
 {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ProcedurePE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ProcedurePE.java
index da59d99f3261f5cde0457abf3ec312dcad6958ca..7f3a98ab55ee6b3ec46b01f41f85943e85b227d4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ProcedurePE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/ProcedurePE.java
@@ -121,7 +121,10 @@ public class ProcedurePE implements IIdHolder, Serializable
 
     public void setExperiment(final ExperimentPE experiment)
     {
-        experiment.addProcedure(this);
+        if (experiment != null)
+        {
+            experiment.addProcedure(this);
+        }
     }
 
     @Transient
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/RoleAssignmentPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/RoleAssignmentPE.java
index 45d1e04b1037bed0c954b48556441e7aea3d7d4f..cc82138e19f631fc98b7bc727d1a7e9efd099b61 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/RoleAssignmentPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/RoleAssignmentPE.java
@@ -39,6 +39,7 @@ import org.apache.commons.lang.builder.ToStringBuilder;
 import org.hibernate.annotations.Check;
 import org.hibernate.validator.NotNull;
 
+import ch.rinn.restrictions.Private;
 import ch.systemsx.cisd.common.utilities.ModifiedShortPrefixToStringStyle;
 import ch.systemsx.cisd.openbis.generic.shared.GenericSharedConstants;
 import ch.systemsx.cisd.openbis.generic.shared.util.EqualsHashUtils;
@@ -89,21 +90,18 @@ public final class RoleAssignmentPE extends HibernateAbstractRegistrationHolder
     @NotNull(message = ValidationMessages.PERSON_NOT_NULL_MESSAGE)
     @ManyToOne(fetch = FetchType.EAGER)
     @JoinColumn(name = ColumnNames.PERSON_GRANTEE_COLUMN, updatable = false)
-    private final PersonPE getPersonInternal()
+    @Private
+    public final PersonPE getPersonInternal()
     {
         return person;
     }
 
-    final void setPersonInternal(final PersonPE person)
+    @Private
+    public final void setPersonInternal(final PersonPE person)
     {
         this.person = person;
     }
 
-    public final void setPerson(final PersonPE person)
-    {
-        person.addRoleAssignment(this);
-    }
-
     @Transient
     public final PersonPE getPerson()
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentAttachmentsSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentAttachmentsSection.java
index de6808fe4fa73c1b90a5a4cc56a7dd255c2fc48b..f54f640f993f72cf758b052b9c43bc4ef252b33f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentAttachmentsSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentAttachmentsSection.java
@@ -34,8 +34,6 @@ import com.extjs.gxt.ui.client.widget.grid.ColumnModel;
 import com.extjs.gxt.ui.client.widget.grid.Grid;
 import com.extjs.gxt.ui.client.widget.grid.GridCellRenderer;
 import com.extjs.gxt.ui.client.widget.layout.RowData;
-import com.google.gwt.user.client.DOM;
-import com.google.gwt.user.client.Element;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
@@ -47,6 +45,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.AttachmentModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.AttachmentVersionModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.renderer.LinkRenderer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.ColumnConfigFactory;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.URLMethodWithParameters;
@@ -273,7 +272,7 @@ public class ExperimentAttachmentsSection extends SectionPanel
                     {
                         return "";
                     }
-                    return createLink((String) value);
+                    return LinkRenderer.renderAsLink((String) value);
                 }
             });
         return column;
@@ -297,7 +296,7 @@ public class ExperimentAttachmentsSection extends SectionPanel
                     {
                         return "";
                     }
-                    return createLink((String) value);
+                    return LinkRenderer.renderAsLink((String) value);
                 }
             });
         return column;
@@ -332,18 +331,10 @@ public class ExperimentAttachmentsSection extends SectionPanel
                     {
                         final String message =
                                 messageProvider.getMessage(Dict.VERSIONS_TEMPLATE, versions.size());
-                        return createLink(message);
+                        return LinkRenderer.renderAsLink(message);
                     }
                 }
             });
         return column;
     }
-
-    static private String createLink(final String message)
-    {
-        final Element div = DOM.createDiv();
-        div.setInnerText(message);
-        div.setClassName("link-style");
-        return DOM.toString(div);
-    }
 }
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
index 413d51cee2afabe8b35e7a2bfcfa7af7351b8e05..1f690b4aeaaeb9b7fdc0bbe5aa849af044c98b0b 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/GenericSampleViewer.java
@@ -23,6 +23,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
+import com.extjs.gxt.ui.client.Events;
 import com.extjs.gxt.ui.client.Style.LayoutRegion;
 import com.extjs.gxt.ui.client.Style.Scroll;
 import com.extjs.gxt.ui.client.Style.SelectionMode;
@@ -32,6 +33,8 @@ import com.extjs.gxt.ui.client.data.BaseListLoader;
 import com.extjs.gxt.ui.client.data.ListLoader;
 import com.extjs.gxt.ui.client.data.ModelData;
 import com.extjs.gxt.ui.client.data.RpcProxy;
+import com.extjs.gxt.ui.client.event.GridEvent;
+import com.extjs.gxt.ui.client.event.Listener;
 import com.extjs.gxt.ui.client.store.ListStore;
 import com.extjs.gxt.ui.client.util.Margins;
 import com.extjs.gxt.ui.client.widget.Component;
@@ -50,8 +53,10 @@ import com.google.gwt.user.client.rpc.AsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericViewModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ExternalDataModel;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.SampleModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.AbstractViewer;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.ColumnConfigFactory;
@@ -59,6 +64,9 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.Propert
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.sample.CommonSampleColDefKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.property.PropertyGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IMessageProvider;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.URLMethodWithParameters;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.WindowUtils;
+import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExternalData;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Invalidation;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ListSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ResultSet;
@@ -140,11 +148,34 @@ public final class GenericSampleViewer extends AbstractViewer<IGenericClientServ
         externalDataGrid.setId(getId() + DATA_POSTFIX);
         externalDataGrid.getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
         externalDataGrid.setLoadMask(true);
+        externalDataGrid.addListener(Events.CellDoubleClick, new Listener<GridEvent>()
+            {
+                public void handleEvent(GridEvent be)
+                {
+                    String column = externalDataGrid.getColumnModel().getColumn(be.colIndex).getId();
+                    if (ModelDataPropertyNames.CODE.equalsIgnoreCase(column))
+                    {
+                        ExternalDataModel item =
+                            (ExternalDataModel) be.grid.getStore().getAt(be.rowIndex);
+                        ExternalData dataSet = item.getBaseObject();
+                        showDataSet(dataSet);
+                    }
+                }
+            });
         panel.add(externalDataGrid);
         container.add(panel, new RowData(1, 0.5, new Margins(0, 5, 0, 0)));
         return container;
     }
 
+    private void showDataSet(ExternalData dataSet)
+    {
+        URLMethodWithParameters methodWithParameters =
+            new URLMethodWithParameters(dataSet.getDataStoreBaseURL() + "/" + dataSet.getCode());
+        GenericViewModel model = viewContext.getModel();
+        methodWithParameters.addParameter("sessionID", model.getSessionContext().getSessionID());
+        WindowUtils.openWindow(methodWithParameters.toString());
+    }
+
     private final static ContentPanel createContentPanel(final String heading)
     {
         final ContentPanel panel = new ContentPanel();
diff --git a/openbis/source/java/genericApplicationContext.xml b/openbis/source/java/genericApplicationContext.xml
index c029a588122bc92f99280fc9631c760768be4958..1192dff3eddc327476915322b2a53ff72d9b5c82 100644
--- a/openbis/source/java/genericApplicationContext.xml
+++ b/openbis/source/java/genericApplicationContext.xml
@@ -80,6 +80,7 @@
     <bean id="common-service" class="ch.systemsx.cisd.openbis.generic.client.web.server.CommonClientService">
         <constructor-arg ref="common-server" />
         <constructor-arg ref="request-context-provider" />
+        <constructor-arg value="${data-store-server-base-url}"/>
     </bean>
     
     <!-- 
diff --git a/openbis/source/java/service.properties b/openbis/source/java/service.properties
index 2d79426ddf954b21f64639f2c2e87fe590d6cbc1..bb75f2ee0da2c924cd8d88699046b83a4838919a 100644
--- a/openbis/source/java/service.properties
+++ b/openbis/source/java/service.properties
@@ -33,6 +33,9 @@ crowd.application.password =
 # The database instance local unique identifier. Used when the new database is created.
 database-instance = CISD
 
+# Base URL of the Data Store Server
+data-store-server-base-url = https://localhost:8889/dataset-download
+
 # Hibernate Search
 # The working directory.
 hibernate.search.index-base = ./targets/indices
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java
index 5b3aed5ce879555c027d1e0a47c6636684f13c0c..cf3da53a5e6d4d452a39307d534a4c076be8c0f3 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientServiceTest.java
@@ -59,6 +59,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityDataType;
  */
 public final class CommonClientServiceTest extends AbstractClientServiceTest
 {
+    private static final String DATA_STORE_BASE_URL = "basURL";
+
     private CommonClientService commonClientService;
 
     private ICommonServer commonServer;
@@ -117,7 +119,7 @@ public final class CommonClientServiceTest extends AbstractClientServiceTest
     {
         super.setUp();
         commonServer = context.mock(ICommonServer.class);
-        commonClientService = new CommonClientService(commonServer, requestContextProvider);
+        commonClientService = new CommonClientService(commonServer, requestContextProvider, DATA_STORE_BASE_URL);
     }
 
     @Test
@@ -318,8 +320,10 @@ public final class CommonClientServiceTest extends AbstractClientServiceTest
         List<ExternalData> list =
                 commonClientService.listExternalDataForExperiment("db:/group/project/exp");
         assertEquals(1, list.size());
-        assertEquals("PNG", list.get(0).getFileFormatType().getCode());
-        assertEquals("Portable Network Graphics", list.get(0).getFileFormatType().getDescription());
+        ExternalData data = list.get(0);
+        assertEquals(DATA_STORE_BASE_URL, data.getDataStoreBaseURL());
+        assertEquals("PNG", data.getFileFormatType().getCode());
+        assertEquals("Portable Network Graphics", data.getFileFormatType().getDescription());
 
         context.assertIsSatisfied();
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java
index f264d1ab795dfee2a23f983aedb4ff4d73af4677..af622224a4455193066f05a4fd6647a4f25cc9ad 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java
@@ -127,10 +127,10 @@ public final class CommonServerTest extends AbstractServerTestCase
         final PersonPE systemPerson = createSystemUser();
         final PersonPE person = CommonTestUtils.createPersonFromPrincipal(PRINCIPAL);
         final RoleAssignmentPE roleAssignment = new RoleAssignmentPE();
-        roleAssignment.setPerson(person);
         roleAssignment.setDatabaseInstance(homeDatabaseInstance);
         roleAssignment.setRegistrator(systemPerson);
         roleAssignment.setRole(RoleCode.ADMIN);
+        person.addRoleAssignment(roleAssignment);
         context.checking(new Expectations()
             {
                 {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/IETLLIMSService.java.expected b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/IETLLIMSService.java.expected
index 665db3b8de0cb14f8a07769c3233bc1a50fe7194..6ac586b95307f13658a7de5fefdee24b55ca2643 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/IETLLIMSService.java.expected
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/IETLLIMSService.java.expected
@@ -58,7 +58,7 @@ public interface IETLLIMSService extends IWebService, IDataStoreInfoProvider, IS
             final ExternalData externalData) throws UserFailureException;
             
     @Transactional
-    @RolesAllowed(RoleSet.ETL_SERVER)
+    @RolesAllowed(RoleSet.OBSERVER)
     public ExternalDataPE tryGetDataSet(String sessionToken, String dataSetCode)
             throws UserFailureException;
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/AuthorizationTestCase.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/AuthorizationTestCase.java
index 0e1c6e9ae1a66706f3d29ac098cb3154fb7dbb0a..848a9d70f46f17a08ade9486ec446bdb427d13e8 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/AuthorizationTestCase.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/authorization/AuthorizationTestCase.java
@@ -206,14 +206,14 @@ public class AuthorizationTestCase extends AssertJUnit
         // Database assignment
         RoleAssignmentPE assignment = new RoleAssignmentPE();
         assignment.setRole(RoleCode.ADMIN);
-        assignment.setPerson(person);
         assignment.setDatabaseInstance(createDatabaseInstance());
+        person.addRoleAssignment(assignment);
         list.add(assignment);
         // Group assignment
         assignment = new RoleAssignmentPE();
         assignment.setRole(RoleCode.USER);
-        assignment.setPerson(person);
         assignment.setGroup(createAnotherGroup());
+        person.addRoleAssignment(assignment);
         list.add(assignment);
         person.setRoleAssignments(list);
         return person;