diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/DataStrategyStore.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DataStrategyStore.java
index 2fb0c8fbd5261be6b433a26668ece5659974f4c3..76eff78046de57fcddd423dce38dccf1fcb9f7fd 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/DataStrategyStore.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/DataStrategyStore.java
@@ -31,7 +31,7 @@ import ch.systemsx.cisd.common.mail.IMailClient;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -131,7 +131,7 @@ public final class DataStrategyStore implements IDataStrategyStore
 
         if (dataSetInfo.tryGetContainerDatasetPermId() != null)
         {
-            ExternalData container =
+            AbstractExternalData container =
                     limsService.tryGetDataSet(dataSetInfo.tryGetContainerDatasetPermId());
             if (container != null)
             {
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IAutoArchiverPolicy.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IAutoArchiverPolicy.java
index 28656c4ce233bef7491531172c54799038dd2cea..be4e02adf86363a112c1e7c37c5f90889af9cd6c 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/IAutoArchiverPolicy.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/IAutoArchiverPolicy.java
@@ -19,7 +19,7 @@ package ch.systemsx.cisd.etlserver;
 import java.util.List;
 
 import ch.systemsx.cisd.etlserver.plugins.AutoArchiverTask;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * The interface that should be implemented by all {@link AutoArchiverTask} policies.
@@ -32,6 +32,6 @@ public interface IAutoArchiverPolicy
     /**
      * Returns given list of data sets filtered in a specific way.
      */
-    public List<ExternalData> filter(List<ExternalData> dataSets);
+    public List<AbstractExternalData> filter(List<AbstractExternalData> dataSets);
 
 }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/SmartParentDataSetInfoExtractor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/SmartParentDataSetInfoExtractor.java
index 4492888f67460d03a376073cb7a14126dd20c522..5769cb711628d7d42725daff5f14d8857b28f504 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/SmartParentDataSetInfoExtractor.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/SmartParentDataSetInfoExtractor.java
@@ -30,7 +30,7 @@ import ch.systemsx.cisd.common.properties.PropertyUtils;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 
@@ -122,7 +122,7 @@ public class SmartParentDataSetInfoExtractor extends DefaultDataSetInfoExtractor
                 super.getDataSetInformation(incomingDataSetPath, openbisService);
         if (datasetTypePatternOrNull != null)
         {
-            List<ExternalData> datasets =
+            List<AbstractExternalData> datasets =
                     tryFetchParentCandidates(openbisService, dataSetInformation);
             if (datasets != null)
             {
@@ -135,11 +135,11 @@ public class SmartParentDataSetInfoExtractor extends DefaultDataSetInfoExtractor
         return dataSetInformation;
     }
 
-    private static List<ExternalData> filterByTypePattern(List<ExternalData> datasets,
+    private static List<AbstractExternalData> filterByTypePattern(List<AbstractExternalData> datasets,
             String datasetTypePatternOrNull)
     {
-        List<ExternalData> filtered = new ArrayList<ExternalData>();
-        for (ExternalData dataset : datasets)
+        List<AbstractExternalData> filtered = new ArrayList<AbstractExternalData>();
+        for (AbstractExternalData dataset : datasets)
         {
             if (dataset.getEntityType().getCode().matches(datasetTypePatternOrNull))
             {
@@ -149,10 +149,10 @@ public class SmartParentDataSetInfoExtractor extends DefaultDataSetInfoExtractor
         return filtered;
     }
 
-    private List<ExternalData> tryFetchParentCandidates(IEncapsulatedOpenBISService openbisService,
+    private List<AbstractExternalData> tryFetchParentCandidates(IEncapsulatedOpenBISService openbisService,
             DataSetInformation dataSetInformation)
     {
-        List<ExternalData> datasets = null;
+        List<AbstractExternalData> datasets = null;
         SampleIdentifier sampleIdentifier = dataSetInformation.getSampleIdentifier();
         if (sampleIdentifier != null)
         {
@@ -170,7 +170,7 @@ public class SmartParentDataSetInfoExtractor extends DefaultDataSetInfoExtractor
     }
 
     private List<String> getParentDatasetCodes(DataSetInformation dataSetInformation,
-            List<ExternalData> datasets)
+            List<AbstractExternalData> datasets)
     {
         if (datasets.size() == 0)
         {
@@ -210,10 +210,10 @@ public class SmartParentDataSetInfoExtractor extends DefaultDataSetInfoExtractor
         }
     }
 
-    private ExternalData selectLastRegistered(List<ExternalData> datasets)
+    private AbstractExternalData selectLastRegistered(List<AbstractExternalData> datasets)
     {
-        ExternalData lastRegistered = null;
-        for (ExternalData dataset : datasets)
+        AbstractExternalData lastRegistered = null;
+        for (AbstractExternalData dataset : datasets)
         {
             if (lastRegistered == null
                     || (dataset.getRegistrationDate().getTime() > lastRegistered
@@ -225,10 +225,10 @@ public class SmartParentDataSetInfoExtractor extends DefaultDataSetInfoExtractor
         return lastRegistered;
     }
 
-    private static List<String> extractCodes(List<ExternalData> datasets)
+    private static List<String> extractCodes(List<AbstractExternalData> datasets)
     {
         List<String> codes = new ArrayList<String>();
-        for (ExternalData dataset : datasets)
+        for (AbstractExternalData dataset : datasets)
         {
             codes.add(dataset.getCode());
         }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetExecutor.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetExecutor.java
index 09ffa05604dc6ade9557f6daf9b263329c317369..3d82c717b78e5c310a974365c0969cd42746453a 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetExecutor.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetExecutor.java
@@ -64,7 +64,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LocatorType;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty;
@@ -291,7 +291,7 @@ class PutDataSetExecutor implements IDataSetHandlerRpc
             case DATA_SET:
                 String dataSetCode = tryGetDataSetCode();
 
-                ExternalData parentDataSet = getOpenBisService().tryGetDataSet(dataSetCode);
+                AbstractExternalData parentDataSet = getOpenBisService().tryGetDataSet(dataSetCode);
                 if (parentDataSet != null)
                 {
                     if (parentDataSet.getExperiment() != null)
@@ -421,7 +421,7 @@ class PutDataSetExecutor implements IDataSetHandlerRpc
             case DATA_SET:
                 String dataSetCode = tryGetDataSetCode();
 
-                ExternalData parentDataSet = getOpenBisService().tryGetDataSet(dataSetCode);
+                AbstractExternalData parentDataSet = getOpenBisService().tryGetDataSet(dataSetCode);
                 if (parentDataSet != null)
                 {
                     if (parentDataSet.getExperiment() != null)
@@ -748,7 +748,7 @@ class PutDataSetExecutor implements IDataSetHandlerRpc
                     case DATA_SET:
                         String dataSetCode = tryGetDataSetCode();
 
-                        ExternalData parentDataSet = openbisService.tryGetDataSet(dataSetCode);
+                        AbstractExternalData parentDataSet = openbisService.tryGetDataSet(dataSetCode);
                         if (parentDataSet != null)
                         {
                             if (parentDataSet.getExperiment() != null)
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetTopLevelDataSetHandler.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetTopLevelDataSetHandler.java
index 9838b386d4b392e06a25af153c129963889efbb4..de5733cf92e9ce223f792e36a3b1a91b41b6fab2 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetTopLevelDataSetHandler.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetTopLevelDataSetHandler.java
@@ -42,7 +42,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.NewDataSetDTO.DataSetOwner;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
@@ -199,7 +199,7 @@ class PutDataSetTopLevelDataSetHandler
                 case DATA_SET:
                     String dataSetCode = tryGetDataSetCode();
 
-                    ExternalData parentDataSet = getOpenBisService().tryGetDataSet(dataSetCode);
+                    AbstractExternalData parentDataSet = getOpenBisService().tryGetDataSet(dataSetCode);
                     if (parentDataSet != null)
                     {
                         if (parentDataSet.getExperiment() != null)
@@ -322,7 +322,7 @@ class PutDataSetTopLevelDataSetHandler
                 case DATA_SET:
                     String dataSetCode = tryGetDataSetCode();
 
-                    ExternalData parentDataSet = getOpenBisService().tryGetDataSet(dataSetCode);
+                    AbstractExternalData parentDataSet = getOpenBisService().tryGetDataSet(dataSetCode);
                     if (parentDataSet != null)
                     {
                         if (parentDataSet.getExperiment() != null)
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTask.java
index 4f17a15328316c568b56a457091f07783aec4c80..ea1e406f7b3d59a55e08bb15be1d1b2f9fb92037 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseFeedingTask.java
@@ -40,7 +40,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IShareIdManager;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.utils.PathInfoDataSourceProvider;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO;
 
@@ -148,7 +148,7 @@ public class PathInfoDatabaseFeedingTask implements IMaintenanceTask, IPostRegis
                 @Override
                 public void execute()
                 {
-                    ExternalData dataSet = service.tryGetDataSet(dataSetCode);
+                    AbstractExternalData dataSet = service.tryGetDataSet(dataSetCode);
                     if (dataSet == null)
                     {
                         operationLog.error("Data set " + dataSetCode + " unknown to openBIS.");
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/AutoArchiverTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/AutoArchiverTask.java
index bec84b94f7cf0959bf70c4a5f1f9d4ef624a119a..b3187d48cae7ea7e86a828ec3dfacba437d758cc 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/AutoArchiverTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/AutoArchiverTask.java
@@ -36,7 +36,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ArchiverDataSetCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * {@link IMaintenanceTask} performing automatic archiving of data sets.
@@ -74,7 +74,7 @@ public class AutoArchiverTask implements IMaintenanceTask
     public void execute()
     {
         operationLog.info("start");
-        List<ExternalData> dataSets = policy.filter(openBISService.listAvailableDataSets(criteria));
+        List<AbstractExternalData> dataSets = policy.filter(openBISService.listAvailableDataSets(criteria));
         if (dataSets.isEmpty())
         {
             operationLog.info("nothing to archive");
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/DummyAutoArchiverPolicy.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/DummyAutoArchiverPolicy.java
index 36dd0066defa147bc0cddd2ba9e979ee7cb6f7cf..eafaf712f295447bc3af79e73d8c77f352a15aba 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/DummyAutoArchiverPolicy.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/DummyAutoArchiverPolicy.java
@@ -20,7 +20,7 @@ import java.util.List;
 import java.util.Properties;
 
 import ch.systemsx.cisd.etlserver.IAutoArchiverPolicy;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * @author Piotr Buczek
@@ -34,7 +34,7 @@ public class DummyAutoArchiverPolicy implements IAutoArchiverPolicy
     }
 
     @Override
-    public List<ExternalData> filter(List<ExternalData> dataSets)
+    public List<AbstractExternalData> filter(List<AbstractExternalData> dataSets)
     {
         return dataSets;
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/ExperimentBasedArchivingTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/ExperimentBasedArchivingTask.java
index 8ae71caa2415d59320676f836000b061bfb704b5..d72f90e0e9a18b5501eb145d88826080b524ae6d 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/ExperimentBasedArchivingTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/plugins/ExperimentBasedArchivingTask.java
@@ -54,7 +54,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierFactory;
@@ -272,7 +272,7 @@ public class ExperimentBasedArchivingTask implements IDataStoreLockingMaintenanc
                     new ProjectIdentifierFactory(project.getIdentifier()).createIdentifier();
             for (Experiment experiment : service.listExperiments(projectIdentifier))
             {
-                List<ExternalData> dataSets =
+                List<AbstractExternalData> dataSets =
                         service.listDataSetsByExperimentID(experiment.getId());
                 infos.add(new ExperimentDataSetsInfo(experiment.getIdentifier(), dataSets));
             }
@@ -345,10 +345,10 @@ public class ExperimentBasedArchivingTask implements IDataStoreLockingMaintenanc
 
         private final String experimentIdentifier;
 
-        ExperimentDataSetsInfo(String experimentIdentifier, List<ExternalData> dataSets)
+        ExperimentDataSetsInfo(String experimentIdentifier, List<AbstractExternalData> dataSets)
         {
             this.experimentIdentifier = experimentIdentifier;
-            for (ExternalData dataSet : dataSets)
+            for (AbstractExternalData dataSet : dataSets)
             {
                 if (dataSet instanceof PhysicalDataSet == false)
                 {
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/ArchivingPostRegistrationTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/ArchivingPostRegistrationTask.java
index b58abf6276353b82c114e722db7acd7014ca64b7..8c11106bee6501e35b7afe2d4a38dfebe341f9e8 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/ArchivingPostRegistrationTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/ArchivingPostRegistrationTask.java
@@ -37,7 +37,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ProcessingStatus;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatasetLocation;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataSetTranslator;
 
@@ -105,7 +105,7 @@ public class ArchivingPostRegistrationTask extends AbstractPostRegistrationTask
                 return;
             }
 
-            ExternalData dataSet = tryGetExternalData(dataSetCode, service);
+            AbstractExternalData dataSet = tryGetExternalData(dataSetCode, service);
             if (dataSet == null)
             {
                 operationLog.warn("Data set '" + dataSetCode
@@ -162,24 +162,24 @@ public class ArchivingPostRegistrationTask extends AbstractPostRegistrationTask
         }
     }
 
-    private static ExternalData tryGetExternalData(String dataSetCode,
+    private static AbstractExternalData tryGetExternalData(String dataSetCode,
             IEncapsulatedOpenBISService service)
     {
         List<String> codeAsList = Collections.singletonList(dataSetCode);
-        List<ExternalData> dataList = service.listDataSetsByCode(codeAsList);
+        List<AbstractExternalData> dataList = service.listDataSetsByCode(codeAsList);
         if (dataList == null || dataList.isEmpty())
         {
             return null;
         }
 
-        ExternalData data = dataList.get(0);
+        AbstractExternalData data = dataList.get(0);
         return data;
     }
 
     private static DatasetDescription tryGetDatasetWithLocation(String dataSetCode,
             IEncapsulatedOpenBISService service)
     {
-        ExternalData data = tryGetExternalData(dataSetCode, service);
+        AbstractExternalData data = tryGetExternalData(dataSetCode, service);
         return (data != null) ? DataSetTranslator.translateToDescription(data) : null;
     }
 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/Hdf5CompressingPostRegistrationTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/Hdf5CompressingPostRegistrationTask.java
index 143d915b212529d03c9b98bba2f8d5142f2e46f5..f979778db417c2b5f431acb4325b8da1fd13cb4d 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/Hdf5CompressingPostRegistrationTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/Hdf5CompressingPostRegistrationTask.java
@@ -47,7 +47,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 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.PhysicalDataSet;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewExternalData;
@@ -140,7 +140,7 @@ public class Hdf5CompressingPostRegistrationTask extends AbstractPostRegistratio
         public void execute()
         {
 
-            ExternalData externalData = tryGetDataSet(dataSetCode, service);
+            AbstractExternalData externalData = tryGetDataSet(dataSetCode, service);
             if (false == shouldCompressToHdf5(externalData))
             {
                 return;
@@ -192,7 +192,7 @@ public class Hdf5CompressingPostRegistrationTask extends AbstractPostRegistratio
             }
         }
 
-        private IHierarchicalContent tryGetHierarchicalContent(ExternalData externalData)
+        private IHierarchicalContent tryGetHierarchicalContent(AbstractExternalData externalData)
         {
             try
             {
@@ -311,7 +311,7 @@ public class Hdf5CompressingPostRegistrationTask extends AbstractPostRegistratio
             return false;
         }
 
-        private boolean shouldCompressToHdf5(ExternalData dataSet)
+        private boolean shouldCompressToHdf5(AbstractExternalData dataSet)
         {
             if (dataSet == null)
             {
@@ -431,11 +431,11 @@ public class Hdf5CompressingPostRegistrationTask extends AbstractPostRegistratio
         }
     }
 
-    static ExternalData tryGetDataSet(String dataSetCode,
+    static AbstractExternalData tryGetDataSet(String dataSetCode,
             IEncapsulatedOpenBISService service)
     {
         List<String> codeAsList = Collections.singletonList(dataSetCode);
-        List<ExternalData> dataList = service.listDataSetsByCode(codeAsList);
+        List<AbstractExternalData> dataList = service.listDataSetsByCode(codeAsList);
         if (dataList == null || dataList.isEmpty())
         {
             return null;
@@ -444,12 +444,12 @@ public class Hdf5CompressingPostRegistrationTask extends AbstractPostRegistratio
         return dataList.get(0);
     }
 
-    private ExperimentIdentifier extractExperimentIdentifier(ExternalData data)
+    private ExperimentIdentifier extractExperimentIdentifier(AbstractExternalData data)
     {
         return ExperimentIdentifierFactory.parse(data.getExperiment().getIdentifier());
     }
 
-    private SampleIdentifier extractSampleIdentifier(ExternalData data)
+    private SampleIdentifier extractSampleIdentifier(AbstractExternalData data)
     {
         if (data.getSampleIdentifier() != null)
         {
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/NotifyingTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/NotifyingTask.java
index d5ee65272ba7387ce7331a02fdfa3873f0f35939..2573d5108e20ca62f8790f64613da9a0b3f56644 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/NotifyingTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/NotifyingTask.java
@@ -31,7 +31,7 @@ import ch.systemsx.cisd.common.logging.LogLevel;
 import ch.systemsx.cisd.common.properties.PropertyUtils;
 import ch.systemsx.cisd.common.string.Template;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 
 /**
@@ -113,7 +113,7 @@ public class NotifyingTask extends AbstractPostRegistrationTask
     @Override
     public IPostRegistrationTaskExecutor createExecutor(String dataSetCode, boolean container)
     {
-        ExternalData dataSet = service.tryGetDataSet(dataSetCode);
+        AbstractExternalData dataSet = service.tryGetDataSet(dataSetCode);
         if (dataSet == null)
         {
             throw new IllegalArgumentException("Unknown data set: " + dataSetCode);
@@ -126,7 +126,7 @@ public class NotifyingTask extends AbstractPostRegistrationTask
     {
         private final ISimpleLogger logger;
 
-        private final ExternalData dataSet;
+        private final AbstractExternalData dataSet;
 
         private final Template messageTemplate;
 
@@ -134,7 +134,7 @@ public class NotifyingTask extends AbstractPostRegistrationTask
 
         private final String[] includeDatasetTypePatternsOrNull;
 
-        public Executor(ExternalData dataSet, Template messageTemplate,
+        public Executor(AbstractExternalData dataSet, Template messageTemplate,
                 Template destinationPathTemplate, String[] includeDatasetTypePatternsOrNull,
                 ISimpleLogger logger)
         {
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/PostRegistrationMaintenanceTask.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/PostRegistrationMaintenanceTask.java
index 286b6ef8b74126cea117ee38a7a0c572a60f0a88..6f1a5229bfba806eaa9e262c788848e924809e69 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/PostRegistrationMaintenanceTask.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/postregistration/PostRegistrationMaintenanceTask.java
@@ -45,7 +45,7 @@ import ch.systemsx.cisd.common.properties.PropertyParametersUtil.SectionProperti
 import ch.systemsx.cisd.common.reflection.ClassUtils;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * Maintenance task performing {@link IPostRegistrationTask}s.
@@ -172,11 +172,11 @@ public class PostRegistrationMaintenanceTask implements IDataStoreLockingMainten
             deleteLastSeenDataSetId();
         }
 
-        List<ExternalData> dataSets = getDataSetsForPostRegistration();
+        List<AbstractExternalData> dataSets = getDataSetsForPostRegistration();
 
         for (int i = 0; i < dataSets.size(); i++)
         {
-            ExternalData dataSet = dataSets.get(i);
+            AbstractExternalData dataSet = dataSets.get(i);
             String code = dataSet.getCode();
             operationLog.info("Post registration of " + (i + 1) + ". of " + dataSets.size()
                     + " data sets: " + code);
@@ -209,21 +209,21 @@ public class PostRegistrationMaintenanceTask implements IDataStoreLockingMainten
     /**
      * @return List of datasets to process in post registration. Sorted by Id, incrementally.
      */
-    private List<ExternalData> getDataSetsForPostRegistration()
+    private List<AbstractExternalData> getDataSetsForPostRegistration()
     {
-        List<ExternalData> dataSets = service.listDataSetsForPostRegistration();
-        List<ExternalData> filteredList = new ArrayList<ExternalData>();
-        for (ExternalData dataSet : dataSets)
+        List<AbstractExternalData> dataSets = service.listDataSetsForPostRegistration();
+        List<AbstractExternalData> filteredList = new ArrayList<AbstractExternalData>();
+        for (AbstractExternalData dataSet : dataSets)
         {
             if (dataSet.getRegistrationDate().getTime() > ignoreBeforeDate.getTime())
             {
                 filteredList.add(dataSet);
             }
         }
-        Collections.sort(filteredList, new Comparator<ExternalData>()
+        Collections.sort(filteredList, new Comparator<AbstractExternalData>()
             {
                 @Override
-                public int compare(ExternalData o1, ExternalData o2)
+                public int compare(AbstractExternalData o1, AbstractExternalData o2)
                 {
                     return (int) (o1.getId() - o2.getId());
                 }
@@ -248,7 +248,7 @@ public class PostRegistrationMaintenanceTask implements IDataStoreLockingMainten
         lastSeenDataSetFile.delete();
     }
 
-    private void logPostponingMessage(List<ExternalData> dataSets, int i)
+    private void logPostponingMessage(List<AbstractExternalData> dataSets, int i)
     {
         int numberOfDataSets = dataSets.size();
         if (i < numberOfDataSets - 1)
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
index 3f63d98a487088b6bd249278adc565171fc5178a..272e21051332bacfc9d332ff0fb2499b91925636 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/AbstractTransactionState.java
@@ -65,7 +65,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetRegistrationInformation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial;
@@ -404,7 +404,7 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
 
         public IDataSetImmutable getDataSet(String dataSetCode)
         {
-            ExternalData dataSet = openBisService.tryGetDataSet(dataSetCode);
+            AbstractExternalData dataSet = openBisService.tryGetDataSet(dataSetCode);
             if (dataSet == null)
             {
                 return null;
@@ -423,7 +423,7 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
                 return result;
             }
 
-            ExternalData dataSet = openBisService.tryGetDataSet(dataSetCode);
+            AbstractExternalData dataSet = openBisService.tryGetDataSet(dataSetCode);
             if (dataSet == null)
             {
                 return null;
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java
index 2fbc272acf2a5e6000cd530e07ac68b748927cb3..3d251dc2880405f70101a759d9589ce9efbb6579 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/ConversionUtils.java
@@ -33,7 +33,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
@@ -308,7 +308,7 @@ public class ConversionUtils
 
     public static DataSetUpdatesDTO convertToDataSetUpdatesDTO(DataSetUpdatable dataSet)
     {
-        ExternalData externalData = dataSet.getExternalData();
+        AbstractExternalData externalData = dataSet.getExternalData();
 
         DataSetUpdatesDTO dataSetUpdate = new DataSetUpdatesDTO();
         dataSetUpdate.setDatasetId(new TechId(externalData));
@@ -357,7 +357,7 @@ public class ConversionUtils
     private static DataSetBatchUpdatesDTO enrichUpdatesWithInformation(DataSetUpdatable dataSet,
             DataSetBatchUpdatesDTO dataSetUpdate)
     {
-        ExternalData externalData = dataSet.getExternalData();
+        AbstractExternalData externalData = dataSet.getExternalData();
 
         dataSetUpdate.setDatasetId(new TechId(externalData));
         dataSetUpdate.setVersion(externalData.getVersion());
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 372ea4e5ac52f3630fca617750df1fedeefe42d7..359631b2f1a2244845a9cafeb2e99a4cdd064236 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
@@ -31,7 +31,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.IObjectId;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.dataset.DataSetCodeId;
 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.AbstractExternalData;
 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;
@@ -43,9 +43,9 @@ import ch.systemsx.cisd.openbis.generic.shared.util.EntityHelper;
  */
 public class DataSetImmutable extends AbstractDataSetImmutable
 {
-    protected final ExternalData dataSet;
+    protected final AbstractExternalData dataSet;
 
-    public DataSetImmutable(ExternalData dataSet, IEncapsulatedBasicOpenBISService service)
+    public DataSetImmutable(AbstractExternalData dataSet, IEncapsulatedBasicOpenBISService service)
     {
         super(service);
         this.dataSet = dataSet;
@@ -189,10 +189,10 @@ public class DataSetImmutable extends AbstractDataSetImmutable
     public List<IDataSetImmutable> getChildrenDataSets()
     {
         List<IDataSetImmutable> result = new ArrayList<IDataSetImmutable>();
-        Collection<ExternalData> children = dataSet.getChildren();
+        Collection<AbstractExternalData> children = dataSet.getChildren();
         if (children != null)
         {
-            for (ExternalData child : children)
+            for (AbstractExternalData child : children)
             {
                 result.add(new DataSetImmutable(child, service));
             }
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 af5fc5fb9a878c7e3245919e67f34a05bcb15271..c1bb4f70b7f6a42bd5803020143ae5a88c3c3d2d 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
@@ -29,7 +29,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v1.IExternalData
 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.AbstractExternalData;
 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;
@@ -54,7 +54,7 @@ public class DataSetUpdatable extends DataSetImmutable implements IDataSetUpdata
 
     private final DataSetBatchUpdateDetails updateDetails;
 
-    public DataSetUpdatable(ExternalData dataSet, IEncapsulatedBasicOpenBISService service)
+    public DataSetUpdatable(AbstractExternalData dataSet, IEncapsulatedBasicOpenBISService service)
     {
         super(dataSet, service);
         if (dataSet.getProperties() == null)
@@ -152,7 +152,7 @@ public class DataSetUpdatable extends DataSetImmutable implements IDataSetUpdata
     @Override
     public void setParentDatasets(List<String> parentDataSetCodes)
     {
-        List<ExternalData> dummyParents = createDummyDataSetsFromCodes(parentDataSetCodes);
+        List<AbstractExternalData> dummyParents = createDummyDataSetsFromCodes(parentDataSetCodes);
         dataSet.setParents(dummyParents);
 
         updateDetails.setParentsUpdateRequested(true);
@@ -164,7 +164,7 @@ public class DataSetUpdatable extends DataSetImmutable implements IDataSetUpdata
     {
         if (isContainerDataSet())
         {
-            List<ExternalData> dummyDataSets = createDummyDataSetsFromCodes(containedDataSetCodes);
+            List<AbstractExternalData> dummyDataSets = createDummyDataSetsFromCodes(containedDataSetCodes);
             dataSet.tryGetAsContainerDataSet().setContainedDataSets(dummyDataSets);
 
             updateDetails.setContainerUpdateRequested(true);
@@ -176,9 +176,9 @@ public class DataSetUpdatable extends DataSetImmutable implements IDataSetUpdata
         }
     }
 
-    private List<ExternalData> createDummyDataSetsFromCodes(List<String> containedDataSetCodes)
+    private List<AbstractExternalData> createDummyDataSetsFromCodes(List<String> containedDataSetCodes)
     {
-        List<ExternalData> dummies = new ArrayList<ExternalData>();
+        List<AbstractExternalData> dummies = new ArrayList<AbstractExternalData>();
         if (containedDataSetCodes != null)
         {
             for (String code : containedDataSetCodes)
@@ -194,7 +194,7 @@ public class DataSetUpdatable extends DataSetImmutable implements IDataSetUpdata
     /**
      * Only visible to internal implementation classes. Not part of the public interface.
      */
-    public ExternalData getExternalData()
+    public AbstractExternalData getExternalData()
     {
         return dataSet;
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/MetaprojectAssignments.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/MetaprojectAssignments.java
index af1b837ff3528845bfa766e2b7a4419d6758156f..aa39827734eaa33d01b98e9de04055e5ba9e53a3 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/MetaprojectAssignments.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/MetaprojectAssignments.java
@@ -78,7 +78,7 @@ public class MetaprojectAssignments implements IMetaprojectAssignments
     public List<IDataSetImmutable> getDataSets()
     {
         LinkedList<IDataSetImmutable> experiments = new LinkedList<IDataSetImmutable>();
-        for (ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData dataSet : metaprojectAssignments
+        for (ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData dataSet : metaprojectAssignments
                 .getDataSets())
         {
             experiments.add(new DataSetImmutable(dataSet, service));
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/SearchService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/SearchService.java
index 76d960985a8f9645658def98be1b865b48571d82..8a6b425a150a15c954fb3120da85f32731b0d436 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/SearchService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v1/impl/SearchService.java
@@ -46,7 +46,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchCl
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListMaterialCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
@@ -132,10 +132,10 @@ public class SearchService implements ISearchService
     @Override
     public List<IDataSetImmutable> searchForDataSets(SearchCriteria searchCriteria)
     {
-        List<ExternalData> serverDataSets = openBisService.searchForDataSets(searchCriteria);
+        List<AbstractExternalData> serverDataSets = openBisService.searchForDataSets(searchCriteria);
         ArrayList<IDataSetImmutable> dataSets =
                 new ArrayList<IDataSetImmutable>(serverDataSets.size());
-        for (ExternalData dataSet : serverDataSets)
+        for (AbstractExternalData dataSet : serverDataSets)
         {
             dataSets.add(new DataSetImmutable(dataSet, openBisService));
         }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java
index fc8595803d2d398589347397cd3b11efa9299de8..3addbbd3a11a1322d92ed5c6c6277d34bc1fe72a 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/AbstractTransactionState.java
@@ -65,7 +65,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetRegistrationInformation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial;
@@ -416,7 +416,7 @@ public abstract class AbstractTransactionState<T extends DataSetInformation>
                 return result;
             }
 
-            ExternalData dataSet = openBisService.tryGetDataSet(dataSetCode);
+            AbstractExternalData dataSet = openBisService.tryGetDataSet(dataSetCode);
             if (dataSet == null)
             {
                 return null;
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/ConversionUtils.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/ConversionUtils.java
index 625bc98d4f0103101b8ab4048907793f74f76da2..8df91857c14da2c7dd71902d1956f60f4c018eb7 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/ConversionUtils.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/ConversionUtils.java
@@ -33,7 +33,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
@@ -308,7 +308,7 @@ public class ConversionUtils
 
     public static DataSetUpdatesDTO convertToDataSetUpdatesDTO(DataSetUpdatable dataSet)
     {
-        ExternalData externalData = dataSet.getExternalData();
+        AbstractExternalData externalData = dataSet.getExternalData();
 
         DataSetUpdatesDTO dataSetUpdate = new DataSetUpdatesDTO();
         dataSetUpdate.setDatasetId(new TechId(externalData));
@@ -357,7 +357,7 @@ public class ConversionUtils
     private static DataSetBatchUpdatesDTO enrichUpdatesWithInformation(DataSetUpdatable dataSet,
             DataSetBatchUpdatesDTO dataSetUpdate)
     {
-        ExternalData externalData = dataSet.getExternalData();
+        AbstractExternalData externalData = dataSet.getExternalData();
 
         dataSetUpdate.setDatasetId(new TechId(externalData));
         dataSetUpdate.setVersion(externalData.getVersion());
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/DataSetImmutable.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/DataSetImmutable.java
index d0404a1db737656c5efc3a2c9335373563e87d93..ba66d028156270e631549ef55ebdf2d940f6fe51 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/DataSetImmutable.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/DataSetImmutable.java
@@ -31,7 +31,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.IObjectId;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.dataset.DataSetCodeId;
 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.AbstractExternalData;
 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;
@@ -43,9 +43,9 @@ import ch.systemsx.cisd.openbis.generic.shared.util.EntityHelper;
  */
 public class DataSetImmutable extends AbstractDataSetImmutable
 {
-    protected final ExternalData dataSet;
+    protected final AbstractExternalData dataSet;
 
-    public DataSetImmutable(ExternalData dataSet, IEncapsulatedBasicOpenBISService service)
+    public DataSetImmutable(AbstractExternalData dataSet, IEncapsulatedBasicOpenBISService service)
     {
         super(service);
         this.dataSet = dataSet;
@@ -189,10 +189,10 @@ public class DataSetImmutable extends AbstractDataSetImmutable
     public List<IDataSetImmutable> getChildrenDataSets()
     {
         List<IDataSetImmutable> result = new ArrayList<IDataSetImmutable>();
-        Collection<ExternalData> children = dataSet.getChildren();
+        Collection<AbstractExternalData> children = dataSet.getChildren();
         if (children != null)
         {
-            for (ExternalData child : children)
+            for (AbstractExternalData child : children)
             {
                 result.add(new DataSetImmutable(child, service));
             }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/DataSetUpdatable.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/DataSetUpdatable.java
index 042941ccdd757f50393cb2ef1722ef5636954444..5c9c1038353e0d838e4be7f4c368930e5c36f3d2 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/DataSetUpdatable.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/DataSetUpdatable.java
@@ -29,7 +29,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.IExternalData
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.v2.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.AbstractExternalData;
 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;
@@ -54,7 +54,7 @@ public class DataSetUpdatable extends DataSetImmutable implements IDataSetUpdata
 
     private final DataSetBatchUpdateDetails updateDetails;
 
-    public DataSetUpdatable(ExternalData dataSet, IEncapsulatedBasicOpenBISService service)
+    public DataSetUpdatable(AbstractExternalData dataSet, IEncapsulatedBasicOpenBISService service)
     {
         super(dataSet, service);
         if (dataSet.getProperties() == null)
@@ -152,7 +152,7 @@ public class DataSetUpdatable extends DataSetImmutable implements IDataSetUpdata
     @Override
     public void setParentDatasets(List<String> parentDataSetCodes)
     {
-        List<ExternalData> dummyParents = createDummyDataSetsFromCodes(parentDataSetCodes);
+        List<AbstractExternalData> dummyParents = createDummyDataSetsFromCodes(parentDataSetCodes);
         dataSet.setParents(dummyParents);
 
         updateDetails.setParentsUpdateRequested(true);
@@ -164,7 +164,7 @@ public class DataSetUpdatable extends DataSetImmutable implements IDataSetUpdata
     {
         if (isContainerDataSet())
         {
-            List<ExternalData> dummyDataSets = createDummyDataSetsFromCodes(containedDataSetCodes);
+            List<AbstractExternalData> dummyDataSets = createDummyDataSetsFromCodes(containedDataSetCodes);
             dataSet.tryGetAsContainerDataSet().setContainedDataSets(dummyDataSets);
 
             updateDetails.setContainerUpdateRequested(true);
@@ -176,9 +176,9 @@ public class DataSetUpdatable extends DataSetImmutable implements IDataSetUpdata
         }
     }
 
-    private List<ExternalData> createDummyDataSetsFromCodes(List<String> containedDataSetCodes)
+    private List<AbstractExternalData> createDummyDataSetsFromCodes(List<String> containedDataSetCodes)
     {
-        List<ExternalData> dummies = new ArrayList<ExternalData>();
+        List<AbstractExternalData> dummies = new ArrayList<AbstractExternalData>();
         if (containedDataSetCodes != null)
         {
             for (String code : containedDataSetCodes)
@@ -194,7 +194,7 @@ public class DataSetUpdatable extends DataSetImmutable implements IDataSetUpdata
     /**
      * Only visible to internal implementation classes. Not part of the public interface.
      */
-    public ExternalData getExternalData()
+    public AbstractExternalData getExternalData()
     {
         return dataSet;
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/MetaprojectAssignments.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/MetaprojectAssignments.java
index b5413f42fb66251b872f87f0526b2c07bde835b7..1378e105e37fe88559833efd3e7dd613bce685d0 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/MetaprojectAssignments.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/MetaprojectAssignments.java
@@ -78,7 +78,7 @@ public class MetaprojectAssignments implements IMetaprojectAssignments
     public List<IDataSetImmutable> getDataSets()
     {
         LinkedList<IDataSetImmutable> datasets = new LinkedList<IDataSetImmutable>();
-        for (ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData dataSet : metaprojectAssignments
+        for (ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData dataSet : metaprojectAssignments
                 .getDataSets())
         {
             datasets.add(new DataSetImmutable(dataSet, service));
diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/SearchService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/SearchService.java
index ed1a2620a80d6d7771196c50c7e28a347b734fb3..84e10fae67238a216f2e54ef09b9c6d0a1d3e907 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/SearchService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/registrator/api/v2/impl/SearchService.java
@@ -48,7 +48,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchCl
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchCriteria.MatchClauseAttribute;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListMaterialCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
@@ -158,10 +158,10 @@ public class SearchService implements ISearchService
     @Override
     public List<IDataSetImmutable> searchForDataSets(SearchCriteria searchCriteria)
     {
-        List<ExternalData> serverDataSets = openBisService.searchForDataSets(searchCriteria);
+        List<AbstractExternalData> serverDataSets = openBisService.searchForDataSets(searchCriteria);
         ArrayList<IDataSetImmutable> dataSets =
                 new ArrayList<IDataSetImmutable>(serverDataSets.size());
-        for (ExternalData dataSet : serverDataSets)
+        for (AbstractExternalData dataSet : serverDataSets)
         {
             dataSets.add(new DataSetImmutable(dataSet, openBisService));
         }
@@ -341,7 +341,7 @@ public class SearchService implements ISearchService
     @Override
     public IDataSetImmutable getDataSet(String dataSetCode)
     {
-        ExternalData dataSet = openBisService.tryGetDataSet(dataSetCode);
+        AbstractExternalData dataSet = openBisService.tryGetDataSet(dataSetCode);
         if (dataSet == null)
         {
             return null;
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/AbstractDatasetDownloadServlet.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/AbstractDatasetDownloadServlet.java
index 6e13a91488e3c79169f65d70556e52aea858e320..bf13f10c9eada774cbe345bef4929c658e6a0d32 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/AbstractDatasetDownloadServlet.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/AbstractDatasetDownloadServlet.java
@@ -46,7 +46,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.Size;
 import ch.systemsx.cisd.openbis.dss.generic.shared.utils.ImageUtil;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * Superclass for dataset download servlets. Provides functionality to deliver content of files and
@@ -369,23 +369,23 @@ abstract public class AbstractDatasetDownloadServlet extends HttpServlet
         return map;
     }
 
-    protected final ExternalData tryToGetCachedDataSet(HttpSession session, String dataSetCode)
+    protected final AbstractExternalData tryToGetCachedDataSet(HttpSession session, String dataSetCode)
     {
         return getDataSets(session).get(dataSetCode);
     }
 
     @SuppressWarnings("unchecked")
-    protected final Map<String, ExternalData> getDataSets(HttpSession session)
+    protected final Map<String, AbstractExternalData> getDataSets(HttpSession session)
     {
         // Need to synchronize on the class, since there could be multiple instances trying to
         // access this attribute.
         synchronized (AbstractDatasetDownloadServlet.class)
         {
-            Map<String, ExternalData> map =
-                    (Map<String, ExternalData>) session.getAttribute(DATA_SET_SESSION_KEY);
+            Map<String, AbstractExternalData> map =
+                    (Map<String, AbstractExternalData>) session.getAttribute(DATA_SET_SESSION_KEY);
             if (map == null)
             {
-                map = new HashMap<String, ExternalData>();
+                map = new HashMap<String, AbstractExternalData>();
                 session.setAttribute(DATA_SET_SESSION_KEY, map);
             }
             return map;
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/AbstractDssServiceRpc.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/AbstractDssServiceRpc.java
index 7729ee1a278e1cdfa159b2e828566d586d776461..e5fcffe05144816db927cd60fbc480e2500d7c25 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/AbstractDssServiceRpc.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/AbstractDssServiceRpc.java
@@ -29,7 +29,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.IShareIdManager;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.v1.DataStoreApiUrlUtilities;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.OpenBISSessionHolder;
 
 /**
@@ -136,7 +136,7 @@ public abstract class AbstractDssServiceRpc<T> extends AbstractServiceWithLogger
         return getHierarchicalContentProvider(sessionToken).asContent(dataSetCode);
     }
 
-    protected ExternalData tryGetDataSet(String sessionToken, String dataSetCode)
+    protected AbstractExternalData tryGetDataSet(String sessionToken, String dataSetCode)
     {
         return openBISService.tryGetDataSet(sessionToken, dataSetCode);
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataSetCommandExecutor.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataSetCommandExecutor.java
index 92a799548b1cc8bc779c5a4e8796d20e4c9eb2fd..46764e3a960b83ac70f21e123c0ea4986ba03905 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataSetCommandExecutor.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataSetCommandExecutor.java
@@ -35,7 +35,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.IHierarchicalContentProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IShareIdManager;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUploadContext;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
@@ -140,7 +140,7 @@ class DataSetCommandExecutor implements IDataSetCommandExecutor
 
     @Override
     public void scheduleUploadingDataSetsToCIFEX(ICIFEXRPCServiceFactory cifexServiceFactory,
-            MailClientParameters mailClientParameters, List<ExternalData> dataSets,
+            MailClientParameters mailClientParameters, List<AbstractExternalData> dataSets,
             DataSetUploadContext uploadContext, String cifexAdminUserOrNull,
             String cifexAdminPasswordOrNull)
     {
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreService.java
index 88bd9f201a26b7c984a92cee109622e9a022eb27..0cf6d97e5c565b8b50c98e10a4e0c755e8f4d3d1 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreService.java
@@ -63,7 +63,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 import ch.systemsx.cisd.openbis.generic.shared.IDataStoreService;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CustomImportFile;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
@@ -289,7 +289,7 @@ public class DataStoreService extends AbstractServiceWithLogger<IDataStoreServic
     }
 
     @Override
-    public void uploadDataSetsToCIFEX(String sessionToken, List<ExternalData> dataSets,
+    public void uploadDataSetsToCIFEX(String sessionToken, List<AbstractExternalData> dataSets,
             DataSetUploadContext context) throws InvalidAuthenticationException
     {
         sessionTokenManager.assertValidSessionToken(sessionToken);
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceLogger.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceLogger.java
index 23cda149d274cc5cc674223f0ab4d35c6107562f..86859ebe1a448e06e73404bf7198119eeabbb113 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceLogger.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceLogger.java
@@ -27,7 +27,7 @@ import ch.systemsx.cisd.common.serviceconversation.ServiceMessage;
 import ch.systemsx.cisd.openbis.common.spring.IInvocationLoggerContext;
 import ch.systemsx.cisd.openbis.generic.shared.IDataStoreService;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CustomImportFile;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
@@ -111,11 +111,11 @@ class DataStoreServiceLogger implements IDataStoreService, IInitializable
     }
 
     @Override
-    public void uploadDataSetsToCIFEX(String sessionToken, List<ExternalData> dataSets,
+    public void uploadDataSetsToCIFEX(String sessionToken, List<AbstractExternalData> dataSets,
             DataSetUploadContext context) throws InvalidAuthenticationException
     {
         StringBuilder builder = new StringBuilder();
-        for (ExternalData externalDataPE : dataSets)
+        for (AbstractExternalData externalDataPE : dataSets)
         {
             builder.append(' ').append(externalDataPE.getCode());
         }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedFilteredBasicOpenBISService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedFilteredBasicOpenBISService.java
index cec395ee9a9460d2a000f518a8bb0ed324a1523a..83162bea294aaf0337f87ff174011e90686258f0 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedFilteredBasicOpenBISService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedFilteredBasicOpenBISService.java
@@ -32,7 +32,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.IObjectId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetTypeWithVocabularyTerms;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListMaterialCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
@@ -77,11 +77,11 @@ public class EncapsulatedFilteredBasicOpenBISService implements IEncapsulatedBas
         this.userName = userName;
     }
 
-    private final static IMapper<ExternalData, String> externalDataCodeMapper =
-            new IMapper<ExternalData, String>()
+    private final static IMapper<AbstractExternalData, String> externalDataCodeMapper =
+            new IMapper<AbstractExternalData, String>()
                 {
                     @Override
-                    public String map(ExternalData item)
+                    public String map(AbstractExternalData item)
                     {
                         return item.getCode();
                     }
@@ -146,9 +146,9 @@ public class EncapsulatedFilteredBasicOpenBISService implements IEncapsulatedBas
     }
 
     @Override
-    public List<ExternalData> searchForDataSets(SearchCriteria searchCriteria)
+    public List<AbstractExternalData> searchForDataSets(SearchCriteria searchCriteria)
     {
-        List<ExternalData> datasets =
+        List<AbstractExternalData> datasets =
                 etlService.searchForDataSets(systemSessionToken, searchCriteria);
 
         return AuthorizationHelper.filterToVisible(encapsulatedService, userName, datasets,
@@ -235,9 +235,9 @@ public class EncapsulatedFilteredBasicOpenBISService implements IEncapsulatedBas
     }
 
     @Override
-    public ExternalData tryGetDataSet(String dataSetCode) throws UserFailureException
+    public AbstractExternalData tryGetDataSet(String dataSetCode) throws UserFailureException
     {
-        ExternalData data = encapsulatedService.tryGetDataSet(dataSetCode);
+        AbstractExternalData data = encapsulatedService.tryGetDataSet(dataSetCode);
         return AuthorizationHelper.filterToVisible(encapsulatedService, userName, data,
                 externalDataCodeMapper, AuthorizationHelper.EntityKind.DATA_SET);
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java
index d73d54dbbf33c2444ad7066e97e362843133e407..7f653faacb7ee71bd296e7ce8d82c19e3407a0a4 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/EncapsulatedOpenBISService.java
@@ -51,7 +51,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystem;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocationNode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
@@ -288,7 +288,7 @@ public final class EncapsulatedOpenBISService implements IEncapsulatedOpenBISSer
     }
 
     @Override
-    public List<ExternalData> listDataSetsByExperimentID(long experimentID)
+    public List<AbstractExternalData> listDataSetsByExperimentID(long experimentID)
             throws UserFailureException
     {
         TechId id = new TechId(experimentID);
@@ -296,7 +296,7 @@ public final class EncapsulatedOpenBISService implements IEncapsulatedOpenBISSer
     }
 
     @Override
-    public List<ExternalData> listDataSetsBySampleID(long sampleID,
+    public List<AbstractExternalData> listDataSetsBySampleID(long sampleID,
             boolean showOnlyDirectlyConnected)
     {
         TechId id = new TechId(sampleID);
@@ -305,7 +305,7 @@ public final class EncapsulatedOpenBISService implements IEncapsulatedOpenBISSer
     }
 
     @Override
-    public List<ExternalData> listDataSetsByCode(List<String> dataSetCodes)
+    public List<AbstractExternalData> listDataSetsByCode(List<String> dataSetCodes)
             throws UserFailureException
     {
         return service.listDataSetsByCode(session.getSessionToken(), dataSetCodes);
@@ -490,13 +490,13 @@ public final class EncapsulatedOpenBISService implements IEncapsulatedOpenBISSer
     }
 
     @Override
-    public ExternalData tryGetDataSet(String dataSetCode) throws UserFailureException
+    public AbstractExternalData tryGetDataSet(String dataSetCode) throws UserFailureException
     {
         return service.tryGetDataSet(session.getSessionToken(), dataSetCode);
     }
 
     @Override
-    public ExternalData tryGetDataSet(String sToken, String dataSetCode)
+    public AbstractExternalData tryGetDataSet(String sToken, String dataSetCode)
             throws UserFailureException
     {
         return service.tryGetDataSet(sToken, dataSetCode);
@@ -599,7 +599,7 @@ public final class EncapsulatedOpenBISService implements IEncapsulatedOpenBISSer
     }
 
     @Override
-    public List<ExternalData> listNewerDataSets(TrackingDataSetCriteria criteria)
+    public List<AbstractExternalData> listNewerDataSets(TrackingDataSetCriteria criteria)
             throws UserFailureException
     {
         return service
@@ -607,7 +607,7 @@ public final class EncapsulatedOpenBISService implements IEncapsulatedOpenBISSer
     }
 
     @Override
-    public List<ExternalData> listAvailableDataSets(ArchiverDataSetCriteria criteria)
+    public List<AbstractExternalData> listAvailableDataSets(ArchiverDataSetCriteria criteria)
             throws UserFailureException
     {
         return service.listAvailableDataSets(session.getSessionToken(), session.getDataStoreCode(),
@@ -718,7 +718,7 @@ public final class EncapsulatedOpenBISService implements IEncapsulatedOpenBISSer
     }
 
     @Override
-    public List<ExternalData> searchForDataSets(SearchCriteria searchCriteria)
+    public List<AbstractExternalData> searchForDataSets(SearchCriteria searchCriteria)
     {
         return service.searchForDataSets(session.getSessionToken(), searchCriteria);
     }
@@ -784,7 +784,7 @@ public final class EncapsulatedOpenBISService implements IEncapsulatedOpenBISSer
     }
 
     @Override
-    public List<ExternalData> listDataSetsForPostRegistration()
+    public List<AbstractExternalData> listDataSetsForPostRegistration()
     {
         return service.listDataSetsForPostRegistration(session.getSessionToken(),
                 session.getDataStoreCode());
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/IDataSetCommandExecutor.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/IDataSetCommandExecutor.java
index 55c525a7e9f9f8136cde29ff9f1320525b9c16e4..3588837f336d2e1d133aacf2d9b965d1cd3c58a4 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/IDataSetCommandExecutor.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/IDataSetCommandExecutor.java
@@ -24,7 +24,7 @@ import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IProcessingPlug
 import ch.systemsx.cisd.openbis.dss.generic.shared.IDataSetDeleter;
 import ch.systemsx.cisd.openbis.generic.shared.Constants;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUploadContext;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 
@@ -53,7 +53,7 @@ public interface IDataSetCommandExecutor extends IDataSetDeleter
      *            if no connection as admin should be used.
      */
     void scheduleUploadingDataSetsToCIFEX(ICIFEXRPCServiceFactory cifexServiceFactory,
-            MailClientParameters mailClientParameters, List<ExternalData> dataSets,
+            MailClientParameters mailClientParameters, List<AbstractExternalData> dataSets,
             DataSetUploadContext uploadContext, String cifexAdminUserOrNull,
             String cifexAdminPasswordOrNull);
 
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommand.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommand.java
index 4da24df40ddf1ec970bc27256300f8d398db195d..c87108226fc96380d105a6b55a3e305d17c33b9b 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommand.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommand.java
@@ -53,7 +53,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.IDataSetDirectoryProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IHierarchicalContentProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
@@ -266,7 +266,7 @@ class UploadingCommand implements IDataSetCommand
 
     private final ICIFEXRPCServiceFactory cifexServiceFactory;
 
-    private final List<ExternalData> dataSets;
+    private final List<AbstractExternalData> dataSets;
 
     private final String fileName;
 
@@ -295,7 +295,7 @@ class UploadingCommand implements IDataSetCommand
     transient IHierarchicalContentProvider hierarchicalContentProvider;
 
     UploadingCommand(ICIFEXRPCServiceFactory cifexServiceFactory,
-            MailClientParameters mailClientParameters, List<ExternalData> dataSets,
+            MailClientParameters mailClientParameters, List<AbstractExternalData> dataSets,
             DataSetUploadContext context, String cifexAdminUserOrNull,
             String cifexAdminPasswordOrNull)
     {
@@ -317,7 +317,7 @@ class UploadingCommand implements IDataSetCommand
     public List<String> getDataSetCodes()
     {
         List<String> result = new ArrayList<String>();
-        for (ExternalData dataSet : dataSets)
+        for (AbstractExternalData dataSet : dataSets)
         {
             result.add(dataSet.getCode());
         }
@@ -423,7 +423,7 @@ class UploadingCommand implements IDataSetCommand
         {
             outputStream = new FileOutputStream(zipFile);
             zipOutputStream = new ZipOutputStream(outputStream);
-            for (ExternalData externalData : dataSets)
+            for (AbstractExternalData externalData : dataSets)
             {
                 String newRootPath = createRootPath(externalData) + "/";
                 try
@@ -510,7 +510,7 @@ class UploadingCommand implements IDataSetCommand
         }
     }
 
-    private String createMetaData(ExternalData dataSet)
+    private String createMetaData(AbstractExternalData dataSet)
     {
         MetaDataBuilder builder = new MetaDataBuilder();
         builder.dataSet("code", dataSet.getCode());
@@ -526,10 +526,10 @@ class UploadingCommand implements IDataSetCommand
         builder.dataSetProperties(dataSet.getProperties());
 
         StringBuilder stringBuilder = new StringBuilder();
-        Collection<ExternalData> parents = dataSet.getParents();
+        Collection<AbstractExternalData> parents = dataSet.getParents();
         if (parents.isEmpty() == false)
         {
-            for (ExternalData parent : parents)
+            for (AbstractExternalData parent : parents)
             {
                 if (stringBuilder.length() > 0)
                 {
@@ -563,7 +563,7 @@ class UploadingCommand implements IDataSetCommand
         return builder.toString();
     }
 
-    private String createRootPath(ExternalData dataSet)
+    private String createRootPath(AbstractExternalData dataSet)
     {
         Sample sample = dataSet.getSample();
         Experiment experiment = dataSet.getExperiment();
@@ -606,7 +606,7 @@ class UploadingCommand implements IDataSetCommand
     {
         final StringBuilder b = new StringBuilder();
         b.append("Upload data sets to CIFEX: ");
-        for (ExternalData dataset : dataSets)
+        for (AbstractExternalData dataset : dataSets)
         {
             b.append(dataset.getCode());
             b.append(',');
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v1/DssServiceRpcGeneric.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v1/DssServiceRpcGeneric.java
index 68d439c26a8b3deac62d72cba3c4724411f6a45e..d13534251b87d79b5500ae8e7848d9107e03b978 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v1/DssServiceRpcGeneric.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/api/v1/DssServiceRpcGeneric.java
@@ -67,7 +67,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.utils.DatasetLocationUtil;
 import ch.systemsx.cisd.openbis.dss.generic.shared.utils.SegmentedStoreUtils;
 import ch.systemsx.cisd.openbis.dss.generic.shared.utils.Share;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO;
@@ -451,7 +451,7 @@ public class DssServiceRpcGeneric extends AbstractDssServiceRpc<IDssServiceRpcGe
     public void shuffleDataSet(String sessionToken, String dataSetCode, String shareId)
     {
         getOpenBISService().checkSession(sessionToken);
-        ExternalData dataSet = getOpenBISService().tryGetDataSet(dataSetCode);
+        AbstractExternalData dataSet = getOpenBISService().tryGetDataSet(dataSetCode);
         if (dataSet == null)
         {
             throw new UserFailureException("Unknown data set: " + dataSetCode);
@@ -543,7 +543,7 @@ public class DssServiceRpcGeneric extends AbstractDssServiceRpc<IDssServiceRpcGe
         List<DatasetDescription> dataSetDescriptions = new ArrayList<DatasetDescription>();
         for (String dataSetCode : dataSetCodes)
         {
-            ExternalData dataSet = getOpenBISService().tryGetDataSet(dataSetCode);
+            AbstractExternalData dataSet = getOpenBISService().tryGetDataSet(dataSetCode);
             dataSetDescriptions.add(translateToDescription(dataSet));
         }
         TableModel tableModel =
@@ -553,7 +553,7 @@ public class DssServiceRpcGeneric extends AbstractDssServiceRpc<IDssServiceRpcGe
         return new QueryTableModelTranslator(tableModel).translate();
     }
 
-    private static DatasetDescription translateToDescription(ExternalData dataSet)
+    private static DatasetDescription translateToDescription(AbstractExternalData dataSet)
     {
         return DataSetTranslator.translateToDescription(dataSet);
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/Cache.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/Cache.java
index 07a0a27d2c55c91bd34a58ee7883614ed11a286b..d4ae67cb8ece01f4d795ce841981c580959f9a7b 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/Cache.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/Cache.java
@@ -22,7 +22,7 @@ import java.util.Map;
 import ch.systemsx.cisd.common.utilities.ITimeProvider;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet;
 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.AbstractExternalData;
 
 /**
  * Helper class to cache objects retrieved from remote services. Used by
@@ -46,7 +46,7 @@ public class Cache
     }
     
     private final Map<String, TimeStampedObject<DataSet>> dataSets = new HashMap<String, Cache.TimeStampedObject<DataSet>>();
-    private final Map<String, TimeStampedObject<ExternalData>> externalData = new HashMap<String, Cache.TimeStampedObject<ExternalData>>();
+    private final Map<String, TimeStampedObject<AbstractExternalData>> externalData = new HashMap<String, Cache.TimeStampedObject<AbstractExternalData>>();
     private final Map<String, TimeStampedObject<Experiment>> experiments = new HashMap<String, Cache.TimeStampedObject<Experiment>>();
     
     private final ITimeProvider timeProvider;
@@ -66,12 +66,12 @@ public class Cache
         return getObject(dataSets, dataSetCode);
     }
 
-    ExternalData getExternalData(String code)
+    AbstractExternalData getExternalData(String code)
     {
         return getObject(externalData, code);
     }
 
-    void putExternalData(ExternalData dataSet)
+    void putExternalData(AbstractExternalData dataSet)
     {
         externalData.put(dataSet.getCode(), timestamp(dataSet));
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverContext.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverContext.java
index dc0815001c903f0921d8d6b82cd08e947af30783..c0949afd80fb6b5a4663e01e636956c3bbf319c5 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverContext.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/FtpPathResolverContext.java
@@ -29,7 +29,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetFetchOption;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentFetchOptions;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
 
@@ -90,13 +90,13 @@ public class FtpPathResolverContext implements ISessionTokenProvider
         return dataSet;
     }
 
-    public List<ExternalData> listDataSetsByCode(List<String> codes)
+    public List<AbstractExternalData> listDataSetsByCode(List<String> codes)
     {
         List<String> codesToAskFor = new ArrayList<String>();
-        List<ExternalData> dataSets = new ArrayList<ExternalData>();
+        List<AbstractExternalData> dataSets = new ArrayList<AbstractExternalData>();
         for (String code : codes)
         {
-            ExternalData dataSet = cache.getExternalData(code);
+            AbstractExternalData dataSet = cache.getExternalData(code);
             if (dataSet == null)
             {
                 codesToAskFor.add(code);
@@ -107,9 +107,9 @@ public class FtpPathResolverContext implements ISessionTokenProvider
         }
         if (codesToAskFor.isEmpty() == false)
         {
-            List<ExternalData> newDataSets =
+            List<AbstractExternalData> newDataSets =
                     service.listDataSetsByCode(sessionToken, codesToAskFor);
-            for (ExternalData newDataSet : newDataSets)
+            for (AbstractExternalData newDataSet : newDataSets)
             {
                 cache.putExternalData(newDataSet);
                 dataSets.add(newDataSet);
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileEvaluationContext.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileEvaluationContext.java
index 20aa978f3fc44b8f02f18196db094eef34df277c..93e7972d00aa758d9281598c6161425e17cdc0fa 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileEvaluationContext.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/FtpFileEvaluationContext.java
@@ -28,7 +28,7 @@ import org.apache.commons.lang.StringUtils;
 import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContent;
 import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContentNode;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IHierarchicalContentProvider;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * An object holding templates evaluation result data.
@@ -40,7 +40,7 @@ public class FtpFileEvaluationContext
 
     static class EvaluatedElement
     {
-        ExternalData dataSet;
+        AbstractExternalData dataSet;
 
         // will only be filled when the ${fileName} variable
         // is used in the template
@@ -80,7 +80,7 @@ public class FtpFileEvaluationContext
         evaluatedPaths.addAll(evaluatedPath);
     }
 
-    public IHierarchicalContent getHierarchicalContent(ExternalData dataSet)
+    public IHierarchicalContent getHierarchicalContent(AbstractExternalData dataSet)
     {
         String dataSetCode = dataSet.getCode();
         IHierarchicalContent result = contents.get(dataSetCode);
@@ -104,7 +104,7 @@ public class FtpFileEvaluationContext
         contents.clear();
     }
 
-    private IHierarchicalContent createHierarchicalContent(ExternalData dataSet)
+    private IHierarchicalContent createHierarchicalContent(AbstractExternalData dataSet)
     {
         return contentProvider.asContent(dataSet);
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolver.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolver.java
index 09c44b2f0dbed8e7b77d7e3da1f18370692ca3bf..f2cb92f06f5a8ca28146b2c1c6c838141dc6b25b 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolver.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolver.java
@@ -52,7 +52,7 @@ import ch.systemsx.cisd.openbis.generic.shared.IETLLIMSService;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 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.AbstractExternalData;
 
 /**
  * Resolves paths like
@@ -92,11 +92,11 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
 
     private final class DataSetFtpFolder extends AbstractFtpFolder
     {
-        private final ExternalData dataSet;
+        private final AbstractExternalData dataSet;
 
         private final FtpPathResolverContext resolverContext;
 
-        private DataSetFtpFolder(String absolutePath, ExternalData dataSet,
+        private DataSetFtpFolder(String absolutePath, AbstractExternalData dataSet,
                 FtpPathResolverContext resolverContext)
         {
             super(absolutePath);
@@ -145,10 +145,10 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
             {
                 return;
             }
-            List<ExternalData> dataSets = resolverContext.listDataSetsByCode(dataSetCodes);
+            List<AbstractExternalData> dataSets = resolverContext.listDataSetsByCode(dataSetCodes);
             for (int i = 0; i < dataSets.size(); i++)
             {
-                ExternalData ds = dataSets.get(i);
+                AbstractExternalData ds = dataSets.get(i);
                 String dataSetUniqueSuffix = evaluateTemplate(ds, null, computeDisambiguation(i));
                 if (false == isPresentInPath(dataSetUniqueSuffix))
                 {
@@ -186,7 +186,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
     /**
      * a template, that can contain special variables.
      * 
-     * @see #evaluateTemplate(ExternalData, String) to find out what variables are understood and
+     * @see #evaluateTemplate(AbstractExternalData, String) to find out what variables are understood and
      *      interpreted.
      */
     private final Template template;
@@ -243,7 +243,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
             return FtpPathResolverRegistry.getNonExistingFile(path, "Unknown experiment '"
                     + experimentId + "'.");
         }
-        List<ExternalData> dataSets =
+        List<AbstractExternalData> dataSets =
                 service.listDataSetsByExperimentID(sessionToken, new TechId(experiment));
         if (fileNamePresent)
         {
@@ -261,7 +261,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
     }
 
     private FtpFile resolve(final String path, final FtpPathResolverContext resolverContext,
-            List<ExternalData> dataSets)
+            List<AbstractExternalData> dataSets)
     {
         String[] pathElements =
                 StringUtils.splitByWholeSeparatorPreserveAllTokens(path,
@@ -272,7 +272,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
             String dataSetPathElement = pathElements[i];
             if (result == null)
             {
-                ExternalData dataSet = tryToFindDataSet(dataSets, dataSetPathElement);
+                AbstractExternalData dataSet = tryToFindDataSet(dataSets, dataSetPathElement);
                 if (dataSet == null)
                 {
                     return FtpPathResolverRegistry.getNonExistingFile(path,
@@ -304,12 +304,12 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
         return result;
     }
 
-    private ExternalData tryToFindDataSet(List<ExternalData> dataSets, String dataSetPathElement)
+    private AbstractExternalData tryToFindDataSet(List<AbstractExternalData> dataSets, String dataSetPathElement)
     {
         for (int disambiguationIdx = 0; disambiguationIdx < dataSets.size(); disambiguationIdx++)
         {
             String disambiguationVar = computeDisambiguation(disambiguationIdx);
-            ExternalData dataSet = dataSets.get(disambiguationIdx);
+            AbstractExternalData dataSet = dataSets.get(disambiguationIdx);
             String pathElement = evaluateTemplate(dataSet, null, disambiguationVar);
             if (dataSetPathElement.equals(pathElement))
             {
@@ -329,7 +329,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
         final String hierarchicalNodePath =
                 constructHierarchicalNodePath(matchingElement.pathInDataSet, pathInDataSet);
 
-        final ExternalData dataSet = matchingElement.dataSet;
+        final AbstractExternalData dataSet = matchingElement.dataSet;
         final IHierarchicalContentNodeFilter fileFilter = getFileFilter(dataSet);
         final IHierarchicalContent content = evalContext.getHierarchicalContent(dataSet);
         final IHierarchicalContentNode contentNodeOrNull = content.tryGetNode(hierarchicalNodePath);
@@ -425,7 +425,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
         IETLLIMSService service = context.getService();
         String sessionToken = context.getSessionToken();
 
-        List<ExternalData> dataSets =
+        List<AbstractExternalData> dataSets =
                 service.listDataSetsByExperimentID(sessionToken, new TechId(experiment));
 
         FtpFileEvaluationContext evalContext = evaluateDataSetPaths(context, dataSets);
@@ -467,13 +467,13 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
 
     private FtpFileEvaluationContext evaluateDataSetPaths(
             ISessionTokenProvider sessionTokenProvider,
-            List<ExternalData> dataSets)
+            List<AbstractExternalData> dataSets)
     {
         FtpFileEvaluationContext evalContext = createFtpFileEvaluationContext(sessionTokenProvider);
 
         for (int disambiguationIdx = 0; disambiguationIdx < dataSets.size(); disambiguationIdx++)
         {
-            ExternalData dataSet = dataSets.get(disambiguationIdx);
+            AbstractExternalData dataSet = dataSets.get(disambiguationIdx);
             try
             {
                 IHierarchicalContent hierarchicalContent =
@@ -494,7 +494,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
         return evalContext;
     }
 
-    private List<EvaluatedElement> evaluateDataSetPaths(ExternalData dataSet,
+    private List<EvaluatedElement> evaluateDataSetPaths(AbstractExternalData dataSet,
             IHierarchicalContentNode rootNode, int disambiguationIndex)
     {
         List<EvaluatedElement> result = new ArrayList<EvaluatedElement>();
@@ -514,7 +514,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
         return result;
     }
 
-    private IHierarchicalContentNode getDataSetFileListRoot(ExternalData dataSet,
+    private IHierarchicalContentNode getDataSetFileListRoot(AbstractExternalData dataSet,
             IHierarchicalContent hierachicalContent)
     {
         String fileListSubPathOrNull = getFileListSubPath(dataSet);
@@ -574,7 +574,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
         return Collections.singletonList(rootNode);
     }
 
-    private String evaluateTemplate(ExternalData dataSet, String fileName, String disambiguation)
+    private String evaluateTemplate(AbstractExternalData dataSet, String fileName, String disambiguation)
     {
         Template eval = template.createFreshCopy();
         eval.attemptToBind(DATA_SET_CODE_VARNAME, dataSet.getCode());
@@ -648,7 +648,7 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
             };
     }
 
-    private DataSetTypeConfig getDataSetTypeConfig(ExternalData dataSet)
+    private DataSetTypeConfig getDataSetTypeConfig(AbstractExternalData dataSet)
     {
         String dataSetType = dataSet.getDataSetType().getCode();
         DataSetTypeConfig dsConfig = dataSetTypeConfigs.get(dataSetType);
@@ -661,12 +661,12 @@ public class TemplateBasedDataSetResourceResolver implements IFtpPathResolver,
         }
     }
 
-    private IHierarchicalContentNodeFilter getFileFilter(ExternalData dataSet)
+    private IHierarchicalContentNodeFilter getFileFilter(AbstractExternalData dataSet)
     {
         return getDataSetTypeConfig(dataSet).fileFilter;
     }
 
-    private String getFileListSubPath(ExternalData dataSet)
+    private String getFileListSubPath(AbstractExternalData dataSet)
     {
         return getDataSetTypeConfig(dataSet).fileListSubPath;
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/DataSetProcessingContext.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/DataSetProcessingContext.java
index d2a8624a4d0a25fca49b75dac47f918b7f5b7cf0..ccbeb43ee401285b12e7207157a3c530c5718a7d 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/DataSetProcessingContext.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/DataSetProcessingContext.java
@@ -28,7 +28,7 @@ import ch.systemsx.cisd.common.server.ISessionTokenProvider;
 import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContent;
 import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IProcessingPluginTask;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.internal.ISessionWorkspaceProvider;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 import ch.systemsx.cisd.openbis.generic.shared.dto.OpenBISSessionHolder;
 
@@ -171,7 +171,7 @@ public class DataSetProcessingContext
             {
 
                 @Override
-                public IHierarchicalContent asContent(ExternalData dataSet)
+                public IHierarchicalContent asContent(AbstractExternalData dataSet)
                 {
                     assertAuthorization(dataSet.getCode());
                     return contentProvider.asContent(dataSet);
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProvider.java
index 62a62a24397953824c88771d14bc907446d05795..06c121ce9e11ea45921930702edbf6ca332eeef1 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProvider.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/HierarchicalContentProvider.java
@@ -37,7 +37,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.content.IDssServiceRpcGeneric
 import ch.systemsx.cisd.openbis.dss.generic.shared.content.PathInfoDBAwareHierarchicalContentFactory;
 import ch.systemsx.cisd.openbis.dss.generic.shared.content.RemoteHierarchicalContent;
 import ch.systemsx.cisd.openbis.dss.generic.shared.utils.PathInfoDataSourceProvider;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataLocationNode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocationNode;
@@ -145,7 +145,7 @@ public class HierarchicalContentProvider implements IHierarchicalContentProvider
     }
 
     @Override
-    public IHierarchicalContent asContent(ExternalData dataSet)
+    public IHierarchicalContent asContent(AbstractExternalData dataSet)
     {
         return asContent(new ExternalDataLocationNode(dataSet));
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedBasicOpenBISService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedBasicOpenBISService.java
index c350b7728b852fad4a97f900781d9e2314348781..00c92b7c0a6fe0a9fcb76826f76dd54f42c75873 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedBasicOpenBISService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedBasicOpenBISService.java
@@ -26,7 +26,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.IObjectId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetTypeWithVocabularyTerms;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListMaterialCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
@@ -74,7 +74,7 @@ public interface IEncapsulatedBasicOpenBISService
      * token.
      */
     @ManagedAuthentication
-    public ExternalData tryGetDataSet(final String dataSetCode) throws UserFailureException;
+    public AbstractExternalData tryGetDataSet(final String dataSetCode) throws UserFailureException;
 
     /**
      * {@link IETLLIMSService#searchForSamples(String, SearchCriteria)}
@@ -96,7 +96,7 @@ public interface IEncapsulatedBasicOpenBISService
      * {@link IETLLIMSService#searchForDataSets(String, SearchCriteria)}
      */
     @ManagedAuthentication
-    public List<ExternalData> searchForDataSets(SearchCriteria searchCriteria);
+    public List<AbstractExternalData> searchForDataSets(SearchCriteria searchCriteria);
 
     /**
      * {@link IETLLIMSService#listExperiments(String, ProjectIdentifier)}
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedOpenBISService.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedOpenBISService.java
index 0d68c4c159a191c647f07ef5fb087fa0ea198eba..cc7e55742308fd3e27186d934fd4520fbed8402a 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedOpenBISService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IEncapsulatedOpenBISService.java
@@ -30,7 +30,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletedDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystem;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocationNode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
@@ -87,7 +87,7 @@ public interface IEncapsulatedOpenBISService extends IEncapsulatedBasicOpenBISSe
      * Tries to get the data set for the specified data set code and specified session.
      */
     @ManagedAuthentication
-    public ExternalData tryGetDataSet(final String sessionToken, final String dataSetCode)
+    public AbstractExternalData tryGetDataSet(final String sessionToken, final String dataSetCode)
             throws UserFailureException;
 
     /**
@@ -155,7 +155,7 @@ public interface IEncapsulatedOpenBISService extends IEncapsulatedBasicOpenBISSe
      * Lists all data sets of the specified experiment ID.
      */
     @ManagedAuthentication
-    public List<ExternalData> listDataSetsByExperimentID(long experimentID)
+    public List<AbstractExternalData> listDataSetsByExperimentID(long experimentID)
             throws UserFailureException;
 
     /**
@@ -165,7 +165,7 @@ public interface IEncapsulatedOpenBISService extends IEncapsulatedBasicOpenBISSe
      *            returned.
      */
     @ManagedAuthentication
-    public List<ExternalData> listDataSetsBySampleID(long sampleID,
+    public List<AbstractExternalData> listDataSetsBySampleID(long sampleID,
             boolean showOnlyDirectlyConnected) throws UserFailureException;
 
     /**
@@ -174,7 +174,7 @@ public interface IEncapsulatedOpenBISService extends IEncapsulatedBasicOpenBISSe
      * @return plain data sets without properties, samples, and experiments.
      */
     @ManagedAuthentication
-    public List<ExternalData> listDataSetsByCode(List<String> dataSetCodes)
+    public List<AbstractExternalData> listDataSetsByCode(List<String> dataSetCodes)
             throws UserFailureException;
 
     /**
@@ -276,7 +276,7 @@ public interface IEncapsulatedOpenBISService extends IEncapsulatedBasicOpenBISSe
 
     /** @see IETLLIMSService#listDataSets(String, String, TrackingDataSetCriteria) */
     @ManagedAuthentication
-    public List<ExternalData> listNewerDataSets(TrackingDataSetCriteria criteria)
+    public List<AbstractExternalData> listNewerDataSets(TrackingDataSetCriteria criteria)
             throws UserFailureException;
 
     /**
@@ -341,7 +341,7 @@ public interface IEncapsulatedOpenBISService extends IEncapsulatedBasicOpenBISSe
 
     /** See {@link IETLLIMSService#listAvailableDataSets(String, String, ArchiverDataSetCriteria)} */
     @ManagedAuthentication
-    public List<ExternalData> listAvailableDataSets(ArchiverDataSetCriteria criteria)
+    public List<AbstractExternalData> listAvailableDataSets(ArchiverDataSetCriteria criteria)
             throws UserFailureException;
 
     /** See {@link IETLLIMSService#archiveDatasets(String, List, boolean)} */
@@ -465,7 +465,7 @@ public interface IEncapsulatedOpenBISService extends IEncapsulatedBasicOpenBISSe
      * {@link IETLLIMSService#listDataSetsForPostRegistration(String, String)}
      */
     @ManagedAuthentication
-    public List<ExternalData> listDataSetsForPostRegistration();
+    public List<AbstractExternalData> listDataSetsForPostRegistration();
 
     /**
      * {@link IETLLIMSService#didEntityOperationsSucceed(String, TechId)}
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IHierarchicalContentProvider.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IHierarchicalContentProvider.java
index 441f50e04d390b4fd5f1b48ad98554203b076bb7..953d97a31785207532ec7fba56250d7744991853 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IHierarchicalContentProvider.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/IHierarchicalContentProvider.java
@@ -20,7 +20,7 @@ import java.io.File;
 
 import ch.systemsx.cisd.common.server.ISessionTokenProvider;
 import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContent;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 
 /**
@@ -45,14 +45,14 @@ public interface IHierarchicalContentProvider
     IHierarchicalContent asContent(String dataSetCode) throws IllegalArgumentException;
 
     /**
-     * A faster alternative of {@link #asContent(String)} for the case when an {@link ExternalData}
+     * A faster alternative of {@link #asContent(String)} for the case when an {@link AbstractExternalData}
      * object has already been fetched from the openBIS AS.
      * 
-     * @param dataSet a fully populated {@link ExternalData} instance. For container data sets all
+     * @param dataSet a fully populated {@link AbstractExternalData} instance. For container data sets all
      *            physical (contained) data sets must be present.
      * @return {@link IHierarchicalContent} for the specified data set
      */
-    IHierarchicalContent asContent(ExternalData dataSet);
+    IHierarchicalContent asContent(AbstractExternalData dataSet);
 
     /**
      * @return {@link IHierarchicalContent} for the specified data set
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 49f0ece8b31b31d3678d5feea8617256f2c6377a..1981fe86627a198bff20cb1aaccb75f47aca5eed 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
@@ -30,7 +30,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.utils.ToStringUtil;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExtractableData;
@@ -110,7 +110,7 @@ public class DataSetInformation implements Serializable
 
     private String containerDatasetPermIdOrNull;
 
-    private ExternalData containerDataSetOrNull;
+    private AbstractExternalData containerDataSetOrNull;
 
     /** This constructor is for serialization. */
     public DataSetInformation()
@@ -496,12 +496,12 @@ public class DataSetInformation implements Serializable
         this.containerDatasetPermIdOrNull = containerDatasetPermIdOrNull;
     }
 
-    public ExternalData tryGetContainerDataSet()
+    public AbstractExternalData tryGetContainerDataSet()
     {
         return containerDataSetOrNull;
     }
 
-    public void setContainerDataSet(ExternalData containerDataSetOrNull)
+    public void setContainerDataSet(AbstractExternalData containerDataSetOrNull)
     {
         this.containerDataSetOrNull = containerDataSetOrNull;
     }
diff --git a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java
index 4039dd3ebc2da78fef1e1f15186437a036970dc7..cb8e083787eb7c686ae6378ef48f15a73cdfdd01 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/openbis/dss/generic/shared/utils/SegmentedStoreUtils.java
@@ -51,7 +51,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.IDataSetDirectoryProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IChecksumProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IShareIdManager;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO;
 
@@ -257,7 +257,7 @@ public class SegmentedStoreUtils
             return;
         }
         final String dataSetCode = dataSetDirInStore.getName();
-        ExternalData dataSet = service.tryGetDataSet(dataSetCode);
+        AbstractExternalData dataSet = service.tryGetDataSet(dataSetCode);
         if (dataSet == null)
         {
             throw new UserFailureException("Unknown data set: " + dataSetCode);
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/plugins/ExperimentBasedArchivingTaskTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/plugins/ExperimentBasedArchivingTaskTest.java
index cb3a28ac5bf75da9788ce1aca82ad3524071526e..c6bc026a9d3b4ceba6f09907afe0b53a65cb3b31 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/plugins/ExperimentBasedArchivingTaskTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/plugins/ExperimentBasedArchivingTaskTest.java
@@ -41,7 +41,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PlaceholderDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetBuilder;
@@ -113,7 +113,7 @@ public class ExperimentBasedArchivingTaskTest extends AbstractFileSystemTestCase
 
     private PhysicalDataSet lockedDataSet;
 
-    private ExternalData notARealDataSet;
+    private AbstractExternalData notARealDataSet;
 
     private PhysicalDataSet dataSetOfIgnoredType;
 
@@ -470,7 +470,7 @@ public class ExperimentBasedArchivingTaskTest extends AbstractFileSystemTestCase
             });
     }
 
-    private void prepareListDataSetsOf(final Experiment experiment, final ExternalData... dataSets)
+    private void prepareListDataSetsOf(final Experiment experiment, final AbstractExternalData... dataSets)
     {
         context.checking(new Expectations()
             {
@@ -499,7 +499,7 @@ public class ExperimentBasedArchivingTaskTest extends AbstractFileSystemTestCase
         }
     }
 
-    private void prepareArchivingDataSets(ExternalData... dataSets)
+    private void prepareArchivingDataSets(AbstractExternalData... dataSets)
     {
         final List<String> dataSetCodes = getDataSetCodes(dataSets);
         context.checking(new Expectations()
@@ -510,10 +510,10 @@ public class ExperimentBasedArchivingTaskTest extends AbstractFileSystemTestCase
             });
     }
 
-    private List<String> getDataSetCodes(ExternalData... dataSets)
+    private List<String> getDataSetCodes(AbstractExternalData... dataSets)
     {
         final List<String> dataSetCodes = new ArrayList<String>();
-        for (ExternalData dataSet : dataSets)
+        for (AbstractExternalData dataSet : dataSets)
         {
             dataSetCodes.add(dataSet.getCode());
         }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/postregistration/ArchivingPostRegistrationTaskTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/postregistration/ArchivingPostRegistrationTaskTest.java
index f2e5a001c05624b1f5fe1b714c0be1196335efff..596058a1657501804dad76a47bea4990e1d0f1ab 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/postregistration/ArchivingPostRegistrationTaskTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/etlserver/postregistration/ArchivingPostRegistrationTaskTest.java
@@ -44,7 +44,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.ProcessingStatus;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProviderTestWrapper;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 
 /**
@@ -126,7 +126,7 @@ public class ArchivingPostRegistrationTaskTest extends AssertJUnit
                     will(returnValue(directoryProvider));
 
                     one(service).listDataSetsByCode(Arrays.asList(DATASET_CODE));
-                    List<ExternalData> externalDatas = Arrays.asList(createDataSet());
+                    List<AbstractExternalData> externalDatas = Arrays.asList(createDataSet());
                     will(returnValue(externalDatas));
 
                     one(service).compareAndSetDataSetStatus(DATASET_CODE, AVAILABLE,
@@ -160,7 +160,7 @@ public class ArchivingPostRegistrationTaskTest extends AssertJUnit
                 + "you can configure an \'AutoArchiverTask\'.";
     }
 
-    private ExternalData createDataSet()
+    private AbstractExternalData createDataSet()
     {
         DataStore dataStore = new DataStore();
         dataStore.setCode("STANDARD");
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/FeatureRichDataSetImportSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/FeatureRichDataSetImportSystemTest.java
index 4adeafc839711fcc377acc32838f0dfc1289663d..6dd5993169fe56a6eb1c87118e05a0874629f448 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/FeatureRichDataSetImportSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/FeatureRichDataSetImportSystemTest.java
@@ -27,7 +27,7 @@ import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListMaterialCriteria;
@@ -230,7 +230,7 @@ public class FeatureRichDataSetImportSystemTest extends SystemTestCase
 
     private void assertLinkedDataSetImported(IEncapsulatedOpenBISService openBISService)
     {
-        ExternalData a = listOneDataSet(openBISService, "FR_LINK_CODE");
+        AbstractExternalData a = listOneDataSet(openBISService, "FR_LINK_CODE");
 
         assertTrue("The imported dataset should be isLinkData", a.isLinkData());
         assertTrue("The imported dataset should be LinkDataSet", a instanceof LinkDataSet);
@@ -245,11 +245,11 @@ public class FeatureRichDataSetImportSystemTest extends SystemTestCase
     /**
      * List exactly one dataset. assert that it exists.
      */
-    private ExternalData listOneDataSet(IEncapsulatedOpenBISService openBISService, String code)
+    private AbstractExternalData listOneDataSet(IEncapsulatedOpenBISService openBISService, String code)
     {
         List<String> codes = new LinkedList<String>();
         codes.add(code);
-        List<ExternalData> x = openBISService.listDataSetsByCode(codes);
+        List<AbstractExternalData> x = openBISService.listDataSetsByCode(codes);
 
         assertEquals("Exactly one data set expected.", 1, x.size());
 
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/JavaDropboxSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/JavaDropboxSystemTest.java
index 0d14f50d8b93b90ed452932d1c59ba6bc7ae1b45..c70328785a8f2dec8a5f90217f8c118119b964c1 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/JavaDropboxSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/JavaDropboxSystemTest.java
@@ -25,7 +25,7 @@ import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria;
 
 /**
@@ -53,8 +53,8 @@ public class JavaDropboxSystemTest extends SystemTestCase
     {
         preexistingDataSetCodes = new HashSet<String>();
         IEncapsulatedOpenBISService openBISService = ServiceProvider.getOpenBISService();
-        List<ExternalData> dataSets = listAllYoungDataSets(openBISService);
-        for (ExternalData dto : dataSets)
+        List<AbstractExternalData> dataSets = listAllYoungDataSets(openBISService);
+        for (AbstractExternalData dto : dataSets)
         {
             preexistingDataSetCodes.add(dto.getCode());
         }
@@ -65,8 +65,8 @@ public class JavaDropboxSystemTest extends SystemTestCase
         LinkedList<String> newCodes = new LinkedList<String>();
 
         IEncapsulatedOpenBISService openBISService = ServiceProvider.getOpenBISService();
-        List<ExternalData> dataSets = listAllYoungDataSets(openBISService);
-        for (ExternalData dto : dataSets)
+        List<AbstractExternalData> dataSets = listAllYoungDataSets(openBISService);
+        for (AbstractExternalData dto : dataSets)
         {
             String code = dto.getCode();
 
@@ -78,9 +78,9 @@ public class JavaDropboxSystemTest extends SystemTestCase
         return newCodes;
     }
 
-    private List<ExternalData> listAllYoungDataSets(IEncapsulatedOpenBISService openBISService)
+    private List<AbstractExternalData> listAllYoungDataSets(IEncapsulatedOpenBISService openBISService)
     {
-        List<ExternalData> dataSets =
+        List<AbstractExternalData> dataSets =
                 openBISService.listNewerDataSets(new TrackingDataSetCriteria(24));
         return dataSets;
     }
@@ -99,11 +99,11 @@ public class JavaDropboxSystemTest extends SystemTestCase
 
         List<String> codes = newDataSetCodes();
 
-        List<ExternalData> x = openBISService.listDataSetsByCode(codes);
+        List<AbstractExternalData> x = openBISService.listDataSetsByCode(codes);
 
         assertEquals("Exactly one dataset should have been imported.", 1, x.size());
 
-        for (ExternalData a : x)
+        for (AbstractExternalData a : x)
         {
             assertEquals("/CISD/JAVA-TEST", a.getSampleIdentifier());
             assertEquals("/CISD/NEMO/EXP-TEST-1", a.getExperiment().getIdentifier());
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/LinkDataSetImportSystemTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/LinkDataSetImportSystemTest.java
index b9a632f1eb58340cbe10b2c225d3c8ddc6d0f756..e0689bed6b6f49bbc56fb61038164c2b2d82d2cd 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/LinkDataSetImportSystemTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/datastoreserver/systemtests/LinkDataSetImportSystemTest.java
@@ -25,7 +25,7 @@ import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria;
 
@@ -53,8 +53,8 @@ public class LinkDataSetImportSystemTest extends SystemTestCase
     {
         preexistingDataSetCodes = new HashSet<String>();
         IEncapsulatedOpenBISService openBISService = ServiceProvider.getOpenBISService();
-        List<ExternalData> dataSets = listAllYoungDataSets(openBISService);
-        for (ExternalData dto : dataSets)
+        List<AbstractExternalData> dataSets = listAllYoungDataSets(openBISService);
+        for (AbstractExternalData dto : dataSets)
         {
             preexistingDataSetCodes.add(dto.getCode());
         }
@@ -65,8 +65,8 @@ public class LinkDataSetImportSystemTest extends SystemTestCase
         LinkedList<String> newCodes = new LinkedList<String>();
 
         IEncapsulatedOpenBISService openBISService = ServiceProvider.getOpenBISService();
-        List<ExternalData> dataSets = listAllYoungDataSets(openBISService);
-        for (ExternalData dto : dataSets)
+        List<AbstractExternalData> dataSets = listAllYoungDataSets(openBISService);
+        for (AbstractExternalData dto : dataSets)
         {
             String code = dto.getCode();
 
@@ -78,9 +78,9 @@ public class LinkDataSetImportSystemTest extends SystemTestCase
         return newCodes;
     }
 
-    private List<ExternalData> listAllYoungDataSets(IEncapsulatedOpenBISService openBISService)
+    private List<AbstractExternalData> listAllYoungDataSets(IEncapsulatedOpenBISService openBISService)
     {
-        List<ExternalData> dataSets =
+        List<AbstractExternalData> dataSets =
                 openBISService.listNewerDataSets(new TrackingDataSetCriteria(24));
         return dataSets;
     }
@@ -99,11 +99,11 @@ public class LinkDataSetImportSystemTest extends SystemTestCase
 
         List<String> codes = newDataSetCodes();
 
-        List<ExternalData> x = openBISService.listDataSetsByCode(codes);
+        List<AbstractExternalData> x = openBISService.listDataSetsByCode(codes);
 
         assertEquals("Exactly one dataset should have been imported.", 1, x.size());
 
-        for (ExternalData a : x)
+        for (AbstractExternalData a : x)
         {
             assertTrue("The imported dataset should be isLinkData", a.isLinkData());
             assertTrue("The imported dataset should be LinkDataSet", a instanceof LinkDataSet);
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceTest.java
index 2383a286d5399b67d71a113d890acfd9e7edc1be..350d82625c2d838de2ae14c43851699234f98fc5 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DataStoreServiceTest.java
@@ -38,7 +38,7 @@ import ch.systemsx.cisd.openbis.dss.generic.server.plugins.tasks.IPluginTaskInfo
 import ch.systemsx.cisd.openbis.dss.generic.shared.IShareIdManager;
 import ch.systemsx.cisd.openbis.dss.generic.shared.utils.PluginUtilTest;
 import ch.systemsx.cisd.openbis.generic.shared.IDataStoreService;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUploadContext;
 import ch.systemsx.cisd.openbis.generic.shared.dto.builders.DatasetDescriptionBuilder;
 
@@ -222,7 +222,7 @@ public class DataStoreServiceTest extends AssertJUnit
     @Test
     public void testUploadDataSetsForInvalidPassword()
     {
-        final List<ExternalData> dataSets = new ArrayList<ExternalData>();
+        final List<AbstractExternalData> dataSets = new ArrayList<AbstractExternalData>();
         final DataSetUploadContext uploadContext = new DataSetUploadContext();
         uploadContext.setCifexURL(CIFEX_URL);
         uploadContext.setUserID("user");
@@ -253,7 +253,7 @@ public class DataStoreServiceTest extends AssertJUnit
     @Test
     public void testUploadDataSets()
     {
-        final List<ExternalData> dataSets = new ArrayList<ExternalData>();
+        final List<AbstractExternalData> dataSets = new ArrayList<AbstractExternalData>();
         final DataSetUploadContext uploadContext = new DataSetUploadContext();
         uploadContext.setCifexURL(CIFEX_URL);
         uploadContext.setUserID("user");
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServletTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServletTest.java
index 611a226b833bd7befdf059e9ed5c32d37ac3b656..e841dd9e388935e893e52e17660accc543fd6021 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServletTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/DatasetDownloadServletTest.java
@@ -65,7 +65,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.utils.DatasetLocationUtil;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataLocationNode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LocatorType;
@@ -205,7 +205,7 @@ public class DatasetDownloadServletTest
     public void testInitialDoGet() throws Exception
     {
         final StringWriter writer = new StringWriter();
-        final ExternalData externalData = createDataSet();
+        final AbstractExternalData externalData = createDataSet();
         prepareParseRequestURL();
         prepareForObtainingDataSetFromServer(externalData);
         prepareForGettingDataSetFromSession(externalData, "");
@@ -279,7 +279,7 @@ public class DatasetDownloadServletTest
     public void testInitialDoGetButDataSetNotFoundInStore() throws Exception
     {
         final StringWriter writer = new StringWriter();
-        final ExternalData externalData = createDataSet();
+        final AbstractExternalData externalData = createDataSet();
         prepareParseRequestURL();
         prepareForObtainingDataSetFromServer(externalData);
         prepareLocking();
@@ -355,7 +355,7 @@ public class DatasetDownloadServletTest
     public void testDoGetSubFolder() throws Exception
     {
         final StringWriter writer = new StringWriter();
-        final ExternalData externalData = createDataSet();
+        final AbstractExternalData externalData = createDataSet();
         prepareForObtainingDataSetFromServer(externalData);
         prepareForGettingDataSetFromSession(externalData, ESCAPED_EXAMPLE_DATA_SET_SUB_FOLDER_NAME);
         prepareLocking();
@@ -388,7 +388,7 @@ public class DatasetDownloadServletTest
     @Test()
     public void testDoGetFile() throws Exception
     {
-        final ExternalData externalData = createDataSet();
+        final AbstractExternalData externalData = createDataSet();
 
         final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
         prepareParseRequestURL();
@@ -436,7 +436,7 @@ public class DatasetDownloadServletTest
         BufferedImage image = new BufferedImage(100, 200, BufferedImage.TYPE_INT_RGB);
         ImageIO.write(image, "png", EXAMPLE_FILE);
         prepareParseRequestURLForThumbnail(100, 50);
-        final ExternalData externalData = createDataSet();
+        final AbstractExternalData externalData = createDataSet();
         prepareCheckDatasetAccess();
         prepareForObtainingDataSetFromServer(externalData);
         prepareLocking();
@@ -485,7 +485,7 @@ public class DatasetDownloadServletTest
     public void testDoGetNonExistingFile() throws Exception
     {
         final StringWriter writer = new StringWriter();
-        final ExternalData externalData = createDataSet();
+        final AbstractExternalData externalData = createDataSet();
         prepareParseRequestURL();
         prepareForObtainingDataSetFromServer(externalData);
         prepareLocking();
@@ -585,7 +585,7 @@ public class DatasetDownloadServletTest
         context.assertIsSatisfied();
     }
 
-    private void prepareForGettingDataSetFromSession(final ExternalData externalData,
+    private void prepareForGettingDataSetFromSession(final AbstractExternalData externalData,
             final String path)
     {
         context.checking(new Expectations()
@@ -597,7 +597,7 @@ public class DatasetDownloadServletTest
 
                     one(httpSession).getAttribute(
                             AbstractDatasetDownloadServlet.DATA_SET_SESSION_KEY);
-                    Map<String, ExternalData> map = new HashMap<String, ExternalData>();
+                    Map<String, AbstractExternalData> map = new HashMap<String, AbstractExternalData>();
                     map.put(externalData.getCode(), externalData);
                     will(Expectations.returnValue(map));
 
@@ -616,7 +616,7 @@ public class DatasetDownloadServletTest
             });
     }
 
-    private void prepareGetRequestURI(Expectations exp, final ExternalData externalData,
+    private void prepareGetRequestURI(Expectations exp, final AbstractExternalData externalData,
             final String path)
     {
         exp.one(request).getRequestURI();
@@ -674,7 +674,7 @@ public class DatasetDownloadServletTest
             });
     }
 
-    private void prepareForObtainingDataSetFromServer(final ExternalData externalData)
+    private void prepareForObtainingDataSetFromServer(final AbstractExternalData externalData)
     {
         prepareCreateSession();
         prepareTryGetDatasetLocation(externalData);
@@ -704,7 +704,7 @@ public class DatasetDownloadServletTest
             });
     }
 
-    private void prepareTryGetDatasetLocation(final ExternalData externalData)
+    private void prepareTryGetDatasetLocation(final AbstractExternalData externalData)
     {
         context.checking(new Expectations()
             {
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommandTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommandTest.java
index f25a2f455f97830e8d00acb10f359da4052c7fd9..573f4dab14fb75a30957b372e95d07e65d3561c1 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommandTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/UploadingCommandTest.java
@@ -58,7 +58,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.IDataSetDirectoryProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IHierarchicalContentProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IShareIdManager;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetKind;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetRelationshipPE;
@@ -116,7 +116,7 @@ public class UploadingCommandTest extends AssertJUnit
                     }
 
                     @Override
-                    public IHierarchicalContent asContent(ExternalData dataSet)
+                    public IHierarchicalContent asContent(AbstractExternalData dataSet)
                     {
                         return getContent(dataSet.getCode());
                     }
@@ -199,7 +199,7 @@ public class UploadingCommandTest extends AssertJUnit
 
     private DataSetUploadContext uploadContextNoPasswordNotAuthenticated;
 
-    private List<ExternalData> dataSets;
+    private List<AbstractExternalData> dataSets;
 
     private UploadingCommand command;
 
@@ -247,14 +247,14 @@ public class UploadingCommandTest extends AssertJUnit
         uploadContextNoPasswordNotAuthenticated.setFileName(ZIP_FILENAME);
         createTestData(LOCATION1);
         ds2 = createTestData(LOCATION2);
-        ExternalData dataSet1 =
+        AbstractExternalData dataSet1 =
                 DataSetTranslator.translate(createDataSet("1"), "?", null, null,
                         ExperimentTranslator.LoadableFields.PROPERTIES);
         System.out.println("ds1:" + dataSet1.getExperiment().getProperties());
-        ExternalData dataSet2 =
+        AbstractExternalData dataSet2 =
                 DataSetTranslator.translate(createDataSet("2"), "?", null, null,
                         ExperimentTranslator.LoadableFields.PROPERTIES);
-        dataSets = Arrays.<ExternalData> asList(dataSet1, dataSet2);
+        dataSets = Arrays.<AbstractExternalData> asList(dataSet1, dataSet2);
         command =
                 new UploadingCommand(factory, mailClientParameters, dataSets, uploadContext, null,
                         null);
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/CacheTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/CacheTest.java
index 8352127bc8a53adb6e52e945deae30d73c9f8a87..f5891507718b4639dd5f0b122ec6494c5d40129b 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/CacheTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/CacheTest.java
@@ -26,7 +26,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.EntityRegistrationDeta
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.EntityRegistrationDetails.EntityRegistrationDetailsInitializer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
 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.AbstractExternalData;
 
 /**
  * 
@@ -56,7 +56,7 @@ public class CacheTest extends AssertJUnit
     @Test
     public void testGetExternalData()
     {
-        ExternalData dataSet = new ContainerDataSet();
+        AbstractExternalData dataSet = new ContainerDataSet();
         dataSet.setCode("ds1");
         Cache cache = cache(0, Cache.LIVE_TIME / 2, Cache.LIVE_TIME + 1);
         
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolverTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolverTest.java
index bf878d12a801446eef64607123e6ed312f570b12..9628e1228b0ac2a488c1f5c69ad73743ea158072 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolverTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/ftp/resolver/TemplateBasedDataSetResourceResolverTest.java
@@ -62,7 +62,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentFetchOptions;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
@@ -84,7 +84,7 @@ public class TemplateBasedDataSetResourceResolverTest extends AbstractFileSystem
         }
 
         @Override
-        public IHierarchicalContent asContent(ExternalData dataSet)
+        public IHierarchicalContent asContent(AbstractExternalData dataSet)
         {
             return asContent((IDatasetLocation) dataSet.tryGetAsDataSet());
         }
@@ -268,8 +268,8 @@ public class TemplateBasedDataSetResourceResolverTest extends AbstractFileSystem
         resolver = new TemplateBasedDataSetResourceResolver(config);
         resolver.setContentProvider(simpleFileContentProvider);
 
-        ds1.setParents(Arrays.<ExternalData> asList(ds2));
-        final List<ExternalData> dataSets = Arrays.<ExternalData> asList(ds1);
+        ds1.setParents(Arrays.<AbstractExternalData> asList(ds2));
+        final List<AbstractExternalData> dataSets = Arrays.<AbstractExternalData> asList(ds1);
 
         prepareExperimentListExpectations(dataSets);
         prepareGetDataSetMetaData(ds1);
@@ -300,9 +300,9 @@ public class TemplateBasedDataSetResourceResolverTest extends AbstractFileSystem
         resolver = new TemplateBasedDataSetResourceResolver(config);
         resolver.setContentProvider(simpleFileContentProvider);
 
-        ds1.setParents(Arrays.<ExternalData> asList(ds2));
-        ds2.setChildren(Arrays.<ExternalData> asList(ds1, ds3));
-        final List<ExternalData> dataSets = Arrays.<ExternalData> asList(ds1);
+        ds1.setParents(Arrays.<AbstractExternalData> asList(ds2));
+        ds2.setChildren(Arrays.<AbstractExternalData> asList(ds1, ds3));
+        final List<AbstractExternalData> dataSets = Arrays.<AbstractExternalData> asList(ds1);
 
         prepareExperimentListExpectations(dataSets);
         prepareGetDataSetMetaData(ds1);
@@ -339,9 +339,9 @@ public class TemplateBasedDataSetResourceResolverTest extends AbstractFileSystem
         resolver = new TemplateBasedDataSetResourceResolver(config);
         resolver.setContentProvider(simpleFileContentProvider);
 
-        ds1.setParents(Arrays.<ExternalData> asList(ds2));
-        ds2.setChildren(Arrays.<ExternalData> asList(ds1));
-        final List<ExternalData> dataSets = Arrays.<ExternalData> asList(ds1);
+        ds1.setParents(Arrays.<AbstractExternalData> asList(ds2));
+        ds2.setChildren(Arrays.<AbstractExternalData> asList(ds1));
+        final List<AbstractExternalData> dataSets = Arrays.<AbstractExternalData> asList(ds1);
 
         prepareExperimentListExpectations(dataSets);
         prepareGetDataSetMetaData(ds1);
@@ -375,9 +375,9 @@ public class TemplateBasedDataSetResourceResolverTest extends AbstractFileSystem
         resolver = new TemplateBasedDataSetResourceResolver(config);
         resolver.setContentProvider(simpleFileContentProvider);
 
-        ds1.setParents(Arrays.<ExternalData> asList(ds2));
-        ds2.setChildren(Arrays.<ExternalData> asList(ds1));
-        final List<ExternalData> dataSets = Arrays.<ExternalData> asList(ds1);
+        ds1.setParents(Arrays.<AbstractExternalData> asList(ds2));
+        ds2.setChildren(Arrays.<AbstractExternalData> asList(ds1));
+        final List<AbstractExternalData> dataSets = Arrays.<AbstractExternalData> asList(ds1);
 
         prepareExperimentListExpectations(dataSets);
         prepareGetDataSetMetaData(ds1);
@@ -414,7 +414,7 @@ public class TemplateBasedDataSetResourceResolverTest extends AbstractFileSystem
                 EXP_ID + FtpConstants.FILE_SEPARATOR + ds1.getCode() + FtpConstants.FILE_SEPARATOR
                         + subPath;
 
-        List<ExternalData> dataSets = Arrays.<ExternalData> asList(ds1);
+        List<AbstractExternalData> dataSets = Arrays.<AbstractExternalData> asList(ds1);
 
         prepareExperimentListExpectations(dataSets);
 
@@ -425,7 +425,7 @@ public class TemplateBasedDataSetResourceResolverTest extends AbstractFileSystem
                     IHierarchicalContent content =
                             context.mock(IHierarchicalContent.class, ds1.getCode());
 
-                    one(hierarchicalContentProvider).asContent((ExternalData) ds1);
+                    one(hierarchicalContentProvider).asContent((AbstractExternalData) ds1);
                     will(returnValue(content));
                     
                     one(hierarchicalContentProvider).cloneFor(with(sessionTokeProviderMatcher));
@@ -489,7 +489,7 @@ public class TemplateBasedDataSetResourceResolverTest extends AbstractFileSystem
         resolver = new TemplateBasedDataSetResourceResolver(config);
         resolver.setContentProvider(simpleFileContentProvider);
 
-        List<ExternalData> dataSets = Arrays.<ExternalData> asList(ds1, ds2);
+        List<AbstractExternalData> dataSets = Arrays.<AbstractExternalData> asList(ds1, ds2);
 
         prepareExperimentListExpectations(dataSets);
 
@@ -505,7 +505,7 @@ public class TemplateBasedDataSetResourceResolverTest extends AbstractFileSystem
         assertEquals(2, files.size());
     }
 
-    private void prepareExperimentListExpectations(final List<ExternalData> dataSets)
+    private void prepareExperimentListExpectations(final List<AbstractExternalData> dataSets)
     {
         context.checking(new Expectations()
             {
@@ -516,7 +516,7 @@ public class TemplateBasedDataSetResourceResolverTest extends AbstractFileSystem
             });
     }
 
-    private void prepareGetDataSetMetaData(final ExternalData... dataSets)
+    private void prepareGetDataSetMetaData(final AbstractExternalData... dataSets)
     {
         final List<String> codes = extractCodes(dataSets);
         final List<ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSet> translateDataSets =
@@ -535,7 +535,7 @@ public class TemplateBasedDataSetResourceResolverTest extends AbstractFileSystem
             });
     }
 
-    private void prepareListDataSetsByCode(final ExternalData... dataSets)
+    private void prepareListDataSetsByCode(final AbstractExternalData... dataSets)
     {
         final List<String> codes = extractCodes(dataSets);
         context.checking(new Expectations()
@@ -548,10 +548,10 @@ public class TemplateBasedDataSetResourceResolverTest extends AbstractFileSystem
 
     }
 
-    private List<String> extractCodes(final ExternalData... dataSets)
+    private List<String> extractCodes(final AbstractExternalData... dataSets)
     {
         final List<String> codes = new ArrayList<String>();
-        for (ExternalData dataSet : dataSets)
+        for (AbstractExternalData dataSet : dataSets)
         {
             codes.add(dataSet.getCode());
         }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/TSVViewReportingPluginTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/TSVViewReportingPluginTest.java
index 58edb1adad9143941194e73e4abb038cddf5ff66..354b77103622b27005aab674b835c9945034b5eb 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/TSVViewReportingPluginTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/standard/TSVViewReportingPluginTest.java
@@ -36,7 +36,7 @@ import ch.systemsx.cisd.openbis.common.io.hierarchical_content.DefaultFileBasedH
 import ch.systemsx.cisd.openbis.common.io.hierarchical_content.api.IHierarchicalContent;
 import ch.systemsx.cisd.openbis.dss.generic.shared.DataSetProcessingContext;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IHierarchicalContentProvider;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelColumnHeader;
@@ -104,7 +104,7 @@ public class TSVViewReportingPluginTest extends AbstractFileSystemTestCase
                 }
 
                 @Override
-                public IHierarchicalContent asContent(ExternalData dataSet)
+                public IHierarchicalContent asContent(AbstractExternalData dataSet)
                 {
                     return getContent(dataSet.getCode());
                 }
diff --git a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskParametersTest.java b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskParametersTest.java
index 166f66cf8095d34e3a729e7a8dead2c929b2d4f5..8dd7ba6f0452f31bef8c4d2654331663d9be8261 100644
--- a/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskParametersTest.java
+++ b/datastore_server/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/tasks/PluginTaskParametersTest.java
@@ -51,7 +51,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.DataSetProcessingContext;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IHierarchicalContentProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProviderTestWrapper;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 
@@ -102,7 +102,7 @@ public class PluginTaskParametersTest extends AbstractFileSystemTestCase
                 }
 
                 @Override
-                public IHierarchicalContent asContent(ExternalData dataSet)
+                public IHierarchicalContent asContent(AbstractExternalData dataSet)
                 {
                     return null;
                 }
diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFT.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFT.java
index 310e5fd6c93c647bf9d55535fa60ce872b953266..3738966e3de7e1bba5581179222ca09db54f6776 100644
--- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFT.java
+++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/dss/plugins/DataSetToSOFT.java
@@ -44,7 +44,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ProcessingStatus;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -175,7 +175,7 @@ public class DataSetToSOFT implements IProcessingPluginTask
                 {
                     operationLog.info("Create SOFT file for data set " + dataSetCode);
                 }
-                ExternalData srfDataSet = getService().tryGetDataSet(dataSetCode);
+                AbstractExternalData srfDataSet = getService().tryGetDataSet(dataSetCode);
                 Sample flowLaneSample = getFlowLaneSample(srfDataSet);
                 Sample flowCellSample = getFlowCellSample(flowLaneSample);
                 Sample sequencingSample = getSequencingSample(flowLaneSample);
@@ -243,7 +243,7 @@ public class DataSetToSOFT implements IProcessingPluginTask
     }
 
     private String createContent(Sample sequencingSample, Sample flowLaneSample,
-            ExternalData dataSet)
+            AbstractExternalData dataSet)
     {
         Template template = E_MAIL_CONTENT_TEMPLATE.createFreshCopy();
         bindExternalSampleName(template, sequencingSample);
@@ -310,7 +310,7 @@ public class DataSetToSOFT implements IProcessingPluginTask
         return null;
     }
 
-    private Sample getFlowLaneSample(ExternalData dataSet)
+    private Sample getFlowLaneSample(AbstractExternalData dataSet)
     {
         SampleIdentifier identifier = SampleIdentifierFactory.parse(dataSet.getSampleIdentifier());
         return getService().tryGetSampleWithExperiment(identifier);
diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackedEntities.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackedEntities.java
index d7c482af775c37fb5e2aa453027ecf691869bcec..094137bcfa7c0788e18c6f1fdfe1e14472f96c08 100644
--- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackedEntities.java
+++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/dto/TrackedEntities.java
@@ -18,7 +18,7 @@ package ch.ethz.bsse.cisd.dsu.tracking.dto;
 
 import java.util.List;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
 /**
@@ -33,10 +33,10 @@ public class TrackedEntities
 
     private final List<Sample> sequencingSamplesProcessed;
 
-    private final List<ExternalData> dataSets;
+    private final List<AbstractExternalData> dataSets;
 
     public TrackedEntities(List<Sample> sequencingSamplesToBeProcessed,
-            List<Sample> sequencingSamplesProcessed, List<ExternalData> dataSets)
+            List<Sample> sequencingSamplesProcessed, List<AbstractExternalData> dataSets)
     {
         this.sequencingSamplesToBeProcessed = sequencingSamplesToBeProcessed;
         this.sequencingSamplesProcessed = sequencingSamplesProcessed;
@@ -53,7 +53,7 @@ public class TrackedEntities
         return sequencingSamplesProcessed;
     }
 
-    public List<ExternalData> getDataSets()
+    public List<AbstractExternalData> getDataSets()
     {
         return dataSets;
     }
diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java
index 7ccc4a72cc25073116007b73646a25a12de8728f..4baae2d63089c24acd8f8345a49b867e9fc7f81c 100644
--- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java
+++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailData.java
@@ -19,7 +19,7 @@ package ch.ethz.bsse.cisd.dsu.tracking.email;
 import java.util.ArrayList;
 import java.util.List;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
 /**
@@ -35,7 +35,7 @@ public class EntityTrackingEmailData
 
     private List<Sample> sequencingSamplesProcessed = new ArrayList<Sample>(0);
 
-    private final List<ExternalData> dataSets = new ArrayList<ExternalData>(0);
+    private final List<AbstractExternalData> dataSets = new ArrayList<AbstractExternalData>(0);
 
     private final String recipient;
 
@@ -60,7 +60,7 @@ public class EntityTrackingEmailData
         return sequencingSamplesProcessed;
     }
 
-    public List<ExternalData> getDataSets()
+    public List<AbstractExternalData> getDataSets()
     {
         return dataSets;
     }
@@ -78,7 +78,7 @@ public class EntityTrackingEmailData
     }
 
     /** adds info about newly tracked data set */
-    public void addDataSet(ExternalData dataSet)
+    public void addDataSet(AbstractExternalData dataSet)
     {
         dataSets.add(dataSet);
     }
@@ -119,7 +119,7 @@ public class EntityTrackingEmailData
         } else
         {
             sb.append(getDataSets().size() + " new data set(s) tracked: ");
-            for (ExternalData dataSet : getDataSets())
+            for (AbstractExternalData dataSet : getDataSets())
             {
                 sb.append(dataSet.getIdentifier() + ", ");
             }
diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailDataManager.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailDataManager.java
index 3254a61ccba104f88f2424f3cf886ee099b62e9e..2cca9c040d3987dd3f17d938a08ae9712b625043 100644
--- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailDataManager.java
+++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailDataManager.java
@@ -24,7 +24,7 @@ import java.util.Map;
 import java.util.Set;
 
 import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
@@ -97,7 +97,7 @@ class EntityTrackingEmailDataManager
     private static void groupDataSetSamples(Map<String, EntityTrackingEmailData> result,
             TrackedEntities trackedEntities)
     {
-        for (ExternalData dataSet : trackedEntities.getDataSets())
+        for (AbstractExternalData dataSet : trackedEntities.getDataSets())
         {
             for (String recipient : getDataSetTrackingRecipients(dataSet))
             {
@@ -181,7 +181,7 @@ class EntityTrackingEmailDataManager
      * Returns a set of emails of recipients that should get a tracking information about given
      * <var>dataSet</var>.
      */
-    private static Set<String> getDataSetTrackingRecipients(ExternalData dataSet)
+    private static Set<String> getDataSetTrackingRecipients(AbstractExternalData dataSet)
     {
         // Recipients are taken from properties of sequencing sample
         // that is a parent of a flow lane sample connected directly with the data set.
diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java
index faaf08d72f4dbb3c3448a952c9c91ab13928a765..e944be35a9e8fe490686bcce455d6bdc6518491b 100644
--- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java
+++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/email/EntityTrackingEmailGenerator.java
@@ -32,7 +32,7 @@ import ch.ethz.bsse.cisd.dsu.tracking.dto.TrackedEntities;
 import ch.systemsx.cisd.common.properties.PropertyUtils;
 import ch.systemsx.cisd.common.shared.basic.string.StringUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.lang.StringEscapeUtils;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
@@ -219,7 +219,7 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat
             appendProperties(sb, sample.getProperties());
         }
 
-        private static void appendDataSetsData(StringBuilder sb, List<ExternalData> dataSets)
+        private static void appendDataSetsData(StringBuilder sb, List<AbstractExternalData> dataSets)
         {
             if (dataSets.isEmpty())
             {
@@ -231,13 +231,13 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat
             appendln(sb, SUBSECTION_SEPARATOR_LINE);
             
             // Using a TreeMap, so the keys are sorted
-            TreeMap<String, List<ExternalData>> sampleMap = new TreeMap<String, List<ExternalData>>();
-            List <ExternalData> dsList = new ArrayList<ExternalData>();
+            TreeMap<String, List<AbstractExternalData>> sampleMap = new TreeMap<String, List<AbstractExternalData>>();
+            List <AbstractExternalData> dsList = new ArrayList<AbstractExternalData>();
             
             // we just loop over the data sets and write the connected samples as keys
             // and the data sets as values in a map, so that we can group together as 
             // data sets per lane
-            for (ExternalData dataSet : dataSets)
+            for (AbstractExternalData dataSet : dataSets)
             {
                 Sample s = dataSet.getSample();
                 if (sampleMap.containsKey(s.getIdentifier())) {
@@ -245,16 +245,16 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat
                 }
                 dsList.add(dataSet);
                 sampleMap.put(s.getIdentifier(), dsList);
-                dsList = new ArrayList<ExternalData>();
+                dsList = new ArrayList<AbstractExternalData>();
             }
 
             // now we can write out this per sample
-            Iterator<Entry<String, List<ExternalData>>> it = sampleMap.entrySet().iterator();
+            Iterator<Entry<String, List<AbstractExternalData>>> it = sampleMap.entrySet().iterator();
             while (it.hasNext()) {
                 Map.Entry pairs = (Map.Entry)it.next();
                 appendln(sb, String.format("Results for %s", pairs.getKey()));
-                dsList = (List<ExternalData>) pairs.getValue();
-                for (ExternalData ed : dsList) {
+                dsList = (List<AbstractExternalData>) pairs.getValue();
+                for (AbstractExternalData ed : dsList) {
                     appendDataSetDetails(sb, ed);
                 }
                 it.remove(); // avoids a ConcurrentModificationException
@@ -262,7 +262,7 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat
             }
         }
 
-        private static void appendDataSetDetails(StringBuilder sb, ExternalData dataSet)
+        private static void appendDataSetDetails(StringBuilder sb, AbstractExternalData dataSet)
         {
             Collection<Sample> sequencingSamples;
 
@@ -300,7 +300,7 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat
             return externalSampleName;
         }
         
-        private static String getIndex1(ExternalData dataSet) {
+        private static String getIndex1(AbstractExternalData dataSet) {
             List<IEntityProperty> properties = dataSet.getProperties();
             
             String Index = null; 
@@ -315,7 +315,7 @@ public class EntityTrackingEmailGenerator implements IEntityTrackingEmailGenerat
             return null;
         }
         
-        private static String getIndex2(ExternalData dataSet) {
+        private static String getIndex2(AbstractExternalData dataSet) {
             List<IEntityProperty> properties = dataSet.getProperties();
             
             String Index = null; 
diff --git a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java
index f0bd9da82b6c7a0e7313e1e9370f0e8b3d263640..2c1fdfdcbf329e18114f0789afbe546575b6c28f 100644
--- a/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java
+++ b/deep_sequencing_unit/source/java/ch/ethz/bsse/cisd/dsu/tracking/main/TrackingBO.java
@@ -31,7 +31,7 @@ import ch.systemsx.cisd.common.mail.From;
 import ch.systemsx.cisd.common.mail.IMailClient;
 import ch.systemsx.cisd.openbis.generic.shared.ITrackingServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingSampleCriteria;
@@ -175,7 +175,7 @@ public class TrackingBO
         TrackingDataSetCriteria dataSetCriteria =
                 new TrackingDataSetCriteria(FLOW_LANE_SAMPLE_TYPE, trackingState
                         .getLastSeenDatasetId());
-        List<ExternalData> dataSets =
+        List<AbstractExternalData> dataSets =
                 trackingServer.listDataSets(session.getSessionToken(), dataSetCriteria);
 
         return new TrackedEntities(sequencingSamplesToBeProcessed,
diff --git a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAOTest.java b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAOTest.java
index bdf900332b366b557583c8d4e38fed3cbb85d2f9..a5d7d09006bb40786ae6bbd913ef0c12da75781f 100644
--- a/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAOTest.java
+++ b/deep_sequencing_unit/sourceTest/java/ch/ethz/bsse/cisd/dsu/tracking/main/FileBasedTrackingDAOTest.java
@@ -32,7 +32,7 @@ import ch.ethz.bsse.cisd.dsu.tracking.main.TrackingBO.TrackingStateUpdateHelper;
 import ch.systemsx.cisd.base.tests.AbstractFileSystemTestCase;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
 /**
@@ -122,9 +122,9 @@ public class FileBasedTrackingDAOTest extends AbstractFileSystemTestCase
         return result;
     }
 
-    private static List<ExternalData> createDataSetsWithIds(long... ids)
+    private static List<AbstractExternalData> createDataSetsWithIds(long... ids)
     {
-        List<ExternalData> result = new ArrayList<ExternalData>();
+        List<AbstractExternalData> result = new ArrayList<AbstractExternalData>();
         for (long id : ids)
         {
             result.add(createDataSetWithId(id));
diff --git a/eu_basysbio/source/java/eu/basysbio/cisd/dss/DataColumnHeader.java b/eu_basysbio/source/java/eu/basysbio/cisd/dss/DataColumnHeader.java
index f045d82307f92fe613378dc8e56f08d9235c2462..4bded3eac2347e9da4f94c51757ce36956b0392b 100644
--- a/eu_basysbio/source/java/eu/basysbio/cisd/dss/DataColumnHeader.java
+++ b/eu_basysbio/source/java/eu/basysbio/cisd/dss/DataColumnHeader.java
@@ -24,7 +24,7 @@ import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 
 public final class DataColumnHeader
@@ -34,7 +34,7 @@ public final class DataColumnHeader
         private final Map<String, String> propertiesMap;
         private final String dataSetCode;
 
-        PropertyManager(ExternalData dataSet)
+        PropertyManager(AbstractExternalData dataSet)
         {
             dataSetCode = dataSet.getCode();
             List<IEntityProperty> properties = dataSet.getProperties();
@@ -90,7 +90,7 @@ public final class DataColumnHeader
     private final String normalizedHeader;
     private final String header;
     
-    DataColumnHeader(DataColumnHeader header, ExternalData dataSet)
+    DataColumnHeader(DataColumnHeader header, AbstractExternalData dataSet)
     {
         PropertyManager propertyManager = new PropertyManager(dataSet);
         experimentCode = header.getExperimentCode();
diff --git a/eu_basysbio/source/java/eu/basysbio/cisd/dss/PostRegistrationDatabaseUploadTask.java b/eu_basysbio/source/java/eu/basysbio/cisd/dss/PostRegistrationDatabaseUploadTask.java
index 9c7664af94c697bd0d09e9bf03aaf3877d63c0fd..bf377709a033827f4e754992704c31f0ebb0dc5c 100644
--- a/eu_basysbio/source/java/eu/basysbio/cisd/dss/PostRegistrationDatabaseUploadTask.java
+++ b/eu_basysbio/source/java/eu/basysbio/cisd/dss/PostRegistrationDatabaseUploadTask.java
@@ -48,7 +48,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.dss.generic.shared.utils.DssPropertyParametersUtil;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO;
@@ -170,7 +170,7 @@ public class PostRegistrationDatabaseUploadTask implements IMaintenanceTask
         String experimentCode = dataSet.getExperimentCode();
         dataSetInformation.setExperimentIdentifier(new ExperimentIdentifier(databaseInstanceCode,
                 groupCode, projectCode, experimentCode));
-        ExternalData fullDataSet = service.tryGetDataSet(dataSetCode);
+        AbstractExternalData fullDataSet = service.tryGetDataSet(dataSetCode);
         List<IEntityProperty> properties = fullDataSet.getProperties();
         List<NewProperty> dataSetProperties = new ArrayList<NewProperty>();
         for (IEntityProperty property : properties)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
index f36bb6220a625f8a4be4bd4fac8c6dae523d2cfc..68421cdc3e6b1e5d06ed9bfd2c4dca3b6cdcb805 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
@@ -72,7 +72,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityValidationEvaluationInfo;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Grantee;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomColumn;
@@ -375,7 +375,7 @@ public interface ICommonClientService extends IClientService
      * Like {@link #prepareExportSamples(TableExportCriteria)}, but for data set search hits.
      */
     public String prepareExportDataSetSearchHits(
-            TableExportCriteria<TableModelRowWithObject<ExternalData>> exportCriteria)
+            TableExportCriteria<TableModelRowWithObject<AbstractExternalData>> exportCriteria)
             throws UserFailureException;
 
     /**
@@ -576,39 +576,39 @@ public interface ICommonClientService extends IClientService
     public void removeResultSet(final String resultSetKey) throws UserFailureException;
 
     /**
-     * For given <var>sampleId</var> returns corresponding list of {@link ExternalData}.
+     * For given <var>sampleId</var> returns corresponding list of {@link AbstractExternalData}.
      */
-    public TypedTableResultSet<ExternalData> listSampleDataSets(final TechId sampleId,
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria,
+    public TypedTableResultSet<AbstractExternalData> listSampleDataSets(final TechId sampleId,
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> criteria,
             final boolean showOnlyDirectlyConnected) throws UserFailureException;
 
     /**
-     * For given <var>experimentId</var> returns corresponding list of {@link ExternalData}.
+     * For given <var>experimentId</var> returns corresponding list of {@link AbstractExternalData}.
      */
-    public TypedTableResultSet<ExternalData> listExperimentDataSets(final TechId experimentId,
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria,
+    public TypedTableResultSet<AbstractExternalData> listExperimentDataSets(final TechId experimentId,
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> criteria,
             boolean onlyDirectlyConnected) throws UserFailureException;
 
     /**
-     * For given <var>metaprojectId</var> returns corresponding list of {@link ExternalData}.
+     * For given <var>metaprojectId</var> returns corresponding list of {@link AbstractExternalData}.
      */
-    public TypedTableResultSet<ExternalData> listMetaprojectDataSets(final TechId metaprojectId,
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria)
+    public TypedTableResultSet<AbstractExternalData> listMetaprojectDataSets(final TechId metaprojectId,
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> criteria)
             throws UserFailureException;
 
     /**
-     * For given <var>metaprojectId</var> returns corresponding list of {@link ExternalData}.
+     * For given <var>metaprojectId</var> returns corresponding list of {@link AbstractExternalData}.
      */
-    public List<ExternalData> listMetaprojectDataSets(final Long metaprojectId)
+    public List<AbstractExternalData> listMetaprojectDataSets(final Long metaprojectId)
             throws UserFailureException;
 
     /**
      * For given <var>datasetId</var> in given relationship <var>role</var> returns corresponding
-     * list of {@link ExternalData}.
+     * list of {@link AbstractExternalData}.
      */
-    public TypedTableResultSet<ExternalData> listDataSetRelationships(TechId datasetId,
+    public TypedTableResultSet<AbstractExternalData> listDataSetRelationships(TechId datasetId,
             DataSetRelationshipRole role,
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria)
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> criteria)
             throws UserFailureException;
 
     /**
@@ -713,18 +713,18 @@ public interface ICommonClientService extends IClientService
             throws UserFailureException;
 
     /**
-     * Returns {@link ExternalData} fulfilling given {@link DetailedSearchCriteria}.
+     * Returns {@link AbstractExternalData} fulfilling given {@link DetailedSearchCriteria}.
      */
-    public TypedTableResultSet<ExternalData> searchForDataSets(DetailedSearchCriteria criteria,
-            final IResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig)
+    public TypedTableResultSet<AbstractExternalData> searchForDataSets(DetailedSearchCriteria criteria,
+            final IResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> resultSetConfig)
             throws UserFailureException;
 
     /**
-     * Returns {@link ExternalData} fulfilling given {@link RelatedDataSetCriteria}.
+     * Returns {@link AbstractExternalData} fulfilling given {@link RelatedDataSetCriteria}.
      */
-    public TypedTableResultSet<ExternalData> searchForDataSets(
+    public TypedTableResultSet<AbstractExternalData> searchForDataSets(
             RelatedDataSetCriteria<? extends IEntityInformationHolder> criteria,
-            final IResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig)
+            final IResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> resultSetConfig)
             throws UserFailureException;
 
     /**
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
index ad07130e9922648df67d5977cbd74310298f403a..68a63d53cc503f446fa699bf28b052b3a2feb733 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
@@ -74,7 +74,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityValidationEvaluationInfo;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Grantee;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomColumn;
@@ -325,7 +325,7 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
      * @see ICommonClientService#prepareExportDataSetSearchHits(TableExportCriteria)
      */
     public void prepareExportDataSetSearchHits(
-            TableExportCriteria<TableModelRowWithObject<ExternalData>> exportCriteria,
+            TableExportCriteria<TableModelRowWithObject<AbstractExternalData>> exportCriteria,
             AsyncCallback<String> callback);
 
     /** @see ICommonClientService#listPropertyTypes(boolean) */
@@ -485,38 +485,38 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
      * @see ICommonClientService#listSampleDataSets(TechId, DefaultResultSetConfig, boolean)
      */
     public void listSampleDataSets(TechId sampleId,
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria,
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> criteria,
             boolean showOnlyDirectlyConnected,
-            AsyncCallback<TypedTableResultSet<ExternalData>> asyncCallback);
+            AsyncCallback<TypedTableResultSet<AbstractExternalData>> asyncCallback);
 
     /**
      * @see ICommonClientService#listExperimentDataSets(TechId, DefaultResultSetConfig, boolean)
      */
     public void listExperimentDataSets(TechId experimentId,
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria,
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> criteria,
             boolean onlyDirectlyConnected,
-            AsyncCallback<TypedTableResultSet<ExternalData>> asyncCallback);
+            AsyncCallback<TypedTableResultSet<AbstractExternalData>> asyncCallback);
 
     /**
      * @see ICommonClientService#listMetaprojectDataSets(TechId, DefaultResultSetConfig)
      */
     public void listMetaprojectDataSets(TechId metaprojectId,
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria,
-            AsyncCallback<TypedTableResultSet<ExternalData>> asyncCallback);
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> criteria,
+            AsyncCallback<TypedTableResultSet<AbstractExternalData>> asyncCallback);
 
     /**
      * @see ICommonClientService#listMetaprojectDataSets(Long)
      */
     public void listMetaprojectDataSets(Long metaprojectId,
-            AsyncCallback<List<ExternalData>> asyncCallback);
+            AsyncCallback<List<AbstractExternalData>> asyncCallback);
 
     /**
      * @see ICommonClientService#listDataSetRelationships(TechId, DataSetRelationshipRole,
      *      DefaultResultSetConfig)
      */
     public void listDataSetRelationships(TechId datasetId, DataSetRelationshipRole role,
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
-            AsyncCallback<TypedTableResultSet<ExternalData>> callback);
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> resultSetConfig,
+            AsyncCallback<TypedTableResultSet<AbstractExternalData>> callback);
 
     /**
      * @see ICommonClientService#listSearchableEntities()
@@ -599,16 +599,16 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
      * @see ICommonClientService#searchForDataSets(DetailedSearchCriteria, IResultSetConfig)
      */
     public void searchForDataSets(DetailedSearchCriteria criteria,
-            final IResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
-            final AsyncCallback<TypedTableResultSet<ExternalData>> callback);
+            final IResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> resultSetConfig,
+            final AsyncCallback<TypedTableResultSet<AbstractExternalData>> callback);
 
     /**
      * @see ICommonClientService#searchForDataSets(RelatedDataSetCriteria, IResultSetConfig)
      */
     public void searchForDataSets(
             RelatedDataSetCriteria<? extends IEntityInformationHolder> criteria,
-            final IResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
-            final AsyncCallback<TypedTableResultSet<ExternalData>> callback);
+            final IResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> resultSetConfig,
+            final AsyncCallback<TypedTableResultSet<AbstractExternalData>> callback);
 
     /**
      * @see ICommonClientService#listMaterialTypes()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/PropertyValueRenderers.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/PropertyValueRenderers.java
index 33a385eec8d09d8e4f104800ad0cd90b0d5b221c..f56a81e1b0b069d5ee29c4f7bd54f45a90883a16 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/PropertyValueRenderers.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/PropertyValueRenderers.java
@@ -50,7 +50,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
@@ -103,12 +103,12 @@ public final class PropertyValueRenderers
     }
 
     /**
-     * Creates a {@link IPropertyValueRenderer} implementation for rendering {@link ExternalData}.
+     * Creates a {@link IPropertyValueRenderer} implementation for rendering {@link AbstractExternalData}.
      */
-    public final static IPropertyValueRenderer<ExternalData> createExternalDataPropertyValueRenderer(
+    public final static IPropertyValueRenderer<AbstractExternalData> createExternalDataPropertyValueRenderer(
             final IViewContext<?> viewContext)
     {
-        return new EntityInformationHolderPropertyValueRenderer<ExternalData>(viewContext);
+        return new EntityInformationHolderPropertyValueRenderer<AbstractExternalData>(viewContext);
     }
 
     /**
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java
index 787dfdd3819ebafa758567e6602dafef0fbb742e..3e792827f9c4baf7dace6b2b7f5170c3154c1b84 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/AbstractExternalDataGrid.java
@@ -59,7 +59,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKin
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
@@ -67,7 +67,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject
 /**
  * @author Franz-Josef Elmer
  */
-public abstract class AbstractExternalDataGrid extends AbstractEntityGrid<ExternalData>
+public abstract class AbstractExternalDataGrid extends AbstractEntityGrid<AbstractExternalData>
 {
     public static final String SHOW_DETAILS_BUTTON_ID_SUFFIX = "_show-details-button";
 
@@ -87,10 +87,10 @@ public abstract class AbstractExternalDataGrid extends AbstractEntityGrid<Extern
     private void linkProject()
     {
         registerListenerAndLinkGenerator(ExternalDataGridColumnIDs.PROJECT,
-                new ICellListenerAndLinkGenerator<ExternalData>()
+                new ICellListenerAndLinkGenerator<AbstractExternalData>()
                     {
                         @Override
-                        public void handle(TableModelRowWithObject<ExternalData> rowItem,
+                        public void handle(TableModelRowWithObject<AbstractExternalData> rowItem,
                                 boolean specialKeyPressed)
                         {
                             final Project project =
@@ -101,7 +101,7 @@ public abstract class AbstractExternalDataGrid extends AbstractEntityGrid<Extern
                         }
 
                         @Override
-                        public String tryGetLink(ExternalData entity,
+                        public String tryGetLink(AbstractExternalData entity,
                                 ISerializableComparable comparableValue)
                         {
                             final Experiment exp = entity.getExperiment();
@@ -118,8 +118,8 @@ public abstract class AbstractExternalDataGrid extends AbstractEntityGrid<Extern
 
     @Override
     protected void listTableRows(
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
-            AbstractAsyncCallback<TypedTableResultSet<ExternalData>> callback)
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> resultSetConfig,
+            AbstractAsyncCallback<TypedTableResultSet<AbstractExternalData>> callback)
     {
         // TODO Auto-generated method stub
 
@@ -147,7 +147,7 @@ public abstract class AbstractExternalDataGrid extends AbstractEntityGrid<Extern
 
                             @Override
                             protected Dialog createDialog(
-                                    List<TableModelRowWithObject<ExternalData>> dataSets,
+                                    List<TableModelRowWithObject<AbstractExternalData>> dataSets,
                                     IBrowserGridActionInvoker invoker)
                             {
                                 return new DataSetListDeletionConfirmationDialog(viewContext,
@@ -165,7 +165,7 @@ public abstract class AbstractExternalDataGrid extends AbstractEntityGrid<Extern
                             {
                                 @Override
                                 protected Dialog createDialog(
-                                        List<TableModelRowWithObject<ExternalData>> dataSets,
+                                        List<TableModelRowWithObject<AbstractExternalData>> dataSets,
                                         IBrowserGridActionInvoker invoker)
                                 {
                                     return new DataSetUploadConfirmationDialog(dataSets,
@@ -227,15 +227,15 @@ public abstract class AbstractExternalDataGrid extends AbstractEntityGrid<Extern
     public final static class SelectedAndDisplayedItems
     {
         // describes all items which are displayed in the grid (including all grid pages)
-        private final TableExportCriteria<TableModelRowWithObject<ExternalData>> displayedItemsConfig;
+        private final TableExportCriteria<TableModelRowWithObject<AbstractExternalData>> displayedItemsConfig;
 
         // currently selected items
-        private final List<TableModelRowWithObject<ExternalData>> selectedItems;
+        private final List<TableModelRowWithObject<AbstractExternalData>> selectedItems;
 
         private final int displayedItemsCount;
 
-        public SelectedAndDisplayedItems(List<TableModelRowWithObject<ExternalData>> selectedItems,
-                TableExportCriteria<TableModelRowWithObject<ExternalData>> displayedItemsConfig,
+        public SelectedAndDisplayedItems(List<TableModelRowWithObject<AbstractExternalData>> selectedItems,
+                TableExportCriteria<TableModelRowWithObject<AbstractExternalData>> displayedItemsConfig,
                 int displayedItemsCount)
         {
             this.displayedItemsConfig = displayedItemsConfig;
@@ -243,7 +243,7 @@ public abstract class AbstractExternalDataGrid extends AbstractEntityGrid<Extern
             this.displayedItemsCount = displayedItemsCount;
         }
 
-        public TableExportCriteria<TableModelRowWithObject<ExternalData>> getDisplayedItemsConfig()
+        public TableExportCriteria<TableModelRowWithObject<AbstractExternalData>> getDisplayedItemsConfig()
         {
             return displayedItemsConfig;
         }
@@ -253,15 +253,15 @@ public abstract class AbstractExternalDataGrid extends AbstractEntityGrid<Extern
             return displayedItemsCount;
         }
 
-        public List<TableModelRowWithObject<ExternalData>> getSelectedItems()
+        public List<TableModelRowWithObject<AbstractExternalData>> getSelectedItems()
         {
             return selectedItems;
         }
 
-        public List<ExternalData> getSelectedDataSets()
+        public List<AbstractExternalData> getSelectedDataSets()
         {
-            List<ExternalData> dataSets = new ArrayList<ExternalData>();
-            for (TableModelRowWithObject<ExternalData> item : selectedItems)
+            List<AbstractExternalData> dataSets = new ArrayList<AbstractExternalData>();
+            for (TableModelRowWithObject<AbstractExternalData> item : selectedItems)
             {
                 dataSets.add(item.getObjectOrNull());
             }
@@ -272,9 +272,9 @@ public abstract class AbstractExternalDataGrid extends AbstractEntityGrid<Extern
         {
             if (selected)
             {
-                List<TableModelRowWithObject<ExternalData>> items = getSelectedItems();
+                List<TableModelRowWithObject<AbstractExternalData>> items = getSelectedItems();
                 List<String> datasetCodes = new ArrayList<String>();
-                for (TableModelRowWithObject<ExternalData> row : items)
+                for (TableModelRowWithObject<AbstractExternalData> row : items)
                 {
                     datasetCodes.add(row.getObjectOrNull().getCode());
                 }
@@ -301,9 +301,9 @@ public abstract class AbstractExternalDataGrid extends AbstractEntityGrid<Extern
     }
 
     @Override
-    protected ColumnDefsAndConfigs<TableModelRowWithObject<ExternalData>> createColumnsDefinition()
+    protected ColumnDefsAndConfigs<TableModelRowWithObject<AbstractExternalData>> createColumnsDefinition()
     {
-        ColumnDefsAndConfigs<TableModelRowWithObject<ExternalData>> schema =
+        ColumnDefsAndConfigs<TableModelRowWithObject<AbstractExternalData>> schema =
                 super.createColumnsDefinition();
         schema.setGridCellRendererFor(ExternalDataGridColumnIDs.REGISTRATOR,
                 PersonRenderer.REGISTRATOR_RENDERER);
@@ -327,11 +327,11 @@ public abstract class AbstractExternalDataGrid extends AbstractEntityGrid<Extern
                         int rowIndex, int colIndex, ListStore<BaseEntityModel<?>> store,
                         Grid<BaseEntityModel<?>> grid)
                 {
-                    ExternalData dataset = (ExternalData) model.getBaseObject();
+                    AbstractExternalData dataset = (AbstractExternalData) model.getBaseObject();
                     return tryCreateOverviewLink(dataset);
                 }
 
-                private String tryCreateOverviewLink(ExternalData dataset)
+                private String tryCreateOverviewLink(AbstractExternalData dataset)
                 {
                     final String permId = dataset.getPermId();
                     final String dssBaseURL = dataset.getDataStore().getHostUrl();
@@ -372,7 +372,7 @@ public abstract class AbstractExternalDataGrid extends AbstractEntityGrid<Extern
 
     @Override
     protected void prepareExportEntities(
-            TableExportCriteria<TableModelRowWithObject<ExternalData>> exportCriteria,
+            TableExportCriteria<TableModelRowWithObject<AbstractExternalData>> exportCriteria,
             AbstractAsyncCallback<String> callback)
     {
         viewContext.getService().prepareExportDataSetSearchHits(exportCriteria, callback);
@@ -385,7 +385,7 @@ public abstract class AbstractExternalDataGrid extends AbstractEntityGrid<Extern
     }
 
     @Override
-    protected void showEntityViewer(TableModelRowWithObject<ExternalData> dataSet,
+    protected void showEntityViewer(TableModelRowWithObject<AbstractExternalData> dataSet,
             boolean editMode, boolean inBackground)
     {
         showEntityInformationHolderViewer(dataSet.getObjectOrNull(), editMode, inBackground);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ComputationData.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ComputationData.java
index 6f8037df5285b08b79d54dd8ecdd30cda2a709a3..d95df937a608ed41fb3dce79031f0846a2e4b880 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ComputationData.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ComputationData.java
@@ -22,7 +22,7 @@ import java.util.List;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.AbstractExternalDataGrid.SelectedAndDisplayedItems;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.SelectedOrAllDataSetsRadioProvider.ISelectedDataSetsProvider;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 class ComputationData implements ISelectedDataSetsProvider
@@ -54,12 +54,12 @@ class ComputationData implements ISelectedDataSetsProvider
     }
 
     @Override
-    public List<ExternalData> getSelectedDataSets()
+    public List<AbstractExternalData> getSelectedDataSets()
     {
-        List<TableModelRowWithObject<ExternalData>> selectedItems =
+        List<TableModelRowWithObject<AbstractExternalData>> selectedItems =
                 selectedAndDisplayedItems.getSelectedItems();
-        List<ExternalData> dataSets = new ArrayList<ExternalData>();
-        for (TableModelRowWithObject<ExternalData> item : selectedItems)
+        List<AbstractExternalData> dataSets = new ArrayList<AbstractExternalData>();
+        for (TableModelRowWithObject<AbstractExternalData> item : selectedItems)
         {
             dataSets.add(item.getObjectOrNull());
         }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetArchivingMenu.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetArchivingMenu.java
index 56544022b1025397924db345b57ba3dd6fd95c45..0fbe8383659c303be4f058cd4d631730db500e1a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetArchivingMenu.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetArchivingMenu.java
@@ -46,7 +46,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelecte
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ArchivingServiceKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * 'Archiving' menu for Data Sets.
@@ -172,9 +172,9 @@ public class DataSetArchivingMenu extends TextToolItem
         }
 
         @Override
-        public List<ExternalData> getSelectedDataSets()
+        public List<AbstractExternalData> getSelectedDataSets()
         {
-            List<ExternalData> selectedDataSets = selectedAndDisplayedItems.getSelectedDataSets();
+            List<AbstractExternalData> selectedDataSets = selectedAndDisplayedItems.getSelectedDataSets();
             return selectedDataSets;
         }
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java
index ae6b973347f2219485accc33978e1eac950a1aaf..129728dceafab5365dbb7f026d8f0cbf34f83ce0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetListDeletionConfirmationDialog.java
@@ -31,16 +31,16 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.Widge
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedDatasetCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 // TODO extend AbstractDataListTrashDeletionConfirmationDialog when trash is working properly
 public final class DataSetListDeletionConfirmationDialog extends
-        AbstractDataListDeletionConfirmationDialog<TableModelRowWithObject<ExternalData>>
+        AbstractDataListDeletionConfirmationDialog<TableModelRowWithObject<AbstractExternalData>>
 {
     private final SelectedAndDisplayedItems selectedAndDisplayedItemsOrNull;
 
-    private final TableModelRowWithObject<ExternalData> singleData;
+    private final TableModelRowWithObject<AbstractExternalData> singleData;
 
     private DeletionForceOptions forceOptions;
 
@@ -56,7 +56,7 @@ public final class DataSetListDeletionConfirmationDialog extends
 
     public DataSetListDeletionConfirmationDialog(
             IViewContext<ICommonClientServiceAsync> viewContext,
-            AsyncCallback<Void> deletionCallback, TableModelRowWithObject<ExternalData> data)
+            AsyncCallback<Void> deletionCallback, TableModelRowWithObject<AbstractExternalData> data)
     {
         super(viewContext, Collections.singletonList(data), deletionCallback);
         this.singleData = data;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetSearchHitGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetSearchHitGrid.java
index b72b0934d8d25ea88c787b42e9d26728a90c83e1..b1af5d2d4962e46acd978dc5ccce24ab4b5bbb9c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetSearchHitGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetSearchHitGrid.java
@@ -48,7 +48,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSe
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
@@ -73,14 +73,14 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
         return create(viewContext, null, false);
     }
 
-    public static DisposableEntityChooser<TableModelRowWithObject<ExternalData>> createWithInitialSearchCriteria(
+    public static DisposableEntityChooser<TableModelRowWithObject<AbstractExternalData>> createWithInitialSearchCriteria(
             final IViewContext<ICommonClientServiceAsync> viewContext,
             DetailedSearchCriteria searchCriteria, boolean forChooser)
     {
         return create(viewContext, searchCriteria, forChooser);
     }
 
-    private static DisposableEntityChooser<TableModelRowWithObject<ExternalData>> create(
+    private static DisposableEntityChooser<TableModelRowWithObject<AbstractExternalData>> create(
             final IViewContext<ICommonClientServiceAsync> viewContext,
             DetailedSearchCriteria searchCriteriaOrNull, boolean forChooser)
     {
@@ -174,7 +174,7 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
     }
 
     @Override
-    protected ICellListenerAndLinkGenerator<ExternalData> tryGetCellListenerAndLinkGenerator(
+    protected ICellListenerAndLinkGenerator<AbstractExternalData> tryGetCellListenerAndLinkGenerator(
             String columnId)
     {
         if (forChooser)
@@ -185,7 +185,7 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
     }
 
     @Override
-    protected boolean isEditable(BaseEntityModel<TableModelRowWithObject<ExternalData>> model,
+    protected boolean isEditable(BaseEntityModel<TableModelRowWithObject<AbstractExternalData>> model,
             String columnID)
     {
         return forChooser ? false : super.isEditable(model, columnID);
@@ -193,7 +193,7 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
 
     @Override
     protected void showNonEditableTableCellMessage(
-            BaseEntityModel<TableModelRowWithObject<ExternalData>> model, String columnID)
+            BaseEntityModel<TableModelRowWithObject<AbstractExternalData>> model, String columnID)
     {
         if (forChooser)
         {
@@ -204,10 +204,10 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
 
     @Override
     protected void listTableRows(
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
-            AbstractAsyncCallback<TypedTableResultSet<ExternalData>> callback)
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> resultSetConfig,
+            AbstractAsyncCallback<TypedTableResultSet<AbstractExternalData>> callback)
     {
-        callback.addOnSuccessAction(new ShowResultSetCutInfo<TypedTableResultSet<ExternalData>>(
+        callback.addOnSuccessAction(new ShowResultSetCutInfo<TypedTableResultSet<AbstractExternalData>>(
                 viewContext));
         viewContext.getService().searchForDataSets(chosenSearchCriteria, resultSetConfig, callback);
     }
@@ -230,7 +230,7 @@ public class DataSetSearchHitGrid extends AbstractExternalDataGrid implements
     }
 
     /** @return this grid as a disposable component with a specified toolbar at the top. */
-    private DisposableEntityChooser<TableModelRowWithObject<ExternalData>> asDisposableWithToolbar(
+    private DisposableEntityChooser<TableModelRowWithObject<AbstractExternalData>> asDisposableWithToolbar(
             final LayoutContainerWithDisposableComponent containerHolder,
             final IDisposableComponent toolbar)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadConfirmationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadConfirmationDialog.java
index 65183c3aaf106d42772b7a7851ebe14a5c9eff52..af6720b29cd2a78ac8bd6c17b37b5ce5d322a3b3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadConfirmationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetUploadConfirmationDialog.java
@@ -37,14 +37,14 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.Widge
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DataSetUploadParameters;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DisplayedOrSelectedDatasetCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.BasicConstant;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
  * @author Franz-Josef Elmer
  */
 public final class DataSetUploadConfirmationDialog extends
-        AbstractDataConfirmationDialog<List<TableModelRowWithObject<ExternalData>>>
+        AbstractDataConfirmationDialog<List<TableModelRowWithObject<AbstractExternalData>>>
 {
     private static final int FIELD_WIDTH_IN_UPLOAD_DIALOG = 200;
 
@@ -68,7 +68,7 @@ public final class DataSetUploadConfirmationDialog extends
 
     private Radio uploadSelectedRadio;
 
-    public DataSetUploadConfirmationDialog(List<TableModelRowWithObject<ExternalData>> dataSets,
+    public DataSetUploadConfirmationDialog(List<TableModelRowWithObject<AbstractExternalData>> dataSets,
             IDelegatedActionWithResult<SelectedAndDisplayedItems> selectedAndDisplayedItemsAction,
             int displayedItemsCount, IViewContext<?> viewContext)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetsArea.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetsArea.java
index c7ab0d3ed2e0f919f2226b4e3263e28f74e3b59c..a30368e3cf62b7cf734a5660c2235619fe0a9bd3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetsArea.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DataSetsArea.java
@@ -19,14 +19,14 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.CodesArea;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * Abstract {@link CodesArea} extension for data sets introducing methods with convenient names.
  * 
  * @author Piotr Buczek
  */
-public abstract class DataSetsArea extends CodesArea<ExternalData>
+public abstract class DataSetsArea extends CodesArea<AbstractExternalData>
 {
     public DataSetsArea(String emptyTextMsg)
     {
@@ -43,7 +43,7 @@ public abstract class DataSetsArea extends CodesArea<ExternalData>
         return tryGetModifiedItemList();
     }
 
-    public final void setDataSets(List<ExternalData> dataSets)
+    public final void setDataSets(List<AbstractExternalData> dataSets)
     {
         setCodeProviders(dataSets);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DatastoreServiceDescriptionModel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DatastoreServiceDescriptionModel.java
index 16e60697590ef70a11553de7d892bf71b69b55f8..afc58c070527edcac6aaab2e748fa1cbb9dbccd1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DatastoreServiceDescriptionModel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/DatastoreServiceDescriptionModel.java
@@ -8,7 +8,7 @@ import com.extjs.gxt.ui.client.data.ModelData;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.ModelDataPropertyNames;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.SimplifiedBaseModelData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * {@link ModelData} for {@link DatastoreServiceDescription}.
@@ -40,7 +40,7 @@ public class DatastoreServiceDescriptionModel extends SimplifiedBaseModelData
      *            converted
      */
     public final static List<DatastoreServiceDescriptionModel> convert(
-            final List<DatastoreServiceDescription> services, final ExternalData datasetOrNull)
+            final List<DatastoreServiceDescription> services, final AbstractExternalData datasetOrNull)
     {
         final List<DatastoreServiceDescriptionModel> result =
                 new ArrayList<DatastoreServiceDescriptionModel>();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/PerformComputationDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/PerformComputationDialog.java
index 58eaef0ac4bc3f31c7bf79702ec419182002e0c0..3d865caa22abf46f3437f1db20bc9b0f2ea0627e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/PerformComputationDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/PerformComputationDialog.java
@@ -40,7 +40,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.Dialo
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 class PerformComputationDialog extends AbstractDataConfirmationDialog<ComputationData>
 {
@@ -96,7 +96,7 @@ class PerformComputationDialog extends AbstractDataConfirmationDialog<Computatio
     private Set<DataSetType> getSelectedDataSetTypes()
     {
         Set<DataSetType> result = new TreeSet<DataSetType>();
-        for (ExternalData dataSet : data.getSelectedDataSets())
+        for (AbstractExternalData dataSet : data.getSelectedDataSets())
         {
             result.add(dataSet.getDataSetType());
         }
@@ -236,14 +236,14 @@ class PerformComputationDialog extends AbstractDataConfirmationDialog<Computatio
 
     // if all datasets come from one datastore, that datastore is returned. Otherwise returns
     // null.
-    private static DataStore tryGetSingleDatastore(List<ExternalData> datasets)
+    private static DataStore tryGetSingleDatastore(List<AbstractExternalData> datasets)
     {
         if (datasets.size() == 0)
         {
             return null;
         }
         DataStore store = datasets.get(0).getDataStore();
-        for (ExternalData dataset : datasets)
+        for (AbstractExternalData dataset : datasets)
         {
             if (store.equals(dataset.getDataStore()) == false)
             {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/RelatedDataSetGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/RelatedDataSetGrid.java
index e02449cb59d32673abd7fff3ae6e4b309767226e..b9cd9d7781df210146e273940b3edfc3ccbfb7f1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/RelatedDataSetGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/RelatedDataSetGrid.java
@@ -27,7 +27,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetCo
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.RelatedDataSetCriteria;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
@@ -62,8 +62,8 @@ public class RelatedDataSetGrid extends AbstractExternalDataGrid
 
     @Override
     protected void listTableRows(
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
-            AbstractAsyncCallback<TypedTableResultSet<ExternalData>> callback)
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> resultSetConfig,
+            AbstractAsyncCallback<TypedTableResultSet<AbstractExternalData>> callback)
     {
         viewContext.getService().searchForDataSets(relatedCriteria, resultSetConfig, callback);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/SelectedOrAllDataSetsRadioProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/SelectedOrAllDataSetsRadioProvider.java
index f1114edade6965cf5f3b58bbf00a6baf88d8f69b..64ed718f73eca2c75578d98741b198b6ef001a56 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/SelectedOrAllDataSetsRadioProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/SelectedOrAllDataSetsRadioProvider.java
@@ -22,7 +22,7 @@ import com.extjs.gxt.ui.client.Style.Orientation;
 import com.extjs.gxt.ui.client.widget.form.Radio;
 import com.extjs.gxt.ui.client.widget.form.RadioGroup;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * @author Piotr Buczek
@@ -76,7 +76,7 @@ public class SelectedOrAllDataSetsRadioProvider
 
     public interface ISelectedDataSetsProvider
     {
-        public List<ExternalData> getSelectedDataSets();
+        public List<AbstractExternalData> getSelectedDataSets();
     }
 
 }
\ No newline at end of file
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/DataSetChooserField.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/DataSetChooserField.java
index 8b03e622e5d0281ede40fa276b36f72b25791645..36f74b8fb5c4249466a31c311003b5c821d861d7 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/DataSetChooserField.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/field/DataSetChooserField.java
@@ -31,7 +31,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriterion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchField;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SearchCriteriaConnection;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
@@ -40,7 +40,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject
  * 
  * @author Izabela Adamczyk
  */
-public class DataSetChooserField extends ChosenEntitySetter<ExternalData>
+public class DataSetChooserField extends ChosenEntitySetter<AbstractExternalData>
 {
     public static DataSetChooserField create(final String labelField, final boolean mandatory,
             final IViewContext<ICommonClientServiceAsync> viewContext)
@@ -60,7 +60,7 @@ public class DataSetChooserField extends ChosenEntitySetter<ExternalData>
     }
 
     private static void browse(final IViewContext<ICommonClientServiceAsync> viewContext,
-            final ChosenEntitySetter<ExternalData> field)
+            final ChosenEntitySetter<AbstractExternalData> field)
     {
         ArrayList<DetailedSearchCriterion> criterionList = new ArrayList<DetailedSearchCriterion>();
         DetailedSearchCriteria searchCriteria = new DetailedSearchCriteria();
@@ -71,15 +71,15 @@ public class DataSetChooserField extends ChosenEntitySetter<ExternalData>
                                 .getAttributeFieldKind(EntityKind.DATA_SET, "CODE")), "*");
         criterionList.add(searchCriterion);
         searchCriteria.setCriteria(criterionList);
-        DisposableEntityChooser<TableModelRowWithObject<ExternalData>> browser =
+        DisposableEntityChooser<TableModelRowWithObject<AbstractExternalData>> browser =
                 DataSetSearchHitGrid.createWithInitialSearchCriteria(viewContext, searchCriteria,
                         true);
-        new EntityChooserDialog<TableModelRowWithObject<ExternalData>>(browser,
-                new IChosenEntitiesSetter<TableModelRowWithObject<ExternalData>>()
+        new EntityChooserDialog<TableModelRowWithObject<AbstractExternalData>>(browser,
+                new IChosenEntitiesSetter<TableModelRowWithObject<AbstractExternalData>>()
                     {
 
                         @Override
-                        public void setChosenEntities(List<TableModelRowWithObject<ExternalData>> row)
+                        public void setChosenEntities(List<TableModelRowWithObject<AbstractExternalData>> row)
                         {
                             field.setChosenEntities(TableModelRowWithObject.getObjects(row));
                         }
@@ -87,7 +87,7 @@ public class DataSetChooserField extends ChosenEntitySetter<ExternalData>
     }
 
     @Override
-    public String renderEntity(ExternalData entity)
+    public String renderEntity(AbstractExternalData entity)
     {
         return entity.getCode();
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/entity/PropertyTypesCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/entity/PropertyTypesCriteria.java
index 6fb6fb272c5806d303409b98a358ca2f3b5deeb1..dc96c9f74fe667d4e9f3585d6c9a96552ce39255 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/entity/PropertyTypesCriteria.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/grid/entity/PropertyTypesCriteria.java
@@ -3,14 +3,14 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.e
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 
 /**
  * Use this criteria class if you want to enable auto-refresh when property types change. Even when
  * there are no criteria to pre-filter the grid besides the standard paging tab controls.
  */
-public class PropertyTypesCriteria extends DefaultResultSetConfig<String, ExternalData>
+public class PropertyTypesCriteria extends DefaultResultSetConfig<String, AbstractExternalData>
 {
     private List<PropertyType> propertyTypesOrNull;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/entity/MetaprojectDataSetsGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/entity/MetaprojectDataSetsGrid.java
index 64cffc481adaa8c916ec0c26eedec8b795c55d4f..2973aa53efe968085ee03a55561d58de4f62588c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/entity/MetaprojectDataSetsGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/entity/MetaprojectDataSetsGrid.java
@@ -24,7 +24,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.data.Ab
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
@@ -66,8 +66,8 @@ public class MetaprojectDataSetsGrid extends AbstractExternalDataGrid
 
     @Override
     protected void listTableRows(
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
-            AbstractAsyncCallback<TypedTableResultSet<ExternalData>> callback)
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> resultSetConfig,
+            AbstractAsyncCallback<TypedTableResultSet<AbstractExternalData>> callback)
     {
         viewContext.getService().listMetaprojectDataSets(metaprojectId, resultSetConfig, callback);
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/MetaprojectTree.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/MetaprojectTree.java
index 6ba83ff86f7c0163819908cbc69ef79a5e7ba318..6f1b05e9a55c2ea7a6bf6da293b1472f87a7dcfd 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/MetaprojectTree.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/metaproject/tree/MetaprojectTree.java
@@ -66,7 +66,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKin
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MetaprojectAssignmentsCount;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -309,7 +309,7 @@ public class MetaprojectTree extends TreeGrid<MetaprojectTreeItemData> implement
             {
                 viewContext.getCommonService().listMetaprojectDataSets(
                         parent.getMetaprojectId(),
-                        new MetaprojectLoadEntitiesCallback<ExternalData>(viewContext, parent,
+                        new MetaprojectLoadEntitiesCallback<AbstractExternalData>(viewContext, parent,
                                 callback));
             } else if (EntityKind.MATERIAL.equals(parent.getEntityKind()))
             {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/DataSetUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/DataSetUtils.java
index 0e99f2fb0d824abf5868e6fca282259c8d2ff40e..fa9381e424db32b72a12b5fe4e28a16234749a15 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/DataSetUtils.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/util/DataSetUtils.java
@@ -20,7 +20,7 @@ import ch.systemsx.cisd.common.shared.basic.string.StringUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericViewModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.GenericSharedConstants;
 import ch.systemsx.cisd.openbis.generic.shared.basic.URLMethodWithParameters;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * @author Franz-Josef Elmer
@@ -35,7 +35,7 @@ public class DataSetUtils
 
     private static final String MODE = "mode";
 
-    public static String createDataViewUrl(ExternalData dataSet, GenericViewModel model,
+    public static String createDataViewUrl(AbstractExternalData dataSet, GenericViewModel model,
             String modeOrNull, boolean autoResolve)
     {
         URLMethodWithParameters methodWithParameters =
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DisplayedOrSelectedDatasetCriteria.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DisplayedOrSelectedDatasetCriteria.java
index 40cae294b6dfe1ee31ca85eaceb967ed5c521c63..614af5e1d6cb513b16b8cc3dec3e9ccbe39bacc4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DisplayedOrSelectedDatasetCriteria.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/DisplayedOrSelectedDatasetCriteria.java
@@ -20,7 +20,7 @@ import java.util.List;
 
 import com.google.gwt.user.client.rpc.IsSerializable;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
@@ -32,12 +32,12 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject
 public final class DisplayedOrSelectedDatasetCriteria implements IsSerializable
 {
 
-    private TableExportCriteria<TableModelRowWithObject<ExternalData>> displayedItemsOrNull;
+    private TableExportCriteria<TableModelRowWithObject<AbstractExternalData>> displayedItemsOrNull;
 
     private List<String> selectedDatasetCodesOrNull;
 
     public static DisplayedOrSelectedDatasetCriteria createDisplayedItems(
-            TableExportCriteria<TableModelRowWithObject<ExternalData>> displayedItems)
+            TableExportCriteria<TableModelRowWithObject<AbstractExternalData>> displayedItems)
     {
         return new DisplayedOrSelectedDatasetCriteria(displayedItems, null);
     }
@@ -48,7 +48,7 @@ public final class DisplayedOrSelectedDatasetCriteria implements IsSerializable
     }
 
     private DisplayedOrSelectedDatasetCriteria(
-            TableExportCriteria<TableModelRowWithObject<ExternalData>> displayedItemsOrNull,
+            TableExportCriteria<TableModelRowWithObject<AbstractExternalData>> displayedItemsOrNull,
             List<String> selectedDatasetCodesOrNull)
     {
         assert (displayedItemsOrNull == null) != (selectedDatasetCodesOrNull == null) : "Exactly one arg must be null and one non-null";
@@ -56,7 +56,7 @@ public final class DisplayedOrSelectedDatasetCriteria implements IsSerializable
         this.selectedDatasetCodesOrNull = selectedDatasetCodesOrNull;
     }
 
-    public TableExportCriteria<TableModelRowWithObject<ExternalData>> tryGetDisplayedItems()
+    public TableExportCriteria<TableModelRowWithObject<AbstractExternalData>> tryGetDisplayedItems()
     {
         return displayedItemsOrNull;
     }
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 1887894ccfca2b1a6ee85d0a2b3e47172190e632..2d339467030c9ae02c1e5a8f9bda16b23bf70115 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
@@ -151,7 +151,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityValidationEvaluationInfo;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Grantee;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomColumn;
@@ -587,15 +587,15 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     @Override
-    public TypedTableResultSet<ExternalData> searchForDataSets(
+    public TypedTableResultSet<AbstractExternalData> searchForDataSets(
             final DetailedSearchCriteria criteria,
-            final IResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig)
+            final IResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> resultSetConfig)
     {
         final String sessionToken = getSessionToken();
         return listEntities(new AbstractExternalDataProvider(commonServer, sessionToken)
             {
                 @Override
-                protected List<ExternalData> getDataSets()
+                protected List<AbstractExternalData> getDataSets()
                 {
                     return commonServer.searchForDataSets(sessionToken, criteria);
                 }
@@ -603,16 +603,16 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     @Override
-    public TypedTableResultSet<ExternalData> searchForDataSets(
+    public TypedTableResultSet<AbstractExternalData> searchForDataSets(
             RelatedDataSetCriteria<? extends IEntityInformationHolder> criteria,
-            final IResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig)
+            final IResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> resultSetConfig)
     {
         final String sessionToken = getSessionToken();
         final DataSetRelatedEntities entities = extractRelatedEntities(criteria);
         return listEntities(new AbstractExternalDataProvider(commonServer, sessionToken)
             {
                 @Override
-                protected List<ExternalData> getDataSets()
+                protected List<AbstractExternalData> getDataSets()
                 {
                     return commonServer.listRelatedDataSets(sessionToken, entities, false);
                 }
@@ -911,15 +911,15 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     @Override
-    public TypedTableResultSet<ExternalData> listSampleDataSets(final TechId sampleId,
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria,
+    public TypedTableResultSet<AbstractExternalData> listSampleDataSets(final TechId sampleId,
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> criteria,
             final boolean showOnlyDirectlyConnected)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         return listEntities(new AbstractExternalDataProvider(commonServer, getSessionToken())
             {
                 @Override
-                protected List<ExternalData> getDataSets()
+                protected List<AbstractExternalData> getDataSets()
                 {
                     return commonServer.listSampleExternalData(sessionToken, sampleId,
                             showOnlyDirectlyConnected);
@@ -928,15 +928,15 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     @Override
-    public TypedTableResultSet<ExternalData> listExperimentDataSets(final TechId experimentId,
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria,
+    public TypedTableResultSet<AbstractExternalData> listExperimentDataSets(final TechId experimentId,
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> criteria,
             final boolean onlyDirectlyConnected)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         return listEntities(new AbstractExternalDataProvider(commonServer, getSessionToken())
             {
                 @Override
-                protected List<ExternalData> getDataSets()
+                protected List<AbstractExternalData> getDataSets()
                 {
                     return commonServer.listExperimentExternalData(sessionToken, experimentId,
                             onlyDirectlyConnected);
@@ -945,14 +945,14 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     @Override
-    public TypedTableResultSet<ExternalData> listMetaprojectDataSets(final TechId metaprojectId,
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria)
+    public TypedTableResultSet<AbstractExternalData> listMetaprojectDataSets(final TechId metaprojectId,
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> criteria)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         return listEntities(new AbstractExternalDataProvider(commonServer, getSessionToken())
             {
                 @Override
-                protected List<ExternalData> getDataSets()
+                protected List<AbstractExternalData> getDataSets()
                 {
                     return commonServer.listMetaprojectExternalData(sessionToken,
                             new MetaprojectTechIdId(metaprojectId));
@@ -961,22 +961,22 @@ public final class CommonClientService extends AbstractClientService implements
     }
 
     @Override
-    public List<ExternalData> listMetaprojectDataSets(final Long metaprojectId)
+    public List<AbstractExternalData> listMetaprojectDataSets(final Long metaprojectId)
     {
         return commonServer.listMetaprojectExternalData(getSessionToken(), new MetaprojectTechIdId(
                 metaprojectId));
     }
 
     @Override
-    public TypedTableResultSet<ExternalData> listDataSetRelationships(final TechId datasetId,
+    public TypedTableResultSet<AbstractExternalData> listDataSetRelationships(final TechId datasetId,
             final DataSetRelationshipRole role,
-            final DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria)
+            final DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> criteria)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         return listEntities(new AbstractExternalDataProvider(commonServer, getSessionToken())
             {
                 @Override
-                protected List<ExternalData> getDataSets()
+                protected List<AbstractExternalData> getDataSets()
                 {
                     return commonServer.listDataSetRelationships(sessionToken, datasetId, role);
                 }
@@ -1391,7 +1391,7 @@ public final class CommonClientService extends AbstractClientService implements
 
     @Override
     public String prepareExportDataSetSearchHits(
-            TableExportCriteria<TableModelRowWithObject<ExternalData>> exportCriteria)
+            TableExportCriteria<TableModelRowWithObject<AbstractExternalData>> exportCriteria)
             throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
     {
         return prepareExportEntities(exportCriteria);
@@ -2096,7 +2096,7 @@ public final class CommonClientService extends AbstractClientService implements
         }
 
         DataSetRelatedEntities dataSetRelatedExperiments = new DataSetRelatedEntities(experiments);
-        List<ExternalData> relatedDataSets =
+        List<AbstractExternalData> relatedDataSets =
                 commonServer.listRelatedDataSets(getSessionToken(), dataSetRelatedExperiments,
                         false);
         return Code.extractCodes(relatedDataSets);
@@ -2140,17 +2140,17 @@ public final class CommonClientService extends AbstractClientService implements
             return displayedOrSelectedDatasetCriteria.tryGetSelectedItems();
         } else
         {
-            TableExportCriteria<TableModelRowWithObject<ExternalData>> displayedItemsCriteria =
+            TableExportCriteria<TableModelRowWithObject<AbstractExternalData>> displayedItemsCriteria =
                     displayedOrSelectedDatasetCriteria.tryGetDisplayedItems();
             assert displayedItemsCriteria != null : "displayedItemsCriteria is null";
-            List<TableModelRowWithObject<ExternalData>> datasets =
+            List<TableModelRowWithObject<AbstractExternalData>> datasets =
                     fetchCachedEntities(displayedItemsCriteria).extractOriginalObjects();
             if (serviceDescriptionOrNull != null)
             {
                 datasets = filterDatasets(datasets, serviceDescriptionOrNull);
             }
             List<String> codes = new ArrayList<String>();
-            for (TableModelRowWithObject<ExternalData> row : datasets)
+            for (TableModelRowWithObject<AbstractExternalData> row : datasets)
             {
                 codes.add(row.getObjectOrNull().getCode());
             }
@@ -2160,18 +2160,18 @@ public final class CommonClientService extends AbstractClientService implements
 
     // returns datasets which have type code belonging to the specified set and belong to the same
     // dataset store as the plugin
-    private static List<TableModelRowWithObject<ExternalData>> filterDatasets(
-            List<TableModelRowWithObject<ExternalData>> datasets,
+    private static List<TableModelRowWithObject<AbstractExternalData>> filterDatasets(
+            List<TableModelRowWithObject<AbstractExternalData>> datasets,
             DatastoreServiceDescription serviceDescription)
     {
         String[] datasetTypeCodes = serviceDescription.getDatasetTypeCodes();
         Set<String> datasetTypeCodesMap = new HashSet<String>(Arrays.asList(datasetTypeCodes));
-        List<TableModelRowWithObject<ExternalData>> result =
-                new ArrayList<TableModelRowWithObject<ExternalData>>();
+        List<TableModelRowWithObject<AbstractExternalData>> result =
+                new ArrayList<TableModelRowWithObject<AbstractExternalData>>();
         String serviceDatastoreCode = serviceDescription.getDatastoreCode();
-        for (TableModelRowWithObject<ExternalData> row : datasets)
+        for (TableModelRowWithObject<AbstractExternalData> row : datasets)
         {
-            ExternalData dataset = row.getObjectOrNull();
+            AbstractExternalData dataset = row.getObjectOrNull();
             String datasetTypeCode = dataset.getDataSetType().getCode();
             if (datasetTypeCodesMap.contains(datasetTypeCode))
             {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListDataSetSearchOriginalDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListDataSetSearchOriginalDataProvider.java
index ab331afa0c951044f64157da49fbb7c0b282be6f..7d185909f6d3a93ab7b06403e7214f39a985e87d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListDataSetSearchOriginalDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListDataSetSearchOriginalDataProvider.java
@@ -5,7 +5,7 @@ import java.util.List;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IOriginalDataProvider;
 import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * A {@link IOriginalDataProvider} implementation for search data sets.
@@ -13,7 +13,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
  * @author Izbaela Adamczyk
  */
 final class ListDataSetSearchOriginalDataProvider extends
-        AbstractOriginalDataProvider<ExternalData>
+        AbstractOriginalDataProvider<AbstractExternalData>
 {
 
     private final DetailedSearchCriteria criteria;
@@ -30,9 +30,9 @@ final class ListDataSetSearchOriginalDataProvider extends
     //
 
     @Override
-    public final List<ExternalData> getFullOriginalData()
+    public final List<AbstractExternalData> getFullOriginalData()
     {
-        final List<ExternalData> hits = commonServer.searchForDataSets(sessionToken, criteria);
+        final List<AbstractExternalData> hits = commonServer.searchForDataSets(sessionToken, criteria);
         return hits;
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListRelatedDataSetOriginalDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListRelatedDataSetOriginalDataProvider.java
index 79a58fc37df19886b5b7e9ba3d3b56cb72896d58..49465eda6096af4d8c08a381d4847520b08c041f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListRelatedDataSetOriginalDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/ListRelatedDataSetOriginalDataProvider.java
@@ -5,7 +5,7 @@ import java.util.List;
 import ch.systemsx.cisd.openbis.generic.client.web.server.resultset.IOriginalDataProvider;
 import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelatedEntities;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * A {@link IOriginalDataProvider} implementation for data sets related to other entities.
@@ -13,7 +13,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
  * @author Piotr Buczek
  */
 final class ListRelatedDataSetOriginalDataProvider extends
-        AbstractOriginalDataProvider<ExternalData>
+        AbstractOriginalDataProvider<AbstractExternalData>
 {
 
     private final DataSetRelatedEntities entities;
@@ -30,9 +30,9 @@ final class ListRelatedDataSetOriginalDataProvider extends
     //
 
     @Override
-    public final List<ExternalData> getFullOriginalData()
+    public final List<AbstractExternalData> getFullOriginalData()
     {
-        final List<ExternalData> hits =
+        final List<AbstractExternalData> hits =
                 commonServer.listRelatedDataSets(sessionToken, entities, false);
         return hits;
     }
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 b1be9a50bb518b61e899d281c4c5888b6627d13c..2a9f2980ad9ad231d680d25de490f3ccdb19c6ed 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
@@ -60,7 +60,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 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.AbstractExternalData;
 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;
@@ -76,7 +76,7 @@ import ch.systemsx.cisd.openbis.generic.shared.util.TypedTableModelBuilder;
  * @author Franz-Josef Elmer
  */
 public abstract class AbstractExternalDataProvider extends
-        AbstractCommonTableModelProvider<ExternalData>
+        AbstractCommonTableModelProvider<AbstractExternalData>
 {
     public AbstractExternalDataProvider(ICommonServer commonServer, String sessionToken)
     {
@@ -84,10 +84,10 @@ public abstract class AbstractExternalDataProvider extends
     }
 
     @Override
-    protected TypedTableModel<ExternalData> createTableModel()
+    protected TypedTableModel<AbstractExternalData> createTableModel()
     {
-        List<ExternalData> dataSets = getDataSets();
-        TypedTableModelBuilder<ExternalData> builder = new TypedTableModelBuilder<ExternalData>();
+        List<AbstractExternalData> dataSets = getDataSets();
+        TypedTableModelBuilder<AbstractExternalData> builder = new TypedTableModelBuilder<AbstractExternalData>();
         builder.addColumn(CODE).withDefaultWidth(150);
         builder.addColumn(EXTERNAL_CODE).withDefaultWidth(150).hideByDefault();
         builder.addColumn(DATA_SET_TYPE).withDefaultWidth(200);
@@ -120,7 +120,7 @@ public abstract class AbstractExternalDataProvider extends
         builder.addColumn(PERM_ID).hideByDefault();
         builder.addColumn(SHOW_DETAILS_LINK).hideByDefault();
         builder.addColumn(METAPROJECTS);
-        for (ExternalData dataSet : dataSets)
+        for (AbstractExternalData dataSet : dataSets)
         {
             builder.addRow(dataSet);
 
@@ -224,6 +224,6 @@ public abstract class AbstractExternalDataProvider extends
         return builder.getModel();
     }
 
-    protected abstract List<ExternalData> getDataSets();
+    protected abstract List<AbstractExternalData> getDataSets();
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/TableForUpdateExporter.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/TableForUpdateExporter.java
index e5f44af38a115a016ac50a07cb088ba407c3f0e6..3dadaff823230d0e5649f7053f4d0a45eedce2a0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/TableForUpdateExporter.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/resultset/TableForUpdateExporter.java
@@ -37,7 +37,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
@@ -71,7 +71,7 @@ public class TableForUpdateExporter
                         commonServer, sessionToken);
             case DATA_SET:
                 return getDataSetTableForUpdate(
-                        (GridRowModels<TableModelRowWithObject<ExternalData>>) rows, lineSeparator,
+                        (GridRowModels<TableModelRowWithObject<AbstractExternalData>>) rows, lineSeparator,
                         commonServer, sessionToken);
             case MATERIAL:
                 return "Export of materials for update is currently not supported.";
@@ -116,9 +116,9 @@ public class TableForUpdateExporter
         if (t instanceof Experiment)
         {
             return ((Experiment) t).getExperimentType();
-        } else if (t instanceof ExternalData)
+        } else if (t instanceof AbstractExternalData)
         {
-            return ((ExternalData) t).getDataSetType();
+            return ((AbstractExternalData) t).getDataSetType();
         } else if (t instanceof Sample)
         {
             return ((Sample) t).getSampleType();
@@ -238,10 +238,10 @@ public class TableForUpdateExporter
     }
 
     public static String getDataSetTableForUpdate(
-            GridRowModels<TableModelRowWithObject<ExternalData>> rows, String lineSeparator,
+            GridRowModels<TableModelRowWithObject<AbstractExternalData>> rows, String lineSeparator,
             ICommonServer commonServer, String sessionToken)
     {
-        TypedTableModelBuilder<ExternalData> builder = new TypedTableModelBuilder<ExternalData>();
+        TypedTableModelBuilder<AbstractExternalData> builder = new TypedTableModelBuilder<AbstractExternalData>();
         builder.addColumn(NewDataSet.CODE);
         builder.addColumn(NewDataSet.CONTAINER);
         builder.addColumn(NewDataSet.PARENTS);
@@ -251,9 +251,9 @@ public class TableForUpdateExporter
         builder.columnGroup("").addColumnsForPropertyTypesForUpdate(
                 getAllPropertyTypes(rows, commonServer.listDataSetTypes(sessionToken)));
 
-        for (GridRowModel<TableModelRowWithObject<ExternalData>> row : rows)
+        for (GridRowModel<TableModelRowWithObject<AbstractExternalData>> row : rows)
         {
-            ExternalData dataSet = row.getOriginalObject().getObjectOrNull();
+            AbstractExternalData dataSet = row.getOriginalObject().getObjectOrNull();
             builder.addRow(dataSet);
             builder.column(NewDataSet.CODE).addString(dataSet.getCode());
             ContainerDataSet container = dataSet.tryGetContainer();
@@ -261,11 +261,11 @@ public class TableForUpdateExporter
             {
                 builder.column(NewDataSet.CONTAINER).addString(container.getCode());
             }
-            Collection<ExternalData> parents = dataSet.getParents();
+            Collection<AbstractExternalData> parents = dataSet.getParents();
             if (parents != null && parents.isEmpty() == false)
             {
                 StringBuilder sb = new StringBuilder();
-                for (ExternalData parent : parents)
+                for (AbstractExternalData parent : parents)
                 {
                     if (sb.length() > 0)
                     {
@@ -284,7 +284,7 @@ public class TableForUpdateExporter
             }
             addProperties(builder, dataSet.getProperties());
         }
-        return TSVRenderer.createTable(new Adapter<ExternalData>(builder), lineSeparator);
+        return TSVRenderer.createTable(new Adapter<AbstractExternalData>(builder), lineSeparator);
     }
 
     private static void addProperties(TypedTableModelBuilder<?> builder,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index d4728c8eba1b93f39267fc9d7e8155e76eaf8b8e..e52bd2679baac6e414db5c0284f4e0aa1ef4898d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -187,7 +187,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentTypePropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdateResult;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 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.Grantee;
@@ -755,13 +755,13 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = ExternalDataValidator.class)
-    public List<ExternalData> listSampleExternalData(final String sessionToken,
+    public List<AbstractExternalData> listSampleExternalData(final String sessionToken,
             @AuthorizationGuard(guardClass = SampleTechIdPredicate.class)
             final TechId sampleId, final boolean showOnlyDirectlyConnected)
     {
         final Session session = getSession(sessionToken);
         final IDatasetLister datasetLister = createDatasetLister(session);
-        final List<ExternalData> datasets =
+        final List<AbstractExternalData> datasets =
                 datasetLister.listBySampleTechId(sampleId, showOnlyDirectlyConnected);
         Collections.sort(datasets);
         return datasets;
@@ -770,13 +770,13 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = ExternalDataValidator.class)
-    public List<ExternalData> listExperimentExternalData(final String sessionToken,
+    public List<AbstractExternalData> listExperimentExternalData(final String sessionToken,
             @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class)
             final TechId experimentId, boolean showOnlyDirectlyConnected)
     {
         final Session session = getSession(sessionToken);
         final IDatasetLister datasetLister = createDatasetLister(session);
-        final List<ExternalData> datasets =
+        final List<AbstractExternalData> datasets =
                 datasetLister.listByExperimentTechId(experimentId, showOnlyDirectlyConnected);
         Collections.sort(datasets);
         return datasets;
@@ -784,7 +784,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public List<ExternalData> listMetaprojectExternalData(final String sessionToken,
+    public List<AbstractExternalData> listMetaprojectExternalData(final String sessionToken,
             final IMetaprojectId metaprojectId)
     {
         final Session session = getSession(sessionToken);
@@ -792,11 +792,11 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         final Metaproject metaproject = getMetaproject(sessionToken, metaprojectId);
         final IDatasetLister lister = createDatasetLister(session);
 
-        final List<ExternalData> datasets = lister.listByMetaprojectId(metaproject.getId());
+        final List<AbstractExternalData> datasets = lister.listByMetaprojectId(metaproject.getId());
         Collections.sort(datasets);
-        List<ExternalData> translatedDatasets = new ArrayList<ExternalData>();
+        List<AbstractExternalData> translatedDatasets = new ArrayList<AbstractExternalData>();
 
-        for (ExternalData dataset : datasets)
+        for (AbstractExternalData dataset : datasets)
         {
             if (authorization.canAccessDataSet(dataset))
             {
@@ -813,18 +813,18 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     // 'fast' implementation
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public List<ExternalData> listDataSetRelationships(final String sessionToken,
+    public List<AbstractExternalData> listDataSetRelationships(final String sessionToken,
             @AuthorizationGuard(guardClass = DataSetTechIdPredicate.class)
             final TechId datasetId, final DataSetRelationshipRole role)
     {
         final Session session = getSession(sessionToken);
         final IDatasetLister datasetLister = createDatasetLister(session);
-        List<ExternalData> datasets = null;
+        List<AbstractExternalData> datasets = null;
         switch (role)
         {
             case CONTAINER:
                 datasets = datasetLister.listByContainerTechId(datasetId);
-                Collections.sort(datasets, ExternalData.DATA_SET_COMPONENTS_COMPARATOR);
+                Collections.sort(datasets, AbstractExternalData.DATA_SET_COMPONENTS_COMPARATOR);
                 break;
             case CHILD:
                 datasets = datasetLister.listByChildTechId(datasetId);
@@ -1455,7 +1455,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = ExternalDataValidator.class)
-    public List<ExternalData> searchForDataSets(String sessionToken, DetailedSearchCriteria criteria)
+    public List<AbstractExternalData> searchForDataSets(String sessionToken, DetailedSearchCriteria criteria)
     {
         final Session session = getSession(sessionToken);
         SearchHelper searchHelper =
@@ -1466,7 +1466,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     @Override
     @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER)
     @Capability("SEARCH_ON_BEHALF_OF_USER")
-    public List<ExternalData> searchForDataSetsOnBehalfOfUser(String sessionToken,
+    public List<AbstractExternalData> searchForDataSetsOnBehalfOfUser(String sessionToken,
             DetailedSearchCriteria criteria, String userId)
     {
         final Session session = getSession(sessionToken);
@@ -1474,14 +1474,14 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
 
         SearchHelper searchHelper =
                 new SearchHelper(session, businessObjectFactory, getDAOFactory());
-        List<ExternalData> unfilteredDatasets =
+        List<AbstractExternalData> unfilteredDatasets =
                 searchHelper.searchForDataSets(userId, person.getId(), criteria);
 
         final ExternalDataValidator validator = new ExternalDataValidator();
-        final ArrayList<ExternalData> datasets =
-                new ArrayList<ExternalData>(unfilteredDatasets.size());
+        final ArrayList<AbstractExternalData> datasets =
+                new ArrayList<AbstractExternalData>(unfilteredDatasets.size());
 
-        for (ExternalData dataset : unfilteredDatasets)
+        for (AbstractExternalData dataset : unfilteredDatasets)
         {
             if (validator.doValidation(person, dataset))
             {
@@ -1493,7 +1493,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public ExternalData getDataSetInfo(String sessionToken,
+    public AbstractExternalData getDataSetInfo(String sessionToken,
             @AuthorizationGuard(guardClass = DataSetTechIdPredicate.class)
             TechId datasetId)
     {
@@ -1535,7 +1535,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
     @ReturnValueFilter(validatorClass = ExternalDataValidator.class)
-    public List<ExternalData> listRelatedDataSets(String sessionToken,
+    public List<AbstractExternalData> listRelatedDataSets(String sessionToken,
             DataSetRelatedEntities relatedEntities, boolean withDetails)
     {
         final Session session = getSession(sessionToken);
@@ -1552,7 +1552,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         Map<Long, Set<Metaproject>> translation =
                 MetaprojectTranslator.translateMetaprojectAssignments(assignments);
 
-        final List<ExternalData> list = new ArrayList<ExternalData>(resultSet.size());
+        final List<AbstractExternalData> list = new ArrayList<AbstractExternalData>(resultSet.size());
         for (final DataPE hit : resultSet)
         {
             HibernateUtils.initialize(hit.getChildRelationships());
@@ -1566,7 +1566,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
     @RolesAllowed(RoleWithHierarchy.INSTANCE_OBSERVER)
     @Capability("SEARCH_ON_BEHALF_OF_USER")
     @ReturnValueFilter(validatorClass = ExternalDataValidator.class)
-    public List<ExternalData> listRelatedDataSetsOnBehalfOfUser(String sessionToken,
+    public List<AbstractExternalData> listRelatedDataSetsOnBehalfOfUser(String sessionToken,
             DataSetRelatedEntities relatedEntities, boolean withDetails, String userId)
     {
         final Session session = getSession(sessionToken);
@@ -1585,7 +1585,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
         Map<Long, Set<Metaproject>> translation =
                 MetaprojectTranslator.translateMetaprojectAssignments(assignments);
 
-        final List<ExternalData> list = new ArrayList<ExternalData>(resultSet.size());
+        final List<AbstractExternalData> list = new ArrayList<AbstractExternalData>(resultSet.size());
         for (final DataPE hit : resultSet)
         {
             HibernateUtils.initialize(hit.getChildRelationships());
@@ -3546,7 +3546,7 @@ public final class CommonServer extends AbstractCommonServer<ICommonServerForInt
             TechId entityId, List<PropertyUpdates> modifiedProperties)
     {
         checkSession(sessionToken);
-        ExternalData dataSet = getDataSetInfo(sessionToken, entityId);
+        AbstractExternalData dataSet = getDataSetInfo(sessionToken, entityId);
         try
         {
             DataSetUpdatesDTO updates = new DataSetUpdatesDTO();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
index 0cef93173076884e59fe2ef54019fbd1f6d9b791..362cc34a783f2d01651e5cd32040a95523e7e285 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
@@ -61,7 +61,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityValidationEvaluat
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdateResult;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 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.Grantee;
@@ -359,7 +359,7 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
     }
 
     @Override
-    public final List<ExternalData> listSampleExternalData(final String sessionToken,
+    public final List<AbstractExternalData> listSampleExternalData(final String sessionToken,
             final TechId sampleId, final boolean showOnlyDirectlyConnected)
     {
         logAccess(sessionToken, "list_sample_external_data", "ID(%s) DIRECT(%s)", sampleId,
@@ -368,7 +368,7 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
     }
 
     @Override
-    public List<ExternalData> listExperimentExternalData(final String sessionToken,
+    public List<AbstractExternalData> listExperimentExternalData(final String sessionToken,
             final TechId experimentId, boolean showOnlyDirectlyConnected)
     {
         logAccess(sessionToken, "list_experiment_external_data", "ID(%s) DIRECT(%s)", experimentId,
@@ -377,7 +377,7 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
     }
 
     @Override
-    public List<ExternalData> listMetaprojectExternalData(final String sessionToken,
+    public List<AbstractExternalData> listMetaprojectExternalData(final String sessionToken,
             final IMetaprojectId metaprojectId)
     {
         logAccess(sessionToken, "list_metaproject_external_data", "METAPROJECT_ID(%s)",
@@ -386,7 +386,7 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
     }
 
     @Override
-    public List<ExternalData> listDataSetRelationships(String sessionToken, TechId datasetId,
+    public List<AbstractExternalData> listDataSetRelationships(String sessionToken, TechId datasetId,
             DataSetRelationshipRole role)
     {
         logAccess(sessionToken, "list_dataset_relationships", "ID(%s), ROLE(%s)", datasetId, role);
@@ -640,14 +640,14 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
     }
 
     @Override
-    public List<ExternalData> searchForDataSets(String sessionToken, DetailedSearchCriteria criteria)
+    public List<AbstractExternalData> searchForDataSets(String sessionToken, DetailedSearchCriteria criteria)
     {
         logAccess(sessionToken, "search_for_datasets", "criteria(%s)", criteria);
         return null;
     }
 
     @Override
-    public List<ExternalData> searchForDataSetsOnBehalfOfUser(String sessionToken,
+    public List<AbstractExternalData> searchForDataSetsOnBehalfOfUser(String sessionToken,
             DetailedSearchCriteria criteria, String userId)
     {
         logAccess(sessionToken, "search_for_datasets", "criteria(%s) user_id(%s)", criteria, userId);
@@ -662,7 +662,7 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
     }
 
     @Override
-    public ExternalData getDataSetInfo(String sessionToken, TechId datasetId)
+    public AbstractExternalData getDataSetInfo(String sessionToken, TechId datasetId)
     {
         logAccess(sessionToken, "getDataSetInfo", "datasetId(%s)", datasetId.getId());
         return null;
@@ -676,7 +676,7 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
     }
 
     @Override
-    public List<ExternalData> listRelatedDataSets(String sessionToken,
+    public List<AbstractExternalData> listRelatedDataSets(String sessionToken,
             DataSetRelatedEntities entities, boolean withDetails)
     {
         logAccess(sessionToken, "list_related_datasets", "WITH_DETAILS(%s)", withDetails);
@@ -684,7 +684,7 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
     }
 
     @Override
-    public List<ExternalData> listRelatedDataSetsOnBehalfOfUser(String sessionToken,
+    public List<AbstractExternalData> listRelatedDataSetsOnBehalfOfUser(String sessionToken,
             DataSetRelatedEntities entities, boolean withDetails, String userId)
     {
         logAccess(sessionToken, "list_related_datasets_on_behalf_of_user", "WITH_DETAILS(%s)",
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
index bdc9b346ee24a2509796543961eeb73c81ffc922..52f3c7a695ee9d5cb057dd1c195e1e0cb3b7a19c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLService.java
@@ -133,7 +133,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentFetchOption;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentFetchOptions;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentTypePropertyType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystem;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Grantee;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocationNode;
@@ -714,13 +714,13 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
     @Override
     @RolesAllowed(
         { RoleWithHierarchy.SPACE_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
-    public List<ExternalData> listDataSetsByExperimentID(final String sessionToken,
+    public List<AbstractExternalData> listDataSetsByExperimentID(final String sessionToken,
             @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class)
             final TechId experimentID) throws UserFailureException
     {
         Session session = getSession(sessionToken);
         IDatasetLister datasetLister = createDatasetLister(session);
-        List<ExternalData> datasets = datasetLister.listByExperimentTechId(experimentID, true);
+        List<AbstractExternalData> datasets = datasetLister.listByExperimentTechId(experimentID, true);
         Collections.sort(datasets);
         return datasets;
     }
@@ -728,14 +728,14 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
     @Override
     @RolesAllowed(
         { RoleWithHierarchy.SPACE_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
-    public List<ExternalData> listDataSetsBySampleID(final String sessionToken,
+    public List<AbstractExternalData> listDataSetsBySampleID(final String sessionToken,
             @AuthorizationGuard(guardClass = SampleTechIdPredicate.class)
             final TechId sampleId, final boolean showOnlyDirectlyConnected)
             throws UserFailureException
     {
         final Session session = getSession(sessionToken);
         final IDatasetLister datasetLister = createDatasetLister(session);
-        final List<ExternalData> datasets =
+        final List<AbstractExternalData> datasets =
                 datasetLister.listBySampleTechId(sampleId, showOnlyDirectlyConnected);
         Collections.sort(datasets);
         return datasets;
@@ -744,7 +744,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
     @Override
     @RolesAllowed(
         { RoleWithHierarchy.SPACE_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
-    public List<ExternalData> listDataSetsByCode(String sessionToken,
+    public List<AbstractExternalData> listDataSetsByCode(String sessionToken,
             @AuthorizationGuard(guardClass = DataSetCodeCollectionPredicate.class)
             List<String> dataSetCodes) throws UserFailureException
     {
@@ -1063,7 +1063,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
     @Override
     @RolesAllowed(value =
         { RoleWithHierarchy.SPACE_OBSERVER, RoleWithHierarchy.SPACE_ETL_SERVER })
-    public ExternalData tryGetDataSet(String sessionToken,
+    public AbstractExternalData tryGetDataSet(String sessionToken,
             @AuthorizationGuard(guardClass = DataSetCodePredicate.class)
             String dataSetCode) throws UserFailureException
     {
@@ -1181,7 +1181,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
         final Session session = getSession(sessionToken);
         final DataStorePE dataStore = loadDataStore(session, dataStoreCode);
         final IDatasetLister datasetLister = businessObjectFactory.createDatasetLister(session);
-        final List<ExternalData> dataSets =
+        final List<AbstractExternalData> dataSets =
                 datasetLister.listByDataStore(dataStore.getId(),
                         DATASET_FETCH_OPTIONS_FILE_DATASETS);
         return SimpleDataSetHelper.filterAndTranslate(dataSets);
@@ -1195,7 +1195,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
         final Session session = getSession(sessionToken);
         final DataStorePE dataStore = loadDataStore(session, dataStoreCode);
         final IDatasetLister datasetLister = businessObjectFactory.createDatasetLister(session);
-        final List<ExternalData> dataSets =
+        final List<AbstractExternalData> dataSets =
                 datasetLister.listByDataStore(dataStore.getId(), limit,
                         DATASET_FETCH_OPTIONS_FILE_DATASETS);
         return SimpleDataSetHelper.filterAndTranslate(dataSets);
@@ -1209,7 +1209,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
         final Session session = getSession(sessionToken);
         final DataStorePE dataStore = loadDataStore(session, dataStoreCode);
         final IDatasetLister datasetLister = businessObjectFactory.createDatasetLister(session);
-        final List<ExternalData> dataSets =
+        final List<AbstractExternalData> dataSets =
                 datasetLister.listByDataStore(dataStore.getId(), youngerThan, limit,
                         DATASET_FETCH_OPTIONS_FILE_DATASETS);
         return SimpleDataSetHelper.filterAndTranslate(dataSets);
@@ -1217,7 +1217,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_ETL_SERVER)
-    public List<ExternalData> listAvailableDataSets(String sessionToken, String dataStoreCode,
+    public List<AbstractExternalData> listAvailableDataSets(String sessionToken, String dataStoreCode,
             ArchiverDataSetCriteria criteria)
     {
         Session session = getSession(sessionToken);
@@ -1227,7 +1227,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_ETL_SERVER)
-    public List<ExternalData> listDataSets(String sessionToken, String dataStoreCode,
+    public List<AbstractExternalData> listDataSets(String sessionToken, String dataStoreCode,
             TrackingDataSetCriteria criteria)
     {
         Session session = getSession(sessionToken);
@@ -1239,9 +1239,9 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
             throw new UserFailureException("Unknown data store: " + dataStoreCode);
         }
         final IDatasetLister datasetLister = createDatasetLister(session);
-        List<ExternalData> allDataSets = datasetLister.listByTrackingCriteria(criteria);
-        List<ExternalData> result = new ArrayList<ExternalData>();
-        for (ExternalData externalData : allDataSets)
+        List<AbstractExternalData> allDataSets = datasetLister.listByTrackingCriteria(criteria);
+        List<AbstractExternalData> result = new ArrayList<AbstractExternalData>();
+        for (AbstractExternalData externalData : allDataSets)
         {
             if (dataStoreCode.equals(externalData.getDataStore().getCode()))
             {
@@ -2352,7 +2352,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_ETL_SERVER)
-    public List<ExternalData> searchForDataSets(String sessionToken, SearchCriteria searchCriteria)
+    public List<AbstractExternalData> searchForDataSets(String sessionToken, SearchCriteria searchCriteria)
     {
         Session session = getSession(sessionToken);
         DetailedSearchCriteria detailedSearchCriteria =
@@ -2458,7 +2458,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_ETL_SERVER)
-    public List<ExternalData> listDataSetsForPostRegistration(String sessionToken,
+    public List<AbstractExternalData> listDataSetsForPostRegistration(String sessionToken,
             String dataStoreCode)
     {
         Session session = getSession(sessionToken);
@@ -2467,7 +2467,7 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
         final IDatasetLister datasetLister = createDatasetLister(session);
         Collection<Long> allDataSetIds =
                 daoFactory.getPostRegistrationDAO().listDataSetsForPostRegistration();
-        List<ExternalData> allDataSets = datasetLister.listByDatasetIds(allDataSetIds);
+        List<AbstractExternalData> allDataSets = datasetLister.listByDatasetIds(allDataSetIds);
 
         // find datastore
         getDAOFactory().getHomeDatabaseInstance();
@@ -2479,8 +2479,8 @@ public class ETLService extends AbstractCommonServer<IETLLIMSService> implements
         }
 
         // filter datasets by datastore
-        List<ExternalData> result = new ArrayList<ExternalData>();
-        for (ExternalData externalData : allDataSets)
+        List<AbstractExternalData> result = new ArrayList<AbstractExternalData>();
+        for (AbstractExternalData externalData : allDataSets)
         {
             if (dataStoreCode.equals(externalData.getDataStore().getCode()))
             {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceLogger.java
index 2fe87e3901bf5586ce1f4d27d213f0fa9cd7c904..5a7e62b8ca4d2c893eb0a9cbdcf42117cf3a785d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceLogger.java
@@ -43,7 +43,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentFetchOptions;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystem;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocationNode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
@@ -244,7 +244,7 @@ public class ETLServiceLogger extends AbstractServerLogger implements IETLLIMSSe
     }
 
     @Override
-    public List<ExternalData> listDataSetsByExperimentID(String sessionToken, TechId experimentID)
+    public List<AbstractExternalData> listDataSetsByExperimentID(String sessionToken, TechId experimentID)
             throws UserFailureException
     {
         logAccess(sessionToken, "listDataSetsByExperimentID", "EXPERIMENT_ID(%s)", experimentID);
@@ -252,7 +252,7 @@ public class ETLServiceLogger extends AbstractServerLogger implements IETLLIMSSe
     }
 
     @Override
-    public List<ExternalData> listDataSetsBySampleID(final String sessionToken,
+    public List<AbstractExternalData> listDataSetsBySampleID(final String sessionToken,
             final TechId sampleId, final boolean showOnlyDirectlyConnected)
     {
         logAccess(sessionToken, "listDataSetsBySampleID", "SAMPLE_ID(%s)", sampleId);
@@ -260,7 +260,7 @@ public class ETLServiceLogger extends AbstractServerLogger implements IETLLIMSSe
     }
 
     @Override
-    public List<ExternalData> listDataSetsByCode(String sessionToken, List<String> dataSetCodes)
+    public List<AbstractExternalData> listDataSetsByCode(String sessionToken, List<String> dataSetCodes)
             throws UserFailureException
     {
         logAccess(sessionToken, "listDataSetsByCode", "DATA_SETS(%s)", dataSetCodes);
@@ -325,7 +325,7 @@ public class ETLServiceLogger extends AbstractServerLogger implements IETLLIMSSe
     }
 
     @Override
-    public ExternalData tryGetDataSet(String sessionToken, String dataSetCode)
+    public AbstractExternalData tryGetDataSet(String sessionToken, String dataSetCode)
             throws UserFailureException
     {
         logAccess(sessionToken, "tryGetDataSet", "DATA_SET(%s)", dataSetCode);
@@ -375,7 +375,7 @@ public class ETLServiceLogger extends AbstractServerLogger implements IETLLIMSSe
     }
 
     @Override
-    public List<ExternalData> listAvailableDataSets(String sessionToken, String dataStoreCode,
+    public List<AbstractExternalData> listAvailableDataSets(String sessionToken, String dataStoreCode,
             ArchiverDataSetCriteria criteria)
     {
         logAccess(sessionToken, "listAvailableDataSets", "DATA_STORE(%s) CRITERIA(%s)",
@@ -384,7 +384,7 @@ public class ETLServiceLogger extends AbstractServerLogger implements IETLLIMSSe
     }
 
     @Override
-    public List<ExternalData> listDataSets(String sessionToken, String dataStoreCode,
+    public List<AbstractExternalData> listDataSets(String sessionToken, String dataStoreCode,
             TrackingDataSetCriteria criteria)
     {
         logAccess(Level.DEBUG, sessionToken, "listDataSets", "DATA_STORE(%s) CRITERIA(%s)",
@@ -595,7 +595,7 @@ public class ETLServiceLogger extends AbstractServerLogger implements IETLLIMSSe
     }
 
     @Override
-    public List<ExternalData> searchForDataSets(String sessionToken, SearchCriteria searchCriteria)
+    public List<AbstractExternalData> searchForDataSets(String sessionToken, SearchCriteria searchCriteria)
     {
         logAccess(sessionToken, "searchForDataSets", "%s", searchCriteria);
         return null;
@@ -658,7 +658,7 @@ public class ETLServiceLogger extends AbstractServerLogger implements IETLLIMSSe
     }
 
     @Override
-    public List<ExternalData> listDataSetsForPostRegistration(String sessionToken,
+    public List<AbstractExternalData> listDataSetsForPostRegistration(String sessionToken,
             String dataStoreCode)
     {
         logAccess(Level.DEBUG, sessionToken, "listDataSetsForPostRegistration", "DATA_STORE(%s)",
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/MetaprojectAssignmentsHelper.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/MetaprojectAssignmentsHelper.java
index d686cdea8138658806674682e7ef28faf4022647..65b21d1807fdeb2a220077a6cc9030fa29ec6130 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/MetaprojectAssignmentsHelper.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/MetaprojectAssignmentsHelper.java
@@ -25,7 +25,7 @@ import ch.systemsx.cisd.openbis.generic.server.authorization.AuthorizationServic
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MetaprojectAssignments;
@@ -79,7 +79,7 @@ public class MetaprojectAssignmentsHelper
 
         List<Experiment> experiments = new ArrayList<Experiment>();
         List<Sample> samples = new ArrayList<Sample>();
-        List<ExternalData> dataSets = new ArrayList<ExternalData>();
+        List<AbstractExternalData> dataSets = new ArrayList<AbstractExternalData>();
         List<Material> materials = new ArrayList<Material>();
 
         if (fetchOptions.contains(MetaprojectAssignmentsFetchOption.EXPERIMENTS))
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/SearchHelper.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/SearchHelper.java
index 3f5fda76bac2becd1e3903dc3d9659d1b77f3cb6..eb1bfb1fcf821beaaf11b57740f03c4e8c86971a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/SearchHelper.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/SearchHelper.java
@@ -30,7 +30,7 @@ import ch.systemsx.cisd.openbis.generic.server.business.search.SampleSearchManag
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IHibernateSearchDAO;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
@@ -65,7 +65,7 @@ class SearchHelper
         return new SampleSearchManager(searchDAO, sampleLister).searchForSamples(userId, criteria);
     }
 
-    public List<ExternalData> searchForDataSets(String userId,
+    public List<AbstractExternalData> searchForDataSets(String userId,
             DetailedSearchCriteria detailedSearchCriteria)
     {
         IHibernateSearchDAO searchDAO = daoFactory.getHibernateSearchDAO();
@@ -74,7 +74,7 @@ class SearchHelper
                 detailedSearchCriteria);
     }
 
-    public List<ExternalData> searchForDataSets(String userId, Long userTechId,
+    public List<AbstractExternalData> searchForDataSets(String userId, Long userTechId,
             DetailedSearchCriteria detailedSearchCriteria)
     {
         IHibernateSearchDAO searchDAO = daoFactory.getHibernateSearchDAO();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java
index 978d5d35ba4a4d718d1e7cf7cf0c49ba24aaaf88..af92a983170735132712b6859f5acd709f280132 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServer.java
@@ -32,7 +32,7 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.ITrackingServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.SearchlinkUtilities;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -106,14 +106,14 @@ public final class TrackingServer extends AbstractServer<ITrackingServer> implem
 
     @Override
     @RolesAllowed(RoleWithHierarchy.INSTANCE_ADMIN)
-    public List<ExternalData> listDataSets(String sessionToken, TrackingDataSetCriteria criteria)
+    public List<AbstractExternalData> listDataSets(String sessionToken, TrackingDataSetCriteria criteria)
     {
         final Session session = getSession(sessionToken);
 
         // retrieve data sets connected to samples of type specified in criteria
         // (these samples don't have properties loaded but ids are loaded)
         final IDatasetLister datasetLister = businessObjectFactory.createDatasetLister(session);
-        final List<ExternalData> dataSets = datasetLister.listByTrackingCriteria(criteria);
+        final List<AbstractExternalData> dataSets = datasetLister.listByTrackingCriteria(criteria);
         // retrieve samples enriched with their dependent samples and properties
         // (drawback - samples directly connected to data sets are retrieved twice)
         final ISampleLister sampleLister = businessObjectFactory.createSampleLister(session);
@@ -126,10 +126,10 @@ public final class TrackingServer extends AbstractServer<ITrackingServer> implem
         return dataSets;
     }
 
-    private List<Long> extractConnectedSampleIds(List<ExternalData> dataSets)
+    private List<Long> extractConnectedSampleIds(List<AbstractExternalData> dataSets)
     {
         final List<Long> sampleIds = new ArrayList<Long>();
-        for (ExternalData dataSet : dataSets)
+        for (AbstractExternalData dataSet : dataSets)
         {
             assert dataSet.getSample() != null : "data set is not connected to a sample";
             sampleIds.add(dataSet.getSample().getId());
@@ -137,7 +137,7 @@ public final class TrackingServer extends AbstractServer<ITrackingServer> implem
         return sampleIds;
     }
 
-    private void replaceConnectedSamples(List<ExternalData> dataSets, List<Sample> enrichedSamples)
+    private void replaceConnectedSamples(List<AbstractExternalData> dataSets, List<Sample> enrichedSamples)
     {
         // list orders are not the same - map is needed for quick search
         // <sample id, sample>
@@ -148,7 +148,7 @@ public final class TrackingServer extends AbstractServer<ITrackingServer> implem
             enrichedSamplesMap.put(sample.getId(), sample);
         }
 
-        for (ExternalData dataSet : dataSets)
+        for (AbstractExternalData dataSet : dataSets)
         {
             final Sample enrichedSample = enrichedSamplesMap.get(dataSet.getSample().getId());
             assert enrichedSample != null;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServerLogger.java
index c1dbe1af24de6269946bd3a2e838f974ba898ec0..c8581b2dfc8d4504d6e39d13a8e08a2f683000b5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/TrackingServerLogger.java
@@ -22,7 +22,7 @@ import ch.systemsx.cisd.authentication.ISessionManager;
 import ch.systemsx.cisd.openbis.common.spring.IInvocationLoggerContext;
 import ch.systemsx.cisd.openbis.generic.shared.AbstractServerLogger;
 import ch.systemsx.cisd.openbis.generic.shared.ITrackingServer;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingSampleCriteria;
@@ -51,7 +51,7 @@ final class TrackingServerLogger extends AbstractServerLogger implements ITracki
     //
 
     @Override
-    public List<ExternalData> listDataSets(String sessionToken, TrackingDataSetCriteria criteria)
+    public List<AbstractExternalData> listDataSets(String sessionToken, TrackingDataSetCriteria criteria)
     {
         logTracking(sessionToken, "list_data_sets", "SAMPLE_TYPE(%s) LAST_DATASET_ID(%s)", criteria
                 .getConnectedSampleTypeCode(), criteria.getLastSeenDataSetId());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java
index 34982998a421b2ae9c4a3a3a56a258ef459e4e7c..914ceed8a69daca37fb9abe63d2fa9e322d741e9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationService.java
@@ -96,7 +96,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelatedEntities;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListMaterialCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
@@ -592,7 +592,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
             Sample sample, boolean areOnlyDirectlyConnectedIncluded)
     {
         checkSession(sessionToken);
-        List<ExternalData> externalData =
+        List<AbstractExternalData> externalData =
                 commonServer.listSampleExternalData(sessionToken, new TechId(sample.getId()),
                         areOnlyDirectlyConnectedIncluded);
         return Translator.translate(externalData, EnumSet.noneOf(Connections.class));
@@ -706,7 +706,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
         SampleToDataSetRelatedEntitiesTranslator translator =
                 new SampleToDataSetRelatedEntitiesTranslator(sampleTypes, samples);
         DataSetRelatedEntities dsre = translator.convertToDataSetRelatedEntities();
-        List<ExternalData> dataSets = commonServer.listRelatedDataSets(sessionToken, dsre, true);
+        List<AbstractExternalData> dataSets = commonServer.listRelatedDataSets(sessionToken, dsre, true);
         return Translator.translate(dataSets, connectionsToGet);
     }
 
@@ -727,7 +727,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
                 new SampleToDataSetRelatedEntitiesTranslator(sampleTypes, samples);
         DataSetRelatedEntities dsre = translator.convertToDataSetRelatedEntities();
 
-        List<ExternalData> dataSets =
+        List<AbstractExternalData> dataSets =
                 commonServer.listRelatedDataSetsOnBehalfOfUser(sessionToken, dsre, true, userId);
 
         final List<DataSet> unfilteredDatasets = Translator.translate(dataSets, connectionsToGet);
@@ -764,7 +764,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
         ExperimentToDataSetRelatedEntitiesTranslator translator =
                 new ExperimentToDataSetRelatedEntitiesTranslator(experimentTypes, experiments);
         DataSetRelatedEntities dsre = translator.convertToDataSetRelatedEntities();
-        List<ExternalData> dataSets = commonServer.listRelatedDataSets(sessionToken, dsre, true);
+        List<AbstractExternalData> dataSets = commonServer.listRelatedDataSets(sessionToken, dsre, true);
         return Translator.translate(dataSets, connectionsToGet);
     }
 
@@ -785,7 +785,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
         ExperimentToDataSetRelatedEntitiesTranslator translator =
                 new ExperimentToDataSetRelatedEntitiesTranslator(experimentTypes, experiments);
         DataSetRelatedEntities dsre = translator.convertToDataSetRelatedEntities();
-        List<ExternalData> dataSets =
+        List<AbstractExternalData> dataSets =
                 commonServer.listRelatedDataSetsOnBehalfOfUser(sessionToken, dsre, true, userId);
 
         final List<DataSet> unfilteredDatasets = Translator.translate(dataSets, connectionsToGet);
@@ -827,7 +827,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
             Collection<MetaprojectPE> metaprojects =
                     getDAOFactory().getMetaprojectDAO().listMetaprojectsForEntity(
                             session.tryGetPerson(), dataPE);
-            ExternalData ds =
+            AbstractExternalData ds =
                     DataSetTranslator.translate(dataPE, session.getBaseIndexURL(),
                             MetaprojectTranslator.translate(metaprojects),
                             managedPropertyEvaluatorFactory);
@@ -897,7 +897,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
         DetailedSearchCriteria detailedSearchCriteria =
                 SearchCriteriaToDetailedSearchCriteriaTranslator.convert(getDAOFactory(),
                         SearchableEntityKind.DATA_SET, searchCriteria);
-        List<ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData> privateDataSets =
+        List<ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData> privateDataSets =
                 commonServer.searchForDataSets(sessionToken, detailedSearchCriteria);
 
         // The underlying search, as currently implemented, does not return any of the connections
@@ -916,7 +916,7 @@ public class GeneralInformationService extends AbstractServer<IGeneralInformatio
         DetailedSearchCriteria detailedSearchCriteria =
                 SearchCriteriaToDetailedSearchCriteriaTranslator.convert(getDAOFactory(),
                         SearchableEntityKind.DATA_SET, searchCriteria);
-        List<ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData> privateDataSets =
+        List<ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData> privateDataSets =
                 commonServer.searchForDataSetsOnBehalfOfUser(sessionToken, detailedSearchCriteria,
                         userId);
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/AuthorizationServiceUtils.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/AuthorizationServiceUtils.java
index 903e4db4230140a468ede4b6c01175ef34840d86..d8f15727d8c74a31e634e563af934530445a06b1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/AuthorizationServiceUtils.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/AuthorizationServiceUtils.java
@@ -33,7 +33,7 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifierHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy.RoleLevel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -159,7 +159,7 @@ public class AuthorizationServiceUtils
         return canAccessDataSet(dataSet.getCode());
     }
 
-    public boolean canAccessDataSet(ExternalData dataSet)
+    public boolean canAccessDataSet(AbstractExternalData dataSet)
     {
         return canAccessDataSet(dataSet.getCode());
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ExternalDataValidator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ExternalDataValidator.java
index a31db3db6f12427d30f105a0188f2ae5399e9eff..b78edf6a04e047efe84e6c77d518337d6ed20eca 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ExternalDataValidator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/ExternalDataValidator.java
@@ -16,20 +16,20 @@
 
 package ch.systemsx.cisd.openbis.generic.server.authorization.validator;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 
 /**
- * A {@link IValidator} implementation suitable for {@link ExternalData}.
+ * A {@link IValidator} implementation suitable for {@link AbstractExternalData}.
  * 
  * @author Tomasz Pylak
  */
-public final class ExternalDataValidator extends AbstractValidator<ExternalData>
+public final class ExternalDataValidator extends AbstractValidator<AbstractExternalData>
 {
     private final IValidator<Space> groupValidator;
 
-    private final IValidator<ExternalData> storageConfirmedValidator;
+    private final IValidator<AbstractExternalData> storageConfirmedValidator;
 
     public ExternalDataValidator()
     {
@@ -43,7 +43,7 @@ public final class ExternalDataValidator extends AbstractValidator<ExternalData>
     //
 
     @Override
-    public final boolean doValidation(final PersonPE person, final ExternalData value)
+    public final boolean doValidation(final PersonPE person, final AbstractExternalData value)
     {
         final Space space = value.getExperiment().getProject().getSpace();
         return groupValidator.isValid(person, space)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/StorageConfirmedForAdminValidator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/StorageConfirmedForAdminValidator.java
index 07cf24091a95f5355a51375ab326e4c8012437f6..c6e1ff351e31c95404c1c2c150335cf712ba9057 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/StorageConfirmedForAdminValidator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/validator/StorageConfirmedForAdminValidator.java
@@ -24,7 +24,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.RoleAssignmentPE;
  * @author Jakub Straszewski
  */
 public class StorageConfirmedForAdminValidator extends
-        AbstractValidator<ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData>
+        AbstractValidator<ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData>
 {
 
     private static boolean isPersonAllowedForNotConfirmed(PersonPE person)
@@ -46,7 +46,7 @@ public class StorageConfirmedForAdminValidator extends
 
     @Override
     public boolean doValidation(PersonPE person,
-            ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData value)
+            ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData value)
     {
         return isValid(person, value.isStorageConfirmation());
     }
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 3ab6f9248825a3fcc462d19487ec52a3d22a7205..f4a8cdde3ec963d1c38b3374d64fe6cc192ff2ec 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
@@ -55,7 +55,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
@@ -451,7 +451,7 @@ public final class DataSetTable extends AbstractDataSetBusinessObject implements
                 getConversationClient().getDataStoreService(dataStore.getRemoteUrl(),
                         session.getSessionToken());
         String sessionToken = dataStore.getSessionToken();
-        List<ExternalData> cleanDataSets =
+        List<AbstractExternalData> cleanDataSets =
                 DataSetTranslator.translate(list, "?", "?", new HashMap<Long, Set<Metaproject>>(),
                         managedPropertyEvaluatorFactory);
         service.uploadDataSetsToCIFEX(sessionToken, cleanDataSets, context);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java
index 48f76218ac01fe1b919ad655b25555fc9eb187b1..12d22103186d68d84d7c047cd2d5bdecc652b974 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetLister.java
@@ -74,7 +74,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatasetLocationNode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 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.AbstractExternalData;
 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.IDatasetLocationNode;
@@ -206,7 +206,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
     }
 
     @Override
-    public List<ExternalData> listBySampleTechId(TechId sampleId, boolean showOnlyDirectlyConnected)
+    public List<AbstractExternalData> listBySampleTechId(TechId sampleId, boolean showOnlyDirectlyConnected)
     {
         if (showOnlyDirectlyConnected)
         {
@@ -231,13 +231,13 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
     }
 
     @Override
-    public List<ExternalData> listBySampleIds(Collection<Long> sampleIds)
+    public List<AbstractExternalData> listBySampleIds(Collection<Long> sampleIds)
     {
         return listBySampleIds(sampleIds, DEFAULT_DATASET_FETCH_OPTIONS);
     }
 
     @Override
-    public List<ExternalData> listBySampleIds(Collection<Long> sampleIds,
+    public List<AbstractExternalData> listBySampleIds(Collection<Long> sampleIds,
             EnumSet<DataSetFetchOption> datasetFetchOptions)
     {
         checkFetchOptions(datasetFetchOptions);
@@ -250,7 +250,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
     }
 
     @Override
-    public List<ExternalData> listByExperimentTechId(TechId experimentId,
+    public List<AbstractExternalData> listByExperimentTechId(TechId experimentId,
             boolean showOnlyDirectlyConnected)
     {
         DataIterator<DatasetRecord> dataSets;
@@ -265,7 +265,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
     }
 
     @Override
-    public List<ExternalData> listByMetaprojectId(Long metaprojectId)
+    public List<AbstractExternalData> listByMetaprojectId(Long metaprojectId)
     {
         DataIterator<DatasetRecord> dataSets = query.getDatasetsForMetaproject(metaprojectId);
         return enrichDatasets(dataSets);
@@ -318,7 +318,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
     }
 
     @Override
-    public Map<Sample, List<ExternalData>> listAllDataSetsFor(List<Sample> samples)
+    public Map<Sample, List<AbstractExternalData>> listAllDataSetsFor(List<Sample> samples)
     {
         TableMap<Long, Sample> samplesByID =
                 new TableMap<Long, Sample>(samples, new IKeyExtractor<Long, Sample>()
@@ -329,16 +329,16 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
                             return e.getId();
                         }
                     });
-        Map<Sample, List<ExternalData>> result = new HashMap<Sample, List<ExternalData>>();
+        Map<Sample, List<AbstractExternalData>> result = new HashMap<Sample, List<AbstractExternalData>>();
         Set<Long> sampleIDs = new HashSet<Long>();
         for (Sample sample : samples)
         {
-            result.put(sample, new ArrayList<ExternalData>());
+            result.put(sample, new ArrayList<AbstractExternalData>());
             sampleIDs.add(sample.getId());
         }
-        List<ExternalData> rootDataSets = listBySampleIds(sampleIDs);
+        List<AbstractExternalData> rootDataSets = listBySampleIds(sampleIDs);
         addChildren(rootDataSets);
-        for (ExternalData dataSet : rootDataSets)
+        for (AbstractExternalData dataSet : rootDataSets)
         {
             Sample sample = samplesByID.tryGet(dataSet.getSample().getId());
             assert sample != null;
@@ -347,10 +347,10 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         return result;
     }
 
-    private void addChildren(List<ExternalData> dataSets)
+    private void addChildren(List<AbstractExternalData> dataSets)
     {
-        Map<Long, ExternalData> dataSetsByID = new HashMap<Long, ExternalData>();
-        for (ExternalData dataSet : dataSets)
+        Map<Long, AbstractExternalData> dataSetsByID = new HashMap<Long, AbstractExternalData>();
+        for (AbstractExternalData dataSet : dataSets)
         {
             dataSetsByID.put(dataSet.getId(), dataSet);
         }
@@ -376,17 +376,17 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         }
         if (childIDs.isEmpty() == false)
         {
-            List<ExternalData> children = listByDatasetIds(childIDs);
-            for (ExternalData child : children)
+            List<AbstractExternalData> children = listByDatasetIds(childIDs);
+            for (AbstractExternalData child : children)
             {
                 Set<Long> parentIDs = child2ParentsMap.get(child.getId());
                 for (Long parentID : parentIDs)
                 {
-                    ExternalData dataSet = dataSetsByID.get(parentID);
-                    Collection<ExternalData> childList = dataSet.getChildren();
+                    AbstractExternalData dataSet = dataSetsByID.get(parentID);
+                    Collection<AbstractExternalData> childList = dataSet.getChildren();
                     if (childList == null)
                     {
-                        childList = new ArrayList<ExternalData>(1);
+                        childList = new ArrayList<AbstractExternalData>(1);
                         dataSet.setChildren(childList);
                     }
                     childList.add(child);
@@ -397,19 +397,19 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
     }
 
     @Override
-    public List<ExternalData> listByChildTechId(TechId childDatasetId)
+    public List<AbstractExternalData> listByChildTechId(TechId childDatasetId)
     {
         return enrichDatasets(query.getParentDatasetsForChild(childDatasetId.getId()));
     }
 
     @Override
-    public List<ExternalData> listByContainerTechId(TechId containerDatasetId)
+    public List<AbstractExternalData> listByContainerTechId(TechId containerDatasetId)
     {
         return enrichDatasets(query.getContainedDatasetsForContainer(containerDatasetId.getId()));
     }
 
     @Override
-    public List<ExternalData> listByParentTechIds(Collection<Long> parentDatasetIds)
+    public List<AbstractExternalData> listByParentTechIds(Collection<Long> parentDatasetIds)
     {
         DataIterator<DatasetRecord> childrenDataSets =
                 query.getChildDatasetsForParents(new LongOpenHashSet(parentDatasetIds));
@@ -417,13 +417,13 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
     }
 
     @Override
-    public List<ExternalData> listByDatasetIds(Collection<Long> datasetIds)
+    public List<AbstractExternalData> listByDatasetIds(Collection<Long> datasetIds)
     {
         return listByDatasetIds(datasetIds, DEFAULT_DATASET_FETCH_OPTIONS);
     }
 
     @Override
-    public List<ExternalData> listByDatasetIds(Collection<Long> datasetIds,
+    public List<AbstractExternalData> listByDatasetIds(Collection<Long> datasetIds,
             EnumSet<DataSetFetchOption> datasetFetchOptions)
     {
         checkFetchOptions(datasetFetchOptions);
@@ -432,13 +432,13 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
     }
 
     @Override
-    public List<ExternalData> listByDatasetCode(Collection<String> datasetCodes)
+    public List<AbstractExternalData> listByDatasetCode(Collection<String> datasetCodes)
     {
         return listByDatasetCode(datasetCodes, DEFAULT_DATASET_FETCH_OPTIONS);
     }
 
     @Override
-    public List<ExternalData> listByDatasetCode(Collection<String> datasetCodes,
+    public List<AbstractExternalData> listByDatasetCode(Collection<String> datasetCodes,
             EnumSet<DataSetFetchOption> datasetFetchOptions)
     {
         checkFetchOptions(datasetFetchOptions);
@@ -448,13 +448,13 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
     }
 
     @Override
-    public List<ExternalData> listByDataStore(long dataStoreID)
+    public List<AbstractExternalData> listByDataStore(long dataStoreID)
     {
         return listByDataStore(dataStoreID, DEFAULT_DATASET_FETCH_OPTIONS);
     }
 
     @Override
-    public List<ExternalData> listByDataStore(long dataStoreID,
+    public List<AbstractExternalData> listByDataStore(long dataStoreID,
             EnumSet<DataSetFetchOption> datasetFetchOptions)
     {
         checkFetchOptions(datasetFetchOptions);
@@ -462,7 +462,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
     }
 
     @Override
-    public List<ExternalData> listByDataStore(long dataStoreID, int limit,
+    public List<AbstractExternalData> listByDataStore(long dataStoreID, int limit,
             EnumSet<DataSetFetchOption> datasetFetchOptions)
     {
         checkFetchOptions(datasetFetchOptions);
@@ -473,7 +473,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
     }
 
     @Override
-    public List<ExternalData> listByDataStore(long dataStoreID, Date youngerThan, int limit,
+    public List<AbstractExternalData> listByDataStore(long dataStoreID, Date youngerThan, int limit,
             EnumSet<DataSetFetchOption> datasetFetchOptions)
     {
         checkFetchOptions(datasetFetchOptions);
@@ -514,12 +514,12 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         }
     }
 
-    private List<ExternalData> orderByDate(List<ExternalData> list)
+    private List<AbstractExternalData> orderByDate(List<AbstractExternalData> list)
     {
-        Collections.sort(list, new Comparator<ExternalData>()
+        Collections.sort(list, new Comparator<AbstractExternalData>()
             {
                 @Override
-                public int compare(ExternalData o1, ExternalData o2)
+                public int compare(AbstractExternalData o1, AbstractExternalData o2)
                 {
                     return o1.getRegistrationDate().compareTo(o2.getRegistrationDate());
                 }
@@ -545,7 +545,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
     }
 
     @Override
-    public List<ExternalData> listByTrackingCriteria(TrackingDataSetCriteria criteria)
+    public List<AbstractExternalData> listByTrackingCriteria(TrackingDataSetCriteria criteria)
     {
         DataIterator<DatasetRecord> dataSets;
         String sampleType = criteria.getConnectedSampleTypeCode();
@@ -564,12 +564,12 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         }
         loadSmallConnectedTables();
         List<DatasetRecord> datasetRecords = asList(dataSets);
-        Long2ObjectMap<ExternalData> datasetMap = createPrimaryDatasets(datasetRecords);
+        Long2ObjectMap<AbstractExternalData> datasetMap = createPrimaryDatasets(datasetRecords);
         return asList(datasetMap);
     }
 
     @Override
-    public List<ExternalData> listByArchiverCriteria(String dataStoreCode,
+    public List<AbstractExternalData> listByArchiverCriteria(String dataStoreCode,
             ArchiverDataSetCriteria criteria)
     {
         loadSmallConnectedTables();
@@ -618,17 +618,17 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         throw new UserFailureException("Data Set type '" + dataSetTypeCode + "' unknown.");
     }
 
-    private List<ExternalData> enrichDatasets(Iterable<DatasetRecord> datasets)
+    private List<AbstractExternalData> enrichDatasets(Iterable<DatasetRecord> datasets)
     {
         return enrichDatasets(datasets, DEFAULT_DATASET_FETCH_OPTIONS);
     }
 
-    private List<ExternalData> enrichDatasets(Iterable<DatasetRecord> datasets,
+    private List<AbstractExternalData> enrichDatasets(Iterable<DatasetRecord> datasets,
             EnumSet<DataSetFetchOption> fetchOptions)
     {
         loadSmallConnectedTables();
         List<DatasetRecord> datasetRecords = asList(datasets);
-        final Long2ObjectMap<ExternalData> datasetMap = createPrimaryDatasets(datasetRecords);
+        final Long2ObjectMap<AbstractExternalData> datasetMap = createPrimaryDatasets(datasetRecords);
         if (fetchOptions.contains(DataSetFetchOption.EXPERIMENT))
         {
             enrichWithExperiments(datasetMap);
@@ -668,7 +668,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         return asList(datasetMap);
     }
 
-    private void enrichWithMetaProjects(Long2ObjectMap<ExternalData> datasetMap)
+    private void enrichWithMetaProjects(Long2ObjectMap<AbstractExternalData> datasetMap)
     {
         LongSet set = new LongOpenHashSet();
         set.addAll(datasetMap.keySet());
@@ -684,7 +684,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
             mp.setOwnerId(metaProject.owner_name);
             mp.setPrivate(metaProject.is_private);
 
-            ExternalData data = datasetMap.get(metaProject.entity_id);
+            AbstractExternalData data = datasetMap.get(metaProject.entity_id);
 
             if (data != null)
             {
@@ -701,11 +701,11 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
 
     // assumes that the connection to the sample has been already established and sample has the
     // id set.
-    private void enrichWithSamples(Long2ObjectMap<ExternalData> datasetMap)
+    private void enrichWithSamples(Long2ObjectMap<AbstractExternalData> datasetMap)
     {
         LongSet ids = extractSampleIds(datasetMap);
         Long2ObjectMap<Sample> samples = referencedEntityDAO.getSamples(ids);
-        for (ExternalData dataset : datasetMap.values())
+        for (AbstractExternalData dataset : datasetMap.values())
         {
             if (dataset.getSample() != null)
             {
@@ -716,10 +716,10 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         }
     }
 
-    private static LongSet extractSampleIds(Long2ObjectMap<ExternalData> datasetMap)
+    private static LongSet extractSampleIds(Long2ObjectMap<AbstractExternalData> datasetMap)
     {
         LongSet ids = new LongOpenHashSet();
-        for (ExternalData dataset : datasetMap.values())
+        for (AbstractExternalData dataset : datasetMap.values())
         {
             if (dataset.getSample() != null)
             {
@@ -732,11 +732,11 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
 
     // assumes that the connection to experiment has been already established and experiment has the
     // id set.
-    private void enrichWithExperiments(Long2ObjectMap<ExternalData> datasetMap)
+    private void enrichWithExperiments(Long2ObjectMap<AbstractExternalData> datasetMap)
     {
         Long2ObjectMap<Experiment> experimentMap = new Long2ObjectOpenHashMap<Experiment>();
 
-        for (ExternalData dataset : datasetMap.values())
+        for (AbstractExternalData dataset : datasetMap.values())
         {
             long experimentId = dataset.getExperiment().getId();
             Experiment experiment = experimentMap.get(experimentId);
@@ -750,10 +750,10 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         }
     }
 
-    private void filterDatasetsWithNullExperiments(Long2ObjectMap<ExternalData> datasetMap)
+    private void filterDatasetsWithNullExperiments(Long2ObjectMap<AbstractExternalData> datasetMap)
     {
         LongSet datasetsToRemove = new LongOpenHashSet();
-        for (ExternalData dataset : datasetMap.values())
+        for (AbstractExternalData dataset : datasetMap.values())
         {
             if (dataset.getExperiment() == null)
             {
@@ -776,19 +776,19 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         return result;
     }
 
-    private void enrichWithProperties(final Long2ObjectMap<ExternalData> resultMap)
+    private void enrichWithProperties(final Long2ObjectMap<AbstractExternalData> resultMap)
     {
         propertiesEnricher.enrich(resultMap.keySet(), new IEntityPropertiesHolderResolver()
             {
                 @Override
-                public ExternalData get(long id)
+                public AbstractExternalData get(long id)
                 {
                     return resultMap.get(id);
                 }
             });
     }
 
-    private void enrichWithParents(Long2ObjectMap<ExternalData> datasetMap, boolean withProperties)
+    private void enrichWithParents(Long2ObjectMap<AbstractExternalData> datasetMap, boolean withProperties)
     {
         Map<Long, Set<Long>> parentIdsMap = listParentIds(datasetMap.keySet());
         Set<Long> allParentIds = new HashSet<Long>();
@@ -803,21 +803,21 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
 
         if (parentIterator != null)
         {
-            Long2ObjectMap<ExternalData> parentDatasetMap = withProperties ?
-                    new Long2ObjectOpenHashMap<ExternalData>() : null;
-            Long2ObjectMap<ExternalData> parentMap = createPrimaryDatasets(parentIterator);
+            Long2ObjectMap<AbstractExternalData> parentDatasetMap = withProperties ?
+                    new Long2ObjectOpenHashMap<AbstractExternalData>() : null;
+            Long2ObjectMap<AbstractExternalData> parentMap = createPrimaryDatasets(parentIterator);
 
             for (Entry<Long, Set<Long>> parentIdsEntry : parentIdsMap.entrySet())
             {
                 Long datasetId = parentIdsEntry.getKey();
                 Set<Long> parentIds = parentIdsEntry.getValue();
 
-                ExternalData dataset = datasetMap.get(datasetId);
-                List<ExternalData> parents = new ArrayList<ExternalData>();
+                AbstractExternalData dataset = datasetMap.get(datasetId);
+                List<AbstractExternalData> parents = new ArrayList<AbstractExternalData>();
 
                 for (Long parentId : parentIds)
                 {
-                    ExternalData parent = parentMap.get(parentId);
+                    AbstractExternalData parent = parentMap.get(parentId);
                     if (parent != null)
                     {
                         parents.add(parent);
@@ -837,7 +837,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         }
     }
 
-    private void enrichWithChildren(Long2ObjectMap<ExternalData> datasetMap, boolean withProperties)
+    private void enrichWithChildren(Long2ObjectMap<AbstractExternalData> datasetMap, boolean withProperties)
     {
         Map<Long, Set<Long>> childrenIdsMap = listChildrenIds(datasetMap.keySet());
         Set<Long> allChildrenIds = new HashSet<Long>();
@@ -852,21 +852,21 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
 
         if (childrenIterator != null)
         {
-            Long2ObjectMap<ExternalData> childrenDatasetMap = withProperties ?
-                    new Long2ObjectOpenHashMap<ExternalData>() : null;
-            Long2ObjectMap<ExternalData> childrenMap = createPrimaryDatasets(childrenIterator);
+            Long2ObjectMap<AbstractExternalData> childrenDatasetMap = withProperties ?
+                    new Long2ObjectOpenHashMap<AbstractExternalData>() : null;
+            Long2ObjectMap<AbstractExternalData> childrenMap = createPrimaryDatasets(childrenIterator);
 
             for (Entry<Long, Set<Long>> childrenIdsEntry : childrenIdsMap.entrySet())
             {
                 Long datasetId = childrenIdsEntry.getKey();
                 Set<Long> childrenIds = childrenIdsEntry.getValue();
 
-                ExternalData dataset = datasetMap.get(datasetId);
-                List<ExternalData> children = new ArrayList<ExternalData>();
+                AbstractExternalData dataset = datasetMap.get(datasetId);
+                List<AbstractExternalData> children = new ArrayList<AbstractExternalData>();
 
                 for (Long childId : childrenIds)
                 {
-                    ExternalData child = childrenMap.get(childId);
+                    AbstractExternalData child = childrenMap.get(childId);
                     if (child != null)
                     {
                         children.add(child);
@@ -885,11 +885,11 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         }
     }
 
-    private void enrichWithContainers(Long2ObjectMap<ExternalData> datasetMap)
+    private void enrichWithContainers(Long2ObjectMap<AbstractExternalData> datasetMap)
     {
 
         Set<Long> containersNotLoaded = new HashSet<Long>();
-        for (ExternalData dataSet : datasetMap.values())
+        for (AbstractExternalData dataSet : datasetMap.values())
         {
             ContainerDataSet containerOrNull = dataSet.tryGetContainer();
             Long containerId = (containerOrNull != null) ? containerOrNull.getId() : null;
@@ -909,11 +909,11 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         if (false == containersNotLoaded.isEmpty())
         {
             // load the unavailable container data sets with an additional query
-            List<ExternalData> containersSecondPass = listByDatasetIds(containersNotLoaded);
-            TableMap<Long, ExternalData> secondPassMap =
-                    new TableMap<Long, ExternalData>(containersSecondPass,
-                            KeyExtractorFactory.<ExternalData> createIdKeyExtractor());
-            for (ExternalData dataSet : datasetMap.values())
+            List<AbstractExternalData> containersSecondPass = listByDatasetIds(containersNotLoaded);
+            TableMap<Long, AbstractExternalData> secondPassMap =
+                    new TableMap<Long, AbstractExternalData>(containersSecondPass,
+                            KeyExtractorFactory.<AbstractExternalData> createIdKeyExtractor());
+            for (AbstractExternalData dataSet : datasetMap.values())
             {
                 ContainerDataSet containerOrNull = dataSet.tryGetContainer();
                 Long containerId = (containerOrNull != null) ? containerOrNull.getId() : null;
@@ -926,12 +926,12 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         }
     }
 
-    private void enrichWithContainedDataSets(Long2ObjectMap<ExternalData> datasetMap)
+    private void enrichWithContainedDataSets(Long2ObjectMap<AbstractExternalData> datasetMap)
     {
-        Long2ObjectMap<ExternalData> fullContextMap =
-                new Long2ObjectOpenHashMap<ExternalData>(datasetMap);
+        Long2ObjectMap<AbstractExternalData> fullContextMap =
+                new Long2ObjectOpenHashMap<AbstractExternalData>(datasetMap);
         LongSet containerIDs = new LongOpenHashSet();
-        for (ExternalData dataSet : datasetMap.values())
+        for (AbstractExternalData dataSet : datasetMap.values())
         {
             if (dataSet.isContainer())
             {
@@ -964,20 +964,20 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
 
         if (false == notYetLoadedChilren.isEmpty())
         {
-            Long2ObjectMap<ExternalData> childrenSecondPass =
+            Long2ObjectMap<AbstractExternalData> childrenSecondPass =
                     createPrimaryDatasets(asList(query.getDatasets(notYetLoadedChilren)));
             fullContextMap.putAll(childrenSecondPass);
         }
 
         for (Long id : containedDataSetIDs)
         {
-            ExternalData contained = fullContextMap.get(id);
+            AbstractExternalData contained = fullContextMap.get(id);
             Long containerId = contained.tryGetContainer().getId();
             ContainerDataSet container = fullContextMap.get(containerId).tryGetAsContainerDataSet();
             // set container to the child
             contained.setContainer(container);
             // add the child to the container
-            List<ExternalData> containedDataSets = container.getContainedDataSets();
+            List<AbstractExternalData> containedDataSets = container.getContainedDataSets();
             containedDataSets.add(contained);
             container.setContainedDataSets(containedDataSets);
         }
@@ -990,13 +990,13 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         return result;
     }
 
-    private Long2ObjectMap<ExternalData> createPrimaryDatasets(Iterable<DatasetRecord> records)
+    private Long2ObjectMap<AbstractExternalData> createPrimaryDatasets(Iterable<DatasetRecord> records)
     {
-        Long2ObjectMap<ExternalData> datasets = new Long2ObjectOpenHashMap<ExternalData>();
+        Long2ObjectMap<AbstractExternalData> datasets = new Long2ObjectOpenHashMap<AbstractExternalData>();
         for (DatasetRecord record : records)
         {
             DataSetType dsType = dataSetTypes.get(record.dsty_id);
-            ExternalData dataSetOrNull = null;
+            AbstractExternalData dataSetOrNull = null;
             if (record.is_placeholder)
             {
                 // placeholder data sets are filtered out
@@ -1021,7 +1021,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
     }
 
     // NOTE: this just marks the data set as invalid without loading any details
-    private void enrichWithDeletion(final ExternalData dataSet, DatasetRecord row)
+    private void enrichWithDeletion(final AbstractExternalData dataSet, DatasetRecord row)
     {
         if (row.del_id != null)
         {
@@ -1072,7 +1072,7 @@ public class DatasetLister extends AbstractLister implements IDatasetLister
         return linkDataSet;
     }
 
-    private void convertStandardAttributes(ExternalData dataSet, DatasetRecord record)
+    private void convertStandardAttributes(AbstractExternalData dataSet, DatasetRecord record)
     {
         dataSet.setCode(record.code);
         dataSet.setDataSetType(dataSetTypes.get(record.dsty_id));
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetLister.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetLister.java
index ae5423e69fb7e3b6a74cd0da7aef70a4f2a358fe..1a58ce649a9e33fb39baff09970a9b34e654808e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetLister.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/IDatasetLister.java
@@ -27,7 +27,7 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.common.GenericEntityP
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetFetchOption;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ArchiverDataSetCriteria;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocationNode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria;
@@ -45,26 +45,26 @@ public interface IDatasetLister
      * @param showOnlyDirectlyConnected whether to return only directly connected datasets, or also
      *            all descendants in dataset parent-child relationship hierarchy
      */
-    List<ExternalData> listByExperimentTechId(TechId experimentId, boolean showOnlyDirectlyConnected);
+    List<AbstractExternalData> listByExperimentTechId(TechId experimentId, boolean showOnlyDirectlyConnected);
 
     /**
      * @return datasets connected to the sample with the specified id
      * @param showOnlyDirectlyConnected whether to return only directly connected datasets, or also
      *            all descendants in dataset parent-child relationship hierarchy
      */
-    List<ExternalData> listBySampleTechId(TechId sampleId, boolean showOnlyDirectlyConnected);
+    List<AbstractExternalData> listBySampleTechId(TechId sampleId, boolean showOnlyDirectlyConnected);
 
     /** @return datasets that are parents of a dataset with the specified id */
-    List<ExternalData> listByChildTechId(TechId childDatasetId);
+    List<AbstractExternalData> listByChildTechId(TechId childDatasetId);
 
     /** @return datasets that are components of a dataset with the specified id */
-    List<ExternalData> listByContainerTechId(TechId containerDatasetId);
+    List<AbstractExternalData> listByContainerTechId(TechId containerDatasetId);
 
     /** @return all datasets that are children of any specified dataset id */
-    List<ExternalData> listByParentTechIds(Collection<Long> parentDatasetIds);
+    List<AbstractExternalData> listByParentTechIds(Collection<Long> parentDatasetIds);
 
     /** @return datasets connected to the metaproject with the specified id */
-    List<ExternalData> listByMetaprojectId(Long metaprojectId);
+    List<AbstractExternalData> listByMetaprojectId(Long metaprojectId);
 
     /**
      * Returns a map with all parent data set IDs of specified data set IDs. The keys of the map are
@@ -83,32 +83,32 @@ public interface IDatasetLister
      * the returned map. The returned data sets contains all derived data sets (children, grand
      * children, etc.).
      */
-    Map<Sample, List<ExternalData>> listAllDataSetsFor(List<Sample> samples);
+    Map<Sample, List<AbstractExternalData>> listAllDataSetsFor(List<Sample> samples);
 
     /**
      * Lists all data sets with specified codes.
      */
-    List<ExternalData> listByDatasetCode(Collection<String> datasetCodes);
+    List<AbstractExternalData> listByDatasetCode(Collection<String> datasetCodes);
 
     /**
      * @param datasetCodes Codes of datasets.
      * @param datasetFetchOptions The options of what datasets to fetch.
      *            Lists all data sets with specified codes.
      */
-    List<ExternalData> listByDatasetCode(Collection<String> datasetCodes,
+    List<AbstractExternalData> listByDatasetCode(Collection<String> datasetCodes,
             EnumSet<DataSetFetchOption> datasetFetchOptions);
 
     /**
      * Lists all physical data sets of specified data store.
      */
-    List<ExternalData> listByDataStore(long dataStoreID);
+    List<AbstractExternalData> listByDataStore(long dataStoreID);
 
     /**
      * Lists all physical data sets of specified data store.
      * 
      * @param datasetFetchOptions The options of what datasets to fetch.
      */
-    List<ExternalData> listByDataStore(long dataStoreID,
+    List<AbstractExternalData> listByDataStore(long dataStoreID,
             EnumSet<DataSetFetchOption> datasetFetchOptions);
 
     /**
@@ -116,7 +116,7 @@ public interface IDatasetLister
      * 
      * @param datasetFetchOptions The options of what datasets to fetch.
      */
-    public List<ExternalData> listByDataStore(long dataStoreID, int limit,
+    public List<AbstractExternalData> listByDataStore(long dataStoreID, int limit,
             EnumSet<DataSetFetchOption> datasetFetchOptions);
 
     /**
@@ -125,7 +125,7 @@ public interface IDatasetLister
      * 
      * @param datasetFetchOptions The options of what datasets to fetch.
      */
-    public List<ExternalData> listByDataStore(long dataStoreID, Date youngerThan, int limit,
+    public List<AbstractExternalData> listByDataStore(long dataStoreID, Date youngerThan, int limit,
             EnumSet<DataSetFetchOption> datasetFetchOptions);
 
     /**
@@ -134,31 +134,31 @@ public interface IDatasetLister
     List<DataSetShareId> listAllDataSetShareIdsByDataStore(long dataStoreID);
 
     /** @return datasets with given ids */
-    List<ExternalData> listByDatasetIds(Collection<Long> datasetIds);
+    List<AbstractExternalData> listByDatasetIds(Collection<Long> datasetIds);
 
     /**
      * @param datasetIds Database ids of datasets.
      * @param datasetFetchOptions The options of what datasets to fetch.
      * @return datasets with given ids
      */
-    List<ExternalData> listByDatasetIds(Collection<Long> datasetIds,
+    List<AbstractExternalData> listByDatasetIds(Collection<Long> datasetIds,
             EnumSet<DataSetFetchOption> datasetFetchOptions);
 
     /** @return datasets specified by given criteria */
-    List<ExternalData> listByTrackingCriteria(TrackingDataSetCriteria criteria);
+    List<AbstractExternalData> listByTrackingCriteria(TrackingDataSetCriteria criteria);
 
     /** @return datasets specified by given criteria */
-    List<ExternalData> listByArchiverCriteria(String dataStoreCode, ArchiverDataSetCriteria criteria);
+    List<AbstractExternalData> listByArchiverCriteria(String dataStoreCode, ArchiverDataSetCriteria criteria);
 
     /**
      * @return Datasets connected to the samples with the specified ids
      */
-    List<ExternalData> listBySampleIds(Collection<Long> sampleIds);
+    List<AbstractExternalData> listBySampleIds(Collection<Long> sampleIds);
 
     /**
      * @return Datasets connected to the samples with the specified ids
      */
-    List<ExternalData> listBySampleIds(Collection<Long> sampleIds,
+    List<AbstractExternalData> listBySampleIds(Collection<Long> sampleIds,
             EnumSet<DataSetFetchOption> datasetFetchOptions);
 
     /**
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/search/DataSetSearchManager.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/search/DataSetSearchManager.java
index 01b0a7986ddf2ce21d2eb74cb46625d507bb097a..6bba71fd731e1b6fe6c225c0402a5501769e0f68 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/search/DataSetSearchManager.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/search/DataSetSearchManager.java
@@ -33,7 +33,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriterion
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchField;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchSubCriteria;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DtoConverters;
 
 /**
@@ -96,7 +96,7 @@ public class DataSetSearchManager extends AbstractSearchManager<IDatasetLister>
         super(searchDAO, lister);
     }
 
-    public List<ExternalData> searchForDataSets(String userId, DetailedSearchCriteria criteria)
+    public List<AbstractExternalData> searchForDataSets(String userId, DetailedSearchCriteria criteria)
             throws DataAccessException
     {
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/task/DataSetRegistrationSummaryTask.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/task/DataSetRegistrationSummaryTask.java
index bfb235963370c114da657d382cbdf46a42d43447..dd656cbec21d0425296afc794ad431b65f56c191 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/task/DataSetRegistrationSummaryTask.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/task/DataSetRegistrationSummaryTask.java
@@ -49,7 +49,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriterion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchField;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SearchCriteriaConnection;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO;
@@ -272,9 +272,9 @@ public class DataSetRegistrationSummaryTask implements IMaintenanceTask
                     .createAttributeField(DataSetAttributeSearchFieldKind.DATA_SET_TYPE));
             criterion.setValue(dataSetType.getCode());
             criteria.setCriteria(Arrays.asList(criterion));
-            List<ExternalData> dataSets = server.searchForDataSets(sessionToken, criteria);
-            List<ExternalData> newDataSets = new ArrayList<ExternalData>();
-            for (ExternalData dataSet : dataSets)
+            List<AbstractExternalData> dataSets = server.searchForDataSets(sessionToken, criteria);
+            List<AbstractExternalData> newDataSets = new ArrayList<AbstractExternalData>();
+            for (AbstractExternalData dataSet : dataSets)
             {
                 long registrationTime = dataSet.getRegistrationDate().getTime();
                 if (startTime <= registrationTime && registrationTime < endTime)
@@ -282,10 +282,10 @@ public class DataSetRegistrationSummaryTask implements IMaintenanceTask
                     newDataSets.add(dataSet);
                 }
             }
-            Collections.sort(newDataSets, new Comparator<ExternalData>()
+            Collections.sort(newDataSets, new Comparator<AbstractExternalData>()
                 {
                     @Override
-                    public int compare(ExternalData d1, ExternalData d2)
+                    public int compare(AbstractExternalData d1, AbstractExternalData d2)
                     {
                         return d1.getCode().compareTo(d2.getCode());
                     }
@@ -317,7 +317,7 @@ public class DataSetRegistrationSummaryTask implements IMaintenanceTask
         return !includeDataSetType;
     }
 
-    private String createReport(DataSetType dataSetType, List<ExternalData> newDataSets,
+    private String createReport(DataSetType dataSetType, List<AbstractExternalData> newDataSets,
             int totalNumberOfDataSets)
     {
         Template template =
@@ -330,7 +330,7 @@ public class DataSetRegistrationSummaryTask implements IMaintenanceTask
         return template.createText();
     }
 
-    private String renderNewDataSets(List<ExternalData> newDataSets)
+    private String renderNewDataSets(List<AbstractExternalData> newDataSets)
     {
         StringBuilder builder = new StringBuilder();
         if (shownProperties.isEmpty())
@@ -341,7 +341,7 @@ public class DataSetRegistrationSummaryTask implements IMaintenanceTask
                 {
                     builder.append("\t");
                 }
-                ExternalData dataSet = newDataSets.get(i);
+                AbstractExternalData dataSet = newDataSets.get(i);
                 builder.append(dataSet.getCode());
                 if (i < n - 1)
                 {
@@ -357,7 +357,7 @@ public class DataSetRegistrationSummaryTask implements IMaintenanceTask
             Template noPropertiesTemplate = NEW_DATA_SET_TEMPLATE.createFreshCopy();
             Template withPropertiesTemplate =
                     NEW_DATA_SET_WITH_PROPERTIES_TEMPLATE.createFreshCopy();
-            for (ExternalData dataSet : newDataSets)
+            for (AbstractExternalData dataSet : newDataSets)
             {
                 String code = dataSet.getCode();
 
@@ -373,7 +373,7 @@ public class DataSetRegistrationSummaryTask implements IMaintenanceTask
         return builder.toString();
     }
 
-    private String getPropertiesToBeShown(ExternalData dataSet)
+    private String getPropertiesToBeShown(AbstractExternalData dataSet)
     {
         StringBuilder builder = new StringBuilder();
         Map<String, String> map = getPropertiesAsAMap(dataSet);
@@ -392,7 +392,7 @@ public class DataSetRegistrationSummaryTask implements IMaintenanceTask
         return builder.toString();
     }
 
-    private Map<String, String> getPropertiesAsAMap(ExternalData dataSet)
+    private Map<String, String> getPropertiesAsAMap(AbstractExternalData dataSet)
     {
         List<IEntityProperty> dataSetProperties = dataSet.getProperties();
         Map<String, String> map = new HashMap<String, String>(dataSetProperties.size());
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
index 887a5062a8dbf743e6ef8faa74934a14adefec2c..3a878e780b151e7067295b3c5749685452e59628 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
@@ -59,7 +59,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityValidationEvaluat
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdateResult;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 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.Grantee;
@@ -361,41 +361,41 @@ public interface ICommonServer extends IServer
             List<ExperimentIdentifier> experimentIdentifiers);
 
     /**
-     * For given sample {@link TechId} returns the corresponding list of {@link ExternalData}.
+     * For given sample {@link TechId} returns the corresponding list of {@link AbstractExternalData}.
      * 
-     * @return a sorted list of {@link ExternalData}.
+     * @return a sorted list of {@link AbstractExternalData}.
      */
     @Transactional(readOnly = true)
-    public List<ExternalData> listSampleExternalData(final String sessionToken,
+    public List<AbstractExternalData> listSampleExternalData(final String sessionToken,
             final TechId sampleId, final boolean showOnlyDirectlyConnected);
 
     /**
-     * For given experiment {@link TechId} returns the corresponding list of {@link ExternalData}.
+     * For given experiment {@link TechId} returns the corresponding list of {@link AbstractExternalData}.
      * 
-     * @return a sorted list of {@link ExternalData}.
+     * @return a sorted list of {@link AbstractExternalData}.
      */
     @Transactional(readOnly = true)
-    public List<ExternalData> listExperimentExternalData(final String sessionToken,
+    public List<AbstractExternalData> listExperimentExternalData(final String sessionToken,
             final TechId experimentId, boolean showOnlyDirectlyConnected);
 
     /**
      * For given metaproject {@link IMetaprojectId} returns the corresponding list of
-     * {@link ExternalData}.
+     * {@link AbstractExternalData}.
      * 
-     * @return a sorted list of {@link ExternalData}.
+     * @return a sorted list of {@link AbstractExternalData}.
      */
     @Transactional(readOnly = true)
-    public List<ExternalData> listMetaprojectExternalData(final String sessionToken,
+    public List<AbstractExternalData> listMetaprojectExternalData(final String sessionToken,
             final IMetaprojectId metaprojectId);
 
     /**
      * For given data set {@link TechId} in given relationship <var>role</var> returns corresponding
-     * list of {@link ExternalData}.
+     * list of {@link AbstractExternalData}.
      * 
-     * @return a sorted list of {@link ExternalData}.
+     * @return a sorted list of {@link AbstractExternalData}.
      */
     @Transactional(readOnly = true)
-    public List<ExternalData> listDataSetRelationships(final String sessionToken,
+    public List<AbstractExternalData> listDataSetRelationships(final String sessionToken,
             final TechId datasetId, final DataSetRelationshipRole role);
 
     /**
@@ -625,7 +625,7 @@ public interface ICommonServer extends IServer
      * Searches for data sets that fulfill the specified search criteria.
      */
     @Transactional(readOnly = true)
-    public List<ExternalData> searchForDataSets(String sessionToken, DetailedSearchCriteria criteria);
+    public List<AbstractExternalData> searchForDataSets(String sessionToken, DetailedSearchCriteria criteria);
 
     /**
      * Searches for samples that fulfill the specified search criteria. The search is executed on
@@ -633,14 +633,14 @@ public interface ICommonServer extends IServer
      * that user called the search method).
      */
     @Transactional(readOnly = true)
-    public List<ExternalData> searchForDataSetsOnBehalfOfUser(String sessionToken,
+    public List<AbstractExternalData> searchForDataSetsOnBehalfOfUser(String sessionToken,
             DetailedSearchCriteria criteria, String userId);
 
     /**
-     * For given {@link TechId} returns the corresponding {@link ExternalData}.
+     * For given {@link TechId} returns the corresponding {@link AbstractExternalData}.
      */
     @Transactional(readOnly = true)
-    public ExternalData getDataSetInfo(String sessionToken, TechId datasetId);
+    public AbstractExternalData getDataSetInfo(String sessionToken, TechId datasetId);
 
     /**
      * Saves changed data set.
@@ -659,14 +659,14 @@ public interface ICommonServer extends IServer
      * Returns all data sets related to specified entities.
      */
     @Transactional(readOnly = true)
-    public List<ExternalData> listRelatedDataSets(String sessionToken,
+    public List<AbstractExternalData> listRelatedDataSets(String sessionToken,
             DataSetRelatedEntities entities, boolean withDetails);
 
     /**
      * Returns all data sets related to specified entities on behalf of given user.
      */
     @Transactional(readOnly = true)
-    public List<ExternalData> listRelatedDataSetsOnBehalfOfUser(String sessionToken,
+    public List<AbstractExternalData> listRelatedDataSetsOnBehalfOfUser(String sessionToken,
             DataSetRelatedEntities entities, boolean withDetails, String userId);
 
     /**
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IDataStoreService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IDataStoreService.java
index 00ebb3c8cbf636bbbfb620743bf8df8baa8d9400..e5c3780753bbbebda8caa0f6bc6c30df61ff8519 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IDataStoreService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/IDataStoreService.java
@@ -23,7 +23,7 @@ import ch.systemsx.cisd.common.exceptions.InvalidAuthenticationException;
 import ch.systemsx.cisd.openbis.common.conversation.annotation.Conversational;
 import ch.systemsx.cisd.openbis.common.conversation.annotation.Progress;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CustomImportFile;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
@@ -74,7 +74,7 @@ public interface IDataStoreService
      * @throws InvalidAuthenticationException if <code>sessionToken</code> is invalid.
      */
     @Conversational(progress = Progress.AUTOMATIC)
-    public void uploadDataSetsToCIFEX(String sessionToken, List<ExternalData> dataSets,
+    public void uploadDataSetsToCIFEX(String sessionToken, List<AbstractExternalData> dataSets,
             DataSetUploadContext context) throws InvalidAuthenticationException;
 
     /**
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 c5569822e44fcf227a0c5eec5959ea726ee627a4..0a3b57e926d9320d92e9fd2d414677829169d775 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
@@ -41,7 +41,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentFetchOptions;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalDataManagementSystem;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocationNode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
@@ -180,21 +180,21 @@ public interface IETLLIMSService extends IServer, ISessionProvider
             throws UserFailureException;
 
     /**
-     * For given experiment {@link TechId} returns the corresponding list of {@link ExternalData}.
+     * For given experiment {@link TechId} returns the corresponding list of {@link AbstractExternalData}.
      * 
-     * @return a sorted list of {@link ExternalData}.
+     * @return a sorted list of {@link AbstractExternalData}.
      */
     @Transactional(readOnly = true)
-    public List<ExternalData> listDataSetsByExperimentID(final String sessionToken,
+    public List<AbstractExternalData> listDataSetsByExperimentID(final String sessionToken,
             final TechId experimentID) throws UserFailureException;
 
     /**
-     * For given sample {@link TechId} returns the corresponding list of {@link ExternalData}.
+     * For given sample {@link TechId} returns the corresponding list of {@link AbstractExternalData}.
      * 
-     * @return a sorted list of {@link ExternalData}.
+     * @return a sorted list of {@link AbstractExternalData}.
      */
     @Transactional(readOnly = true)
-    public List<ExternalData> listDataSetsBySampleID(final String sessionToken,
+    public List<AbstractExternalData> listDataSetsBySampleID(final String sessionToken,
             final TechId sampleId, final boolean showOnlyDirectlyConnected)
             throws UserFailureException;
 
@@ -204,7 +204,7 @@ public interface IETLLIMSService extends IServer, ISessionProvider
      * @return plain data sets without properties, samples, and experiments.
      */
     @Transactional(readOnly = true)
-    public List<ExternalData> listDataSetsByCode(String sessionToken, List<String> dataSetCodes)
+    public List<AbstractExternalData> listDataSetsByCode(String sessionToken, List<String> dataSetCodes)
             throws UserFailureException;
 
     /**
@@ -357,7 +357,7 @@ public interface IETLLIMSService extends IServer, ISessionProvider
      * Tries to return the data set specified by its code.
      */
     @Transactional(readOnly = true)
-    public ExternalData tryGetDataSet(String sessionToken, String dataSetCode)
+    public AbstractExternalData tryGetDataSet(String sessionToken, String dataSetCode)
             throws UserFailureException;
 
     /**
@@ -425,14 +425,14 @@ public interface IETLLIMSService extends IServer, ISessionProvider
      * List 'AVAILABLE' data sets (not locked) that match given criteria.
      */
     @Transactional(readOnly = true)
-    public List<ExternalData> listAvailableDataSets(String sessionToken, String dataStoreCode,
+    public List<AbstractExternalData> listAvailableDataSets(String sessionToken, String dataStoreCode,
             ArchiverDataSetCriteria criteria);
 
     /**
      * List data sets from specified store which are younger then the specified one.
      */
     @Transactional(readOnly = true)
-    public List<ExternalData> listDataSets(String sessionToken, String dataStoreCode,
+    public List<AbstractExternalData> listDataSets(String sessionToken, String dataStoreCode,
             TrackingDataSetCriteria criteria);
 
     /**
@@ -643,7 +643,7 @@ public interface IETLLIMSService extends IServer, ISessionProvider
      * @return A collection of data sets matching the search criteria.
      */
     @Transactional(readOnly = true)
-    public List<ExternalData> searchForDataSets(String sessionToken, SearchCriteria searchCriteria);
+    public List<AbstractExternalData> searchForDataSets(String sessionToken, SearchCriteria searchCriteria);
 
     /**
      * permanently deletes a list of data sets.
@@ -696,7 +696,7 @@ public interface IETLLIMSService extends IServer, ISessionProvider
      * Gets the list of all datasets, which are in the post-registration queue.
      */
     @Transactional
-    public List<ExternalData> listDataSetsForPostRegistration(String token, String dataStoreCode);
+    public List<AbstractExternalData> listDataSetsForPostRegistration(String token, String dataStoreCode);
 
     /**
      * Return true if the log indicates that the performEntityOperations invocation for the given
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ITrackingServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ITrackingServer.java
index c9186c8119920a5ce39328ab24e7d24565f6eb7e..864fdbed9e7b4e21cda204e9615ece194c915aa3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ITrackingServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ITrackingServer.java
@@ -21,7 +21,7 @@ import java.util.List;
 import org.springframework.transaction.annotation.Transactional;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingDataSetCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TrackingSampleCriteria;
@@ -43,12 +43,12 @@ public interface ITrackingServer extends IServer
     public List<Sample> listSamples(final String sessionToken, final TrackingSampleCriteria criteria);
 
     /**
-     * For given sample {@link TechId} returns the corresponding list of {@link ExternalData}.
+     * For given sample {@link TechId} returns the corresponding list of {@link AbstractExternalData}.
      * 
-     * @return a sorted list of {@link ExternalData}.
+     * @return a sorted list of {@link AbstractExternalData}.
      */
     @Transactional(readOnly = true)
-    public List<ExternalData> listDataSets(final String sessionToken,
+    public List<AbstractExternalData> listDataSets(final String sessionToken,
             final TrackingDataSetCriteria criteria);
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/Translator.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/Translator.java
index 543c1736c9c3f6d999b45660533a200779c2a4f0..8b1b19a0dc746eda102ebdf566f6469e640c496f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/Translator.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/Translator.java
@@ -60,7 +60,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CodeWithRegistration;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CodeWithRegistrationAndModificationDate;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSetUrl;
@@ -336,18 +336,18 @@ public class Translator
     }
 
     /**
-     * Translates specified iterable collection of {@link ExternalData} into a list of
+     * Translates specified iterable collection of {@link AbstractExternalData} into a list of
      * {@link DataSet} instance.
      * 
      * @param connectionsToGet Set of data set connections which should also be translated. This
-     *            assumes that the {@link ExternalData} instances are populated with these
+     *            assumes that the {@link AbstractExternalData} instances are populated with these
      *            connections.
      */
-    public static List<DataSet> translate(Iterable<ExternalData> dataSets,
+    public static List<DataSet> translate(Iterable<AbstractExternalData> dataSets,
             EnumSet<Connections> connectionsToGet)
     {
         ArrayList<DataSet> translated = new ArrayList<DataSet>();
-        for (ExternalData dataSet : dataSets)
+        for (AbstractExternalData dataSet : dataSets)
         {
             translated.add(translate(dataSet, connectionsToGet));
         }
@@ -355,28 +355,28 @@ public class Translator
     }
 
     /**
-     * Translates the specified {@link ExternalData} instance into a {@link DataSet} instance.
+     * Translates the specified {@link AbstractExternalData} instance into a {@link DataSet} instance.
      * 
      * @param connectionsToGet Set of data set connections which should also be translated. This
-     *            assumes that the {@link ExternalData} instance is populated with these
+     *            assumes that the {@link AbstractExternalData} instance is populated with these
      *            connections.
      */
-    public static DataSet translate(ExternalData externalDatum,
+    public static DataSet translate(AbstractExternalData externalDatum,
             EnumSet<Connections> connectionsToGet)
     {
         return translate(externalDatum, connectionsToGet, true);
     }
 
     /**
-     * Translates the specified {@link ExternalData} instance into a {@link DataSet} instance.
+     * Translates the specified {@link AbstractExternalData} instance into a {@link DataSet} instance.
      * 
      * @param connectionsToGet Set of data set connections which should also be translated. This
-     *            assumes that the {@link ExternalData} instance is populated with these
+     *            assumes that the {@link AbstractExternalData} instance is populated with these
      *            connections.
      * @param doRecurseIntoContainedDataSets If <code>true</code>, the translation will recurse into
      *            contained dataset, if <code>false</code>, contained datasets will not be set.
      */
-    private static DataSet translate(ExternalData externalDatum,
+    private static DataSet translate(AbstractExternalData externalDatum,
             EnumSet<Connections> connectionsToGet, boolean doRecurseIntoContainedDataSets)
     {
         DataSetInitializer initializer = new DataSetInitializer();
@@ -413,7 +413,7 @@ public class Translator
 
             ArrayList<DataSet> containedDataSets =
                     new ArrayList<DataSet>(containerDataSet.getContainedDataSets().size());
-            for (ExternalData containedDataSet : containerDataSet.getContainedDataSets())
+            for (AbstractExternalData containedDataSet : containerDataSet.getContainedDataSets())
             {
                 containedDataSets.add(translate(containedDataSet, connectionsToGet, true));
             }
@@ -436,18 +436,18 @@ public class Translator
             switch (connection)
             {
                 case PARENTS:
-                    Collection<ExternalData> parents = externalDatum.getParents();
+                    Collection<AbstractExternalData> parents = externalDatum.getParents();
                     ArrayList<String> parentCodes = new ArrayList<String>();
-                    for (ExternalData parentDatum : nullSafe(parents))
+                    for (AbstractExternalData parentDatum : nullSafe(parents))
                     {
                         parentCodes.add(parentDatum.getCode());
                     }
                     initializer.setParentCodes(parentCodes);
                     break;
                 case CHILDREN:
-                    Collection<ExternalData> children = externalDatum.getChildren();
+                    Collection<AbstractExternalData> children = externalDatum.getChildren();
                     ArrayList<String> childrenCodes = new ArrayList<String>();
-                    for (ExternalData parentDatum : nullSafe(children))
+                    for (AbstractExternalData parentDatum : nullSafe(children))
                     {
                         childrenCodes.add(parentDatum.getCode());
                     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalData.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExternalData.java
similarity index 92%
rename from openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalData.java
rename to openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExternalData.java
index e5105c90cc74cb44314a6662008fd081970dac58..1ab733bf213e02cdb30677ea1097a54160348506 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalData.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/AbstractExternalData.java
@@ -33,7 +33,8 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.ITaggable;
  * 
  * @author Christian Ribeaud
  */
-public abstract class ExternalData extends CodeWithRegistrationAndModificationDate<ExternalData>
+public abstract class AbstractExternalData extends
+        CodeWithRegistrationAndModificationDate<AbstractExternalData>
         implements IEntityWithDeletionInformation, IEntityInformationHolderWithProperties,
         IIdAndCodeHolder, IPermIdHolder, IIsStub, ITaggable
 {
@@ -43,7 +44,7 @@ public abstract class ExternalData extends CodeWithRegistrationAndModificationDa
      * {@link Comparator} for data sets contained in a (virtual) container which uses ascending
      * order in container.
      */
-    public static final Comparator<ExternalData> DATA_SET_COMPONENTS_COMPARATOR =
+    public static final Comparator<AbstractExternalData> DATA_SET_COMPONENTS_COMPARATOR =
             new DataSetComponentsComparator();
 
     private boolean derived;
@@ -60,7 +61,7 @@ public abstract class ExternalData extends CodeWithRegistrationAndModificationDa
 
     private String producerCode;
 
-    private Collection<ExternalData> parents;
+    private Collection<AbstractExternalData> parents;
 
     private Long size;
 
@@ -72,7 +73,7 @@ public abstract class ExternalData extends CodeWithRegistrationAndModificationDa
 
     private SampleType sampleType;
 
-    private Collection<ExternalData> children;
+    private Collection<AbstractExternalData> children;
 
     private List<IEntityProperty> dataSetProperties;
 
@@ -90,7 +91,7 @@ public abstract class ExternalData extends CodeWithRegistrationAndModificationDa
 
     private Collection<Metaproject> metaprojects;
 
-    public ExternalData(boolean isStub)
+    public AbstractExternalData(boolean isStub)
     {
         this.isStub = isStub;
     }
@@ -208,12 +209,12 @@ public abstract class ExternalData extends CodeWithRegistrationAndModificationDa
         this.sampleType = sampleType;
     }
 
-    public Collection<ExternalData> getChildren()
+    public Collection<AbstractExternalData> getChildren()
     {
         return children;
     }
 
-    public void setChildren(Collection<ExternalData> children)
+    public void setChildren(Collection<AbstractExternalData> children)
     {
         this.children = children;
     }
@@ -258,12 +259,12 @@ public abstract class ExternalData extends CodeWithRegistrationAndModificationDa
         this.producerCode = producerCode;
     }
 
-    public Collection<ExternalData> getParents()
+    public Collection<AbstractExternalData> getParents()
     {
         return parents;
     }
 
-    public void setParents(Collection<ExternalData> parents)
+    public void setParents(Collection<AbstractExternalData> parents)
     {
         this.parents = parents;
     }
@@ -417,10 +418,11 @@ public abstract class ExternalData extends CodeWithRegistrationAndModificationDa
         return this.isStub;
     }
 
-    private static final class DataSetComponentsComparator implements Comparator<ExternalData>
+    private static final class DataSetComponentsComparator implements
+            Comparator<AbstractExternalData>
     {
         @Override
-        public int compare(ExternalData o1, ExternalData o2)
+        public int compare(AbstractExternalData o1, AbstractExternalData o2)
         {
             Integer order1 = o1.getOrderInContainer();
             Integer order2 = o2.getOrderInContainer();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ContainerDataSet.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ContainerDataSet.java
index d041b75931522bd58d6460567eca9fffe8a07183..2b4ac7180645dff69af4750c3b3cf5b1d13d9af2 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ContainerDataSet.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ContainerDataSet.java
@@ -25,11 +25,11 @@ import java.util.List;
  * 
  * @author Kaloyan Enimanev
  */
-public class ContainerDataSet extends ExternalData
+public class ContainerDataSet extends AbstractExternalData
 {
     private static final long serialVersionUID = ServiceVersionHolder.VERSION;
 
-    private List<ExternalData> containedDataSets = new ArrayList<ExternalData>();
+    private List<AbstractExternalData> containedDataSets = new ArrayList<AbstractExternalData>();
 
     public ContainerDataSet()
     {
@@ -59,12 +59,12 @@ public class ContainerDataSet extends ExternalData
         return DataSetKind.CONTAINER;
     }
 
-    public List<ExternalData> getContainedDataSets()
+    public List<AbstractExternalData> getContainedDataSets()
     {
         return containedDataSets;
     }
 
-    public void setContainedDataSets(List<ExternalData> containedDataSets)
+    public void setContainedDataSets(List<AbstractExternalData> containedDataSets)
     {
         this.containedDataSets = containedDataSets;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DatastoreServiceDescription.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DatastoreServiceDescription.java
index f6dbf33f77c5a9aab88d71cceea00aaa625d832a..a1c4785c9aaf95d4158502ae0302da4a401b156c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DatastoreServiceDescription.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/DatastoreServiceDescription.java
@@ -161,7 +161,7 @@ public class DatastoreServiceDescription implements IReportInformationProvider,
         return sb.toString();
     }
 
-    public static boolean isMatching(DatastoreServiceDescription service, ExternalData dataset)
+    public static boolean isMatching(DatastoreServiceDescription service, AbstractExternalData dataset)
     {
         return service.getDatastoreCode().equals(dataset.getDataStore().getCode())
                 && (Arrays.asList(service.getDatasetTypeCodes())).contains(dataset.getDataSetType()
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalDataLocationNode.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalDataLocationNode.java
index af4cd6fe99971d20b3f2cf3f4ae4c04bed18ca97..73772f8db3554a152dfb8071d4dd0085290917df 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalDataLocationNode.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/ExternalDataLocationNode.java
@@ -22,7 +22,7 @@ import java.util.List;
 import java.util.TreeMap;
 
 /**
- * Implementation of {@link IDatasetLocationNode} that uses {@link ExternalData} object as a source
+ * Implementation of {@link IDatasetLocationNode} that uses {@link AbstractExternalData} object as a source
  * of data set locations.
  * 
  * @author pkupczyk
@@ -30,9 +30,9 @@ import java.util.TreeMap;
 public class ExternalDataLocationNode implements IDatasetLocationNode
 {
 
-    private ExternalData externalData;
+    private AbstractExternalData externalData;
 
-    public ExternalDataLocationNode(ExternalData externalData)
+    public ExternalDataLocationNode(AbstractExternalData externalData)
     {
         if (externalData == null)
         {
@@ -69,14 +69,14 @@ public class ExternalDataLocationNode implements IDatasetLocationNode
         }
 
         ContainerDataSet container = externalData.tryGetAsContainerDataSet();
-        List<ExternalData> containedExternalDatas = container.getContainedDataSets();
+        List<AbstractExternalData> containedExternalDatas = container.getContainedDataSets();
 
         if (containedExternalDatas != null)
         {
             TreeMap<String, IDatasetLocationNode> containedLocationNodes =
                     new TreeMap<String, IDatasetLocationNode>();
 
-            for (ExternalData containedExternalData : containedExternalDatas)
+            for (AbstractExternalData containedExternalData : containedExternalDatas)
             {
                 containedLocationNodes.put(containedExternalData.getCode(),
                         new ExternalDataLocationNode(containedExternalData));
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/LinkDataSet.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/LinkDataSet.java
index f68712a0c6e81afeed90c1d2d53b6311e04b9185..fdb8d700c2a15f94b5f68fe6fa9450a25ced4f80 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/LinkDataSet.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/LinkDataSet.java
@@ -22,7 +22,7 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
  * 
  * @author Pawel Glyzewski
  */
-public class LinkDataSet extends ExternalData
+public class LinkDataSet extends AbstractExternalData
 {
     private static final long serialVersionUID = ServiceVersionHolder.VERSION;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/MetaprojectAssignments.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/MetaprojectAssignments.java
index dfc42f9605e136d972a63c439e886fd5018b21d2..195a23a093975f70ff31f77f26f2f90b11d8e8db 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/MetaprojectAssignments.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/MetaprojectAssignments.java
@@ -32,7 +32,7 @@ public class MetaprojectAssignments implements Serializable
 
     private List<Sample> samples;
 
-    private List<ExternalData> dataSets;
+    private List<AbstractExternalData> dataSets;
 
     private List<Material> materials;
 
@@ -66,12 +66,12 @@ public class MetaprojectAssignments implements Serializable
         this.samples = samples;
     }
 
-    public List<ExternalData> getDataSets()
+    public List<AbstractExternalData> getDataSets()
     {
         return dataSets;
     }
 
-    public void setDataSets(List<ExternalData> dataSets)
+    public void setDataSets(List<AbstractExternalData> dataSets)
     {
         this.dataSets = dataSets;
     }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/PhysicalDataSet.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/PhysicalDataSet.java
index d4b9e96063a673e358ccac1b0efe1c4a02d87e4e..6cb827a4481e152f0fd12c0fef555f441d1b7b22 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/PhysicalDataSet.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/PhysicalDataSet.java
@@ -21,7 +21,7 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
  * 
  * @author Kaloyan Enimanev
  */
-public class PhysicalDataSet extends ExternalData implements IDatasetLocation
+public class PhysicalDataSet extends AbstractExternalData implements IDatasetLocation
 {
     private static final long serialVersionUID = ServiceVersionHolder.VERSION;
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/PlaceholderDataSet.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/PlaceholderDataSet.java
index 0419b04b310f79f7b4c8c7dfc0be2660f9a627f8..8f60c031c067cb1b6cda8512f1a6da7a4a03becc 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/PlaceholderDataSet.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/PlaceholderDataSet.java
@@ -22,7 +22,7 @@ package ch.systemsx.cisd.openbis.generic.shared.basic.dto;
  * 
  * @author Kaloyan Enimanev
  */
-public class PlaceholderDataSet extends ExternalData
+public class PlaceholderDataSet extends AbstractExternalData
 {
 
     private static final long serialVersionUID = 1L;
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 5ec858003e0776c3b321055f92d99acebc7850fa..743a279802f3db2737df5a53f5b983813e5113ef 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
@@ -34,7 +34,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
@@ -67,7 +67,7 @@ public class DataSetTranslator
     {
     }
 
-    public static DatasetDescription translateToDescription(ExternalData data)
+    public static DatasetDescription translateToDescription(AbstractExternalData data)
     {
         DatasetDescription description = new DatasetDescription();
         description.setDataSetCode(data.getCode());
@@ -127,15 +127,15 @@ public class DataSetTranslator
         return description;
     }
 
-    public static List<ExternalData> translate(List<? extends DataPE> list,
+    public static List<AbstractExternalData> translate(List<? extends DataPE> list,
             String defaultDataStoreBaseURL, String baseIndexURL,
             Map<Long, Set<Metaproject>> metaprojects,
             IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        ArrayList<ExternalData> result = new ArrayList<ExternalData>(list.size());
+        ArrayList<AbstractExternalData> result = new ArrayList<AbstractExternalData>(list.size());
         for (DataPE dataPE : list)
         {
-            ExternalData data =
+            AbstractExternalData data =
                     translate(dataPE, baseIndexURL, true, metaprojects.get(dataPE.getId()),
                             managedPropertyEvaluatorFactory,
                             ExperimentTranslator.LoadableFields.PROPERTIES);
@@ -144,9 +144,9 @@ public class DataSetTranslator
         return result;
     }
 
-    public static ExternalData translateWithoutRevealingData(ExternalData data)
+    public static AbstractExternalData translateWithoutRevealingData(AbstractExternalData data)
     {
-        ExternalData externalData = null;
+        AbstractExternalData externalData = null;
 
         if (data.isContainer())
         {
@@ -166,9 +166,9 @@ public class DataSetTranslator
         return externalData;
     }
 
-    public static ExternalData translateWithoutRevealingData(DataPE dataPE)
+    public static AbstractExternalData translateWithoutRevealingData(DataPE dataPE)
     {
-        ExternalData externalData = null;
+        AbstractExternalData externalData = null;
         if (dataPE.isContainer())
         {
             externalData = new ContainerDataSet(true);
@@ -191,7 +191,7 @@ public class DataSetTranslator
         return externalData;
     }
 
-    public static ExternalData translate(DataPE dataPE, String baseIndexURL,
+    public static AbstractExternalData translate(DataPE dataPE, String baseIndexURL,
             Collection<Metaproject> metaprojects,
             IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory,
             final LoadableFields... withExperimentFields)
@@ -200,12 +200,12 @@ public class DataSetTranslator
                 withExperimentFields);
     }
 
-    public static ExternalData translate(DataPE dataPE, String baseIndexURL, boolean withDetails,
+    public static AbstractExternalData translate(DataPE dataPE, String baseIndexURL, boolean withDetails,
             Collection<Metaproject> metaprojects,
             IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory,
             final LoadableFields... withExperimentFields)
     {
-        ExternalData externalData = null;
+        AbstractExternalData externalData = null;
         if (dataPE.isContainer())
         {
             externalData =
@@ -236,7 +236,7 @@ public class DataSetTranslator
         externalData.setDerived(dataPE.isDerived());
         externalData.setContainer(tryToTranslateContainer(dataPE.getContainer(), baseIndexURL,
                 managedPropertyEvaluatorFactory));
-        final Collection<ExternalData> parents = new HashSet<ExternalData>();
+        final Collection<AbstractExternalData> parents = new HashSet<AbstractExternalData>();
         externalData.setParents(parents);
         for (DataPE parentPE : dataPE.getParents())
         {
@@ -272,7 +272,7 @@ public class DataSetTranslator
                 baseIndexURL, false, null, managedPropertyEvaluatorFactory) : null;
     }
 
-    private static ExternalData translateContainerDataSetProperties(DataPE dataPE,
+    private static AbstractExternalData translateContainerDataSetProperties(DataPE dataPE,
             String baseIndexURL, boolean withComponents,
             IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
@@ -297,7 +297,7 @@ public class DataSetTranslator
         return linkDataSet;
     }
 
-    private static ExternalData translateDataSetProperties(ExternalDataPE externalDataPE)
+    private static AbstractExternalData translateDataSetProperties(ExternalDataPE externalDataPE)
     {
         PhysicalDataSet dataSet = new PhysicalDataSet();
         dataSet.setSize(externalDataPE.getSize());
@@ -313,7 +313,7 @@ public class DataSetTranslator
         return dataSet;
     }
 
-    private static void setProperties(DataPE dataPE, ExternalData externalData,
+    private static void setProperties(DataPE dataPE, AbstractExternalData externalData,
             IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
         if (HibernateUtils.isInitialized(dataPE.getProperties()))
@@ -349,9 +349,9 @@ public class DataSetTranslator
         return sample;
     }
 
-    private static void setChildren(DataPE dataPE, ExternalData externalData)
+    private static void setChildren(DataPE dataPE, AbstractExternalData externalData)
     {
-        List<ExternalData> children = new ArrayList<ExternalData>();
+        List<AbstractExternalData> children = new ArrayList<AbstractExternalData>();
         if (HibernateUtils.isInitialized(dataPE.getChildRelationships()))
         {
             for (DataPE childPE : dataPE.getChildren())
@@ -365,7 +365,7 @@ public class DataSetTranslator
     private static void setContainedDataSets(DataPE dataPE, ContainerDataSet containerDataSet,
             String baseIndexURL, IManagedPropertyEvaluatorFactory managedPropertyEvaluatorFactory)
     {
-        List<ExternalData> containedDataSets = new ArrayList<ExternalData>();
+        List<AbstractExternalData> containedDataSets = new ArrayList<AbstractExternalData>();
         if (HibernateUtils.isInitialized(dataPE.getContainedDataSets()))
         {
             for (DataPE childPE : dataPE.getContainedDataSets())
@@ -381,9 +381,9 @@ public class DataSetTranslator
      * Creates an <var>externalData</var> from <var>dataPE</vra> an fills it with all data needed by
      * {@link IEntityInformationHolder}.
      */
-    public static ExternalData translateBasicProperties(DataPE dataPE)
+    public static AbstractExternalData translateBasicProperties(DataPE dataPE)
     {
-        ExternalData result = null;
+        AbstractExternalData result = null;
         if (dataPE.isContainer())
         {
             result = new ContainerDataSet();
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SimpleDataSetHelper.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SimpleDataSetHelper.java
index cb1ccd94c26ab7a711e9907c43e911e57e5d2efa..458fe051ef741bba34414464125603ec12c519e0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SimpleDataSetHelper.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/translator/SimpleDataSetHelper.java
@@ -20,7 +20,7 @@ import java.util.ArrayList;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatasetDescription;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SimpleDataSetInformationDTO;
 
@@ -35,14 +35,14 @@ public class SimpleDataSetHelper
      * filters out all non-file datasets and applies translation on the remaining datasets
      */
     public static final List<SimpleDataSetInformationDTO> filterAndTranslate(
-            List<ExternalData> externalData)
+            List<AbstractExternalData> externalData)
     {
         if (externalData == null)
         {
             return null;
         }
         List<SimpleDataSetInformationDTO> result = new ArrayList<SimpleDataSetInformationDTO>();
-        for (ExternalData ed : externalData)
+        for (AbstractExternalData ed : externalData)
         {
             if (ed instanceof PhysicalDataSet)
             {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientService.java
index bdd13b1c66fe9111e196872815efb516d7493ff7..2c2a4d50d5239bf438d3724f38b4349d1ba44a1d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientService.java
@@ -30,7 +30,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdates;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
@@ -111,9 +111,9 @@ public interface IGenericClientService extends IClientService
             final String sessionKey) throws UserFailureException;
 
     /**
-     * For given {@link TechId} returns corresponding {@link ExternalData}.
+     * For given {@link TechId} returns corresponding {@link AbstractExternalData}.
      */
-    public ExternalData getDataSetInfo(final TechId datasetId) throws UserFailureException;
+    public AbstractExternalData getDataSetInfo(final TechId datasetId) throws UserFailureException;
 
     /**
      * Registers a new experiment.
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientServiceAsync.java
index 5466f32472123b1a0c8bec8e390da5ac367d7fc0..e4c94dd9c02295331457f1542a6a1f35a6338ea5 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/IGenericClientServiceAsync.java
@@ -32,7 +32,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdates;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
@@ -93,7 +93,7 @@ public interface IGenericClientServiceAsync extends IClientServiceAsync
      * @see IGenericClientService#getDataSetInfo(TechId)
      */
     public void getDataSetInfo(TechId datasetTechId,
-            final AsyncCallback<ExternalData> datasetInfoCallback);
+            final AsyncCallback<AbstractExternalData> datasetInfoCallback);
 
     /**
      * @see IGenericClientService#registerExperiment(String,String,NewExperiment)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetChildrenSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetChildrenSection.java
index 370116b75b2d499c92df0b87f4fcd7b1faef3bda..a834367355e1480f07c523c9ad00e54bdac8373c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetChildrenSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetChildrenSection.java
@@ -21,16 +21,16 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelationshipRole;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * @author Piotr Buczek
  */
 class DataSetChildrenSection extends AbstractDataSetsSection
 {
-    private final ExternalData dataset;
+    private final AbstractExternalData dataset;
 
-    DataSetChildrenSection(IViewContext<?> viewContext, ExternalData dataset)
+    DataSetChildrenSection(IViewContext<?> viewContext, AbstractExternalData dataset)
     {
         super("Children (Data Sets)", viewContext, dataset);
         this.dataset = dataset;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetContainedSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetContainedSection.java
index c24f229ce0f2f84c9e6e17b22ed6f082f2785d6a..256239450fe9ca29280f645488958fd1cde01b21 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetContainedSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetContainedSection.java
@@ -21,16 +21,16 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelationshipRole;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * @author Piotr Buczek
  */
 class DataSetContainedSection extends AbstractDataSetsSection
 {
-    private final ExternalData dataset;
+    private final AbstractExternalData dataset;
 
-    DataSetContainedSection(IViewContext<?> viewContext, ExternalData dataset)
+    DataSetContainedSection(IViewContext<?> viewContext, AbstractExternalData dataset)
     {
         super("Contained (Data Sets)", viewContext, dataset);
         this.dataset = dataset;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetParentsSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetParentsSection.java
index 26592ba9aa0b5be58132c774e9b66809b8574374..e9f42ef2a9fa9ead82e03e098b3cc0bb8ab9d1ba 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetParentsSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetParentsSection.java
@@ -21,16 +21,16 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelationshipRole;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * @author Piotr Buczek
  */
 class DataSetParentsSection extends AbstractDataSetsSection
 {
-    private final ExternalData dataset;
+    private final AbstractExternalData dataset;
 
-    DataSetParentsSection(IViewContext<?> viewContext, ExternalData dataset)
+    DataSetParentsSection(IViewContext<?> viewContext, AbstractExternalData dataset)
     {
         super("Parents (Data Sets)", viewContext, dataset);
         this.dataset = dataset;
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 3ee94de8a93ba5b2fb41c28e61d01fefb523bad2..0ef8ffa5e29a8ff28e39bd3471c38805715c8f49 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
@@ -33,7 +33,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.PropertiesPanelUtils;
 
@@ -47,11 +47,11 @@ public class DataSetPropertiesPanel extends ContentPanel
     public static final String PROPERTIES_ID_PREFIX = GenericConstants.ID_PREFIX
             + "dataset-properties-section_";
 
-    private final ExternalData dataset;
+    private final AbstractExternalData dataset;
 
     private final IViewContext<?> viewContext;
 
-    public DataSetPropertiesPanel(final ExternalData dataset, final IViewContext<?> viewContext)
+    public DataSetPropertiesPanel(final AbstractExternalData dataset, final IViewContext<?> viewContext)
     {
         setHeading("Data Set Properties");
         this.dataset = dataset;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetRelationshipBrowser.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetRelationshipBrowser.java
index 12ec3edfeb52f89cdb0b9cadef77b3b36d0f1a4f..9beea2bbf300acce366f9363931da3318f0ea5f9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetRelationshipBrowser.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataSetRelationshipBrowser.java
@@ -28,7 +28,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSe
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetRelationshipRole;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
@@ -87,8 +87,8 @@ public class DataSetRelationshipBrowser extends AbstractExternalDataGrid
 
     @Override
     protected void listTableRows(
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
-            AbstractAsyncCallback<TypedTableResultSet<ExternalData>> callback)
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> resultSetConfig,
+            AbstractAsyncCallback<TypedTableResultSet<AbstractExternalData>> callback)
     {
         viewContext.getService().listDataSetRelationships(datasetId, role, resultSetConfig,
                 callback);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataViewSection.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataViewSection.java
index 440cc4c70a1de988e63d207aee4567880059c8b7..548cdd13e1784224fa971d94d8b894ea168e6859 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataViewSection.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/dataset/DataViewSection.java
@@ -48,7 +48,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailViewConfiguration;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ReportingPluginType;
 
@@ -66,11 +66,11 @@ public class DataViewSection extends TabContent
 
     private static String FILES_HOME_VIEW = "Files (Home)";
 
-    private final ExternalData dataset;
+    private final AbstractExternalData dataset;
 
     private IDisposableComponent currentReportOrNull = null;
 
-    public DataViewSection(final IViewContext<?> viewContext, final ExternalData dataset)
+    public DataViewSection(final IViewContext<?> viewContext, final AbstractExternalData dataset)
     {
         super(viewContext.getMessage(Dict.DATA_VIEW), viewContext, dataset);
         this.dataset = dataset;
@@ -247,7 +247,7 @@ public class DataViewSection extends TabContent
 
         private final IViewContext<?> viewContext;
 
-        private final ExternalData dataset;
+        private final AbstractExternalData dataset;
 
         private DatastoreServiceDescriptionModel defaultModel;
 
@@ -256,7 +256,7 @@ public class DataViewSection extends TabContent
         private final boolean hideSmartView;
 
         public DatastoreServiceSelectionWidget(final IViewContext<?> viewContext,
-                final ExternalData dataset, boolean hideFileView, boolean hideSmartView)
+                final AbstractExternalData dataset, boolean hideFileView, boolean hideSmartView)
         {
             super(viewContext, ("data-set_" + dataset.getCode() + "_viewer"), Dict.BUTTON_SHOW,
                     ModelDataPropertyNames.LABEL, "viewer", "viewers");
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 8709d7a66fb1c18be6dff0a30e22ebd985acae21..659a5e6399b04972ad9819d5c9e79b876b7665a4 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
@@ -61,7 +61,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 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.AbstractExternalData;
 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.generic.shared.basic.dto.api.IManagedInputWidgetDescription;
@@ -96,7 +96,7 @@ public final class GenericDataSetEditForm extends
 
     //
 
-    private ExternalData originalDataSet;
+    private AbstractExternalData originalDataSet;
 
     private IDataSetEditorBuilder builder;
 
@@ -310,7 +310,7 @@ public final class GenericDataSetEditForm extends
     {
         // not best performance but the same solution that is done for experiments
         // only codes are needed but we extract 'full' object
-        DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> config =
+        DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> config =
                 DefaultResultSetConfig.createFetchAll();
         viewContext.getCommonService().listDataSetRelationships(techIdOrNull,
                 DataSetRelationshipRole.CHILD, config, new ListParentsCallback(viewContext));
@@ -331,7 +331,7 @@ public final class GenericDataSetEditForm extends
         FieldUtil.setVisibility(connectedWithSample == false, experimentChooser.getField());
     }
 
-    private void setOriginalData(ExternalData data)
+    private void setOriginalData(AbstractExternalData data)
     {
         this.originalDataSet = data;
 
@@ -354,17 +354,17 @@ public final class GenericDataSetEditForm extends
 
     }
 
-    private List<ExternalData> extractDataSets(List<TableModelRowWithObject<ExternalData>> rows)
+    private List<AbstractExternalData> extractDataSets(List<TableModelRowWithObject<AbstractExternalData>> rows)
     {
-        List<ExternalData> dataSets = new ArrayList<ExternalData>();
-        for (TableModelRowWithObject<ExternalData> row : rows)
+        List<AbstractExternalData> dataSets = new ArrayList<AbstractExternalData>();
+        for (TableModelRowWithObject<AbstractExternalData> row : rows)
         {
             dataSets.add(row.getObjectOrNull());
         }
         return dataSets;
     }
 
-    private final class DataSetInfoCallback extends AbstractAsyncCallback<ExternalData>
+    private final class DataSetInfoCallback extends AbstractAsyncCallback<AbstractExternalData>
     {
 
         private DataSetInfoCallback(final IViewContext<IGenericClientServiceAsync> viewContext)
@@ -373,7 +373,7 @@ public final class GenericDataSetEditForm extends
         }
 
         @Override
-        protected final void process(final ExternalData result)
+        protected final void process(final AbstractExternalData result)
         {
             setOriginalData(result);
             initGUI();
@@ -381,7 +381,7 @@ public final class GenericDataSetEditForm extends
     }
 
     private class ListParentsCallback extends
-            AbstractAsyncCallback<TypedTableResultSet<ExternalData>>
+            AbstractAsyncCallback<TypedTableResultSet<AbstractExternalData>>
     {
 
         public ListParentsCallback(IViewContext<?> viewContext)
@@ -390,11 +390,11 @@ public final class GenericDataSetEditForm extends
         }
 
         @Override
-        protected void process(TypedTableResultSet<ExternalData> result)
+        protected void process(TypedTableResultSet<AbstractExternalData> result)
         {
-            List<TableModelRowWithObject<ExternalData>> rows =
+            List<TableModelRowWithObject<AbstractExternalData>> rows =
                     result.getResultSet().getList().extractOriginalObjects();
-            List<ExternalData> dataSets = extractDataSets(rows);
+            List<AbstractExternalData> dataSets = extractDataSets(rows);
             parentsArea.setDataSets(dataSets);
             updateDirtyCheck();
             if (parentsArea.isVisible())
@@ -534,7 +534,7 @@ public final class GenericDataSetEditForm extends
         {
             // not best performance but the same solution that is done for experiments
             // only codes are needed but we extract 'full' object
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> config =
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> config =
                     DefaultResultSetConfig.createFetchAll();
             viewContext.getCommonService().listDataSetRelationships(techIdOrNull,
                     DataSetRelationshipRole.CONTAINER, config,
@@ -542,7 +542,7 @@ public final class GenericDataSetEditForm extends
         }
 
         private class ListContainedDataSetsCallback extends
-                AbstractAsyncCallback<TypedTableResultSet<ExternalData>>
+                AbstractAsyncCallback<TypedTableResultSet<AbstractExternalData>>
         {
 
             private Listener<BaseEvent> listener;
@@ -555,9 +555,9 @@ public final class GenericDataSetEditForm extends
             }
 
             @Override
-            protected void process(TypedTableResultSet<ExternalData> result)
+            protected void process(TypedTableResultSet<AbstractExternalData> result)
             {
-                List<TableModelRowWithObject<ExternalData>> rows =
+                List<TableModelRowWithObject<AbstractExternalData>> rows =
                         result.getResultSet().getList().extractOriginalObjects();
                 containedArea.setDataSets(extractDataSets(rows));
                 listener.handleEvent(null);
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 58866fec1481affceb5abea4c55529e96858c492..3f2287711843381daaf888ff573e52b9c5e1dfab 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
@@ -63,7 +63,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKin
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.WebAppContext;
@@ -74,7 +74,7 @@ import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.IGenericClientS
  * 
  * @author Piotr Buczek
  */
-abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSplit<ExternalData>
+abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSplit<AbstractExternalData>
         implements IDatabaseModificationObserver
 {
     public static final String PREFIX = "generic-dataset-viewer_";
@@ -95,7 +95,7 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
             {
                 @Override
                 protected void loadDatasetInfo(TechId datasetTechId,
-                        AsyncCallback<ExternalData> asyncCallback)
+                        AsyncCallback<AbstractExternalData> asyncCallback)
                 {
                     localViewContext.getService().getDataSetInfo(datasetTechId, asyncCallback);
                 }
@@ -114,13 +114,13 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
     }
 
     abstract protected void loadDatasetInfo(TechId datasetTechId,
-            AsyncCallback<ExternalData> asyncCallback);
+            AsyncCallback<AbstractExternalData> asyncCallback);
 
     /**
      * To be subclassed. Creates additional panels of the viewer in the right side section besides
      * components, datasets and attachments
      */
-    protected List<TabContent> createAdditionalSectionPanels(ExternalData dataset)
+    protected List<TabContent> createAdditionalSectionPanels(AbstractExternalData dataset)
     {
         return new ArrayList<TabContent>();
     }
@@ -145,7 +145,7 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
         super.fillBreadcrumbWidgets(widgets);
     }
 
-    private void extendToolBar(final ExternalData result)
+    private void extendToolBar(final AbstractExternalData result)
     {
         if (toolbarInitialized)
         {
@@ -163,12 +163,12 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
                     @Override
                     public void handleEvent(BaseEvent be)
                     {
-                        TableModelRowWithObject<ExternalData> row =
-                                new TableModelRowWithObject<ExternalData>(originalData, Arrays
+                        TableModelRowWithObject<AbstractExternalData> row =
+                                new TableModelRowWithObject<AbstractExternalData>(originalData, Arrays
                                         .<ISerializableComparable> asList());
                         @SuppressWarnings("unchecked")
-                        final List<TableModelRowWithObject<ExternalData>> dataSets =
-                                Arrays.<TableModelRowWithObject<ExternalData>> asList(row);
+                        final List<TableModelRowWithObject<AbstractExternalData>> dataSets =
+                                Arrays.<TableModelRowWithObject<AbstractExternalData>> asList(row);
                         IDelegatedActionWithResult<SelectedAndDisplayedItems> action =
                                 new IDelegatedActionWithResult<SelectedAndDisplayedItems>()
                                     {
@@ -196,8 +196,8 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
                     final AsyncCallback<Void> callback =
                             isTrashEnabled() ? createDeletionCallback()
                                     : createPermanentDeletionCallback();
-                    TableModelRowWithObject<ExternalData> row =
-                            new TableModelRowWithObject<ExternalData>(getOriginalData(),
+                    TableModelRowWithObject<AbstractExternalData> row =
+                            new TableModelRowWithObject<AbstractExternalData>(getOriginalData(),
                                     Arrays.<ISerializableComparable> asList());
                     new DataSetListDeletionConfirmationDialog(getViewContext()
                             .getCommonViewContext(), callback, row).show();
@@ -236,7 +236,7 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
         loadDatasetInfo(datasetId, new DataSetInfoCallback(getViewContext(), this));
     }
 
-    private final Component createLeftPanel(final ExternalData dataset)
+    private final Component createLeftPanel(final AbstractExternalData dataset)
     {
         final ContentPanel panel = createDataSetPropertiesPanel(dataset);
         panel.setScrollMode(Scroll.AUTOY);
@@ -244,12 +244,12 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
         return panel;
     }
 
-    private ContentPanel createDataSetPropertiesPanel(final ExternalData dataset)
+    private ContentPanel createDataSetPropertiesPanel(final AbstractExternalData dataset)
     {
         return new DataSetPropertiesPanel(dataset, getViewContext());
     }
 
-    private final Component createRightPanel(final ExternalData dataset)
+    private final Component createRightPanel(final AbstractExternalData dataset)
     {
         final IViewContext<?> context = getViewContext();
         final SectionsPanel container =
@@ -298,7 +298,7 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
         return container;
     }
 
-    private static final class DataSetInfoCallback extends AbstractAsyncCallback<ExternalData>
+    private static final class DataSetInfoCallback extends AbstractAsyncCallback<AbstractExternalData>
     {
         private final GenericDataSetViewer genericDataSetViewer;
 
@@ -314,13 +314,13 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
         //
 
         /**
-         * Sets the {@link ExternalData} for this <var>generic</var> dataset viewer.
+         * Sets the {@link AbstractExternalData} for this <var>generic</var> dataset viewer.
          * <p>
          * This method triggers the whole <i>GUI</i> construction.
          * </p>
          */
         @Override
-        protected final void process(final ExternalData result)
+        protected final void process(final AbstractExternalData result)
         {
             genericDataSetViewer.extendToolBar(result);
             genericDataSetViewer.updateOriginalData(result);
@@ -360,7 +360,7 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
     }
 
     @Override
-    protected void updateOriginalData(final ExternalData result)
+    protected void updateOriginalData(final AbstractExternalData result)
     {
         super.updateOriginalData(result);
         processButtonHolder.setupData(result);
@@ -420,7 +420,7 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
         }
 
         /** @param data external data that will be processed */
-        public void setupData(final ExternalData data)
+        public void setupData(final AbstractExternalData data)
         {
             getViewContext().getCommonService().listDataStoreServices(
                     DataStoreServiceKind.PROCESSING,
@@ -432,11 +432,11 @@ abstract public class GenericDataSetViewer extends AbstractViewerWithVerticalSpl
             AbstractAsyncCallback<List<DatastoreServiceDescription>>
     {
 
-        private final ExternalData dataset;
+        private final AbstractExternalData dataset;
 
         private final Button processButton;
 
-        public ProcessingServicesCallback(IViewContext<?> viewContext, ExternalData dataset,
+        public ProcessingServicesCallback(IViewContext<?> viewContext, AbstractExternalData dataset,
                 Button processButton)
         {
             super(viewContext);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentDataSetBrowser.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentDataSetBrowser.java
index 0b6dc86edec5714175eb5586bb5acdb1d8a07916..13f42e726847b34856c6d45866823472947ac95d 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentDataSetBrowser.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/experiment/ExperimentDataSetBrowser.java
@@ -29,7 +29,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetCo
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
@@ -95,8 +95,8 @@ public class ExperimentDataSetBrowser extends AbstractExternalDataGrid
 
     @Override
     protected void listTableRows(
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
-            AbstractAsyncCallback<TypedTableResultSet<ExternalData>> callback)
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> resultSetConfig,
+            AbstractAsyncCallback<TypedTableResultSet<AbstractExternalData>> callback)
     {
         boolean onlyDirectlyConnected = connectionTypeProvider.isOnlyDirectlyConnected();
         viewContext.getService().listExperimentDataSets(experimentId, resultSetConfig,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SampleDataSetBrowser.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SampleDataSetBrowser.java
index d57be173213452911e67cfd12fb49e5f1f0d2173..8d20969d4a5ad780abd3d01b31c7ad13855f9473 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SampleDataSetBrowser.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/client/application/sample/SampleDataSetBrowser.java
@@ -29,7 +29,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetCo
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
@@ -95,8 +95,8 @@ class SampleDataSetBrowser extends AbstractExternalDataGrid
 
     @Override
     protected void listTableRows(
-            DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig,
-            AbstractAsyncCallback<TypedTableResultSet<ExternalData>> callback)
+            DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> resultSetConfig,
+            AbstractAsyncCallback<TypedTableResultSet<AbstractExternalData>> callback)
     {
         boolean onlyDirectlyConnected = connectionTypeProvider.isOnlyDirectlyConnected();
         viewContext.getService().listSampleDataSets(sampleId, resultSetConfig,
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
index ae900189d1fc9e336152c0fa3b6f4b3bf0dddcdd..21a260511d0e6e01b9a02405740b2c9df9ce77ab 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientService.java
@@ -51,7 +51,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdates;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialBatchUpdateResultMessage;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
@@ -288,12 +288,12 @@ public class GenericClientService extends AbstractClientService implements IGene
     }
 
     @Override
-    public final ExternalData getDataSetInfo(final TechId datasetId)
+    public final AbstractExternalData getDataSetInfo(final TechId datasetId)
     {
         try
         {
             final String sessionToken = getSessionToken();
-            final ExternalData dataset = genericServer.getDataSetInfo(sessionToken, datasetId);
+            final AbstractExternalData dataset = genericServer.getDataSetInfo(sessionToken, datasetId);
             transformXML(dataset);
             return dataset;
         } catch (final ch.systemsx.cisd.common.exceptions.UserFailureException e)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
index 27e478fad3369f3c862f22d926932edba8fde96f..146379a9dffd3f19fe5a569fc0b2bab7a03058b6 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java
@@ -74,7 +74,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetBatchUpdateDetai
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdateResult;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
@@ -269,7 +269,7 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public ExternalData getDataSetInfo(String sessionToken,
+    public AbstractExternalData getDataSetInfo(String sessionToken,
             @AuthorizationGuard(guardClass = DataSetTechIdPredicate.class)
             TechId datasetId)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerLogger.java
index 8a751d9a928433e2d2c9fa8a0ae71d5d3bda4c69..1ee0a7bd81266c2af62fe63a4cbe22f1399676b0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServerLogger.java
@@ -31,7 +31,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AttachmentWithContent;
 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.ExperimentUpdateResult;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewDataSetsWithTypes;
@@ -95,7 +95,7 @@ final class GenericServerLogger extends AbstractServerLogger implements IGeneric
     }
 
     @Override
-    public ExternalData getDataSetInfo(final String sessionToken, final TechId datasetId)
+    public AbstractExternalData getDataSetInfo(final String sessionToken, final TechId datasetId)
     {
         logAccess(sessionToken, "get_data_set_info", "ID(%s)", datasetId);
         return null;
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java
index 1f341e64b7d1fa328ea60483c18555f0cde88eb8..e9bef437999a2bb03cdd9f761c8d9a0e41c0a835 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/shared/IGenericServer.java
@@ -32,7 +32,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetUpdateResult;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseModificationKind.ObjectKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdateResult;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewDataSetsWithTypes;
@@ -82,10 +82,10 @@ public interface IGenericServer extends IServer
             final Collection<NewAttachment> attachments);
 
     /**
-     * For given {@link TechId} returns the corresponding {@link ExternalData}.
+     * For given {@link TechId} returns the corresponding {@link AbstractExternalData}.
      */
     @Transactional(readOnly = true)
-    public ExternalData getDataSetInfo(String sessionToken, TechId datasetId);
+    public AbstractExternalData getDataSetInfo(String sessionToken, TechId datasetId);
 
     /**
      * Returns attachment described by given experiment identifier, filename and version.
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java
index cc6e1ece891b735d74db24ed05ea5849b7c2ed66..e470a2746a337d1bd4bfcd9c79301101c8f4db9c 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/OpenbisClientTest.java
@@ -16,7 +16,7 @@ import ch.systemsx.cisd.openbis.generic.shared.ITrackingServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IEntityInformationHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -115,7 +115,7 @@ public class OpenbisClientTest
 
         final TrackingDataSetCriteria dataSetCriteria =
                 new TrackingDataSetCriteria(sampleTypeCode, lastSeenDataSetId);
-        final List<ExternalData> dataSets =
+        final List<AbstractExternalData> dataSets =
                 trackingServer.listDataSets(session.getSessionToken(), dataSetCriteria);
         System.out
                 .println(TrackingHelper.trackedEntitiesInformation(dataSets, EntityKind.DATA_SET));
@@ -170,7 +170,7 @@ public class OpenbisClientTest
                 case SAMPLE:
                     return toString((Sample) entity);
                 case DATA_SET:
-                    return toString((ExternalData) entity);
+                    return toString((AbstractExternalData) entity);
                 default:
                     throw new IllegalArgumentException(entity.getEntityKind()
                             + " is not supported ");
@@ -207,7 +207,7 @@ public class OpenbisClientTest
             return sb.toString();
         }
 
-        private static String toString(ExternalData dataSet)
+        private static String toString(AbstractExternalData dataSet)
         {
             final StringBuilder sb = new StringBuilder();
             ToStringBuilder builder =
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ShowDataSet.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ShowDataSet.java
index 4e2f4ced0b6f65b0d45a26363661dc3ab575edcd..5d374468faa0957b109fe822b0457504dab13614 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ShowDataSet.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/data/ShowDataSet.java
@@ -24,7 +24,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.util.Gr
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.ExperimentBrowserGridColumnIDs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.AbstractDefaultTestCommand;
 import ch.systemsx.cisd.openbis.generic.client.web.client.testframework.GWTTestUtil;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * A {@link AbstractDefaultTestCommand} extension for showing detail view of a data set with given
@@ -48,8 +48,8 @@ public class ShowDataSet extends AbstractDefaultTestCommand
     {
         final Widget widget = GWTTestUtil.getWidgetWithID(DataSetSearchHitGrid.GRID_ID);
         assertTrue(widget instanceof Grid<?>);
-        final Grid<BaseEntityModel<ExternalData>> table =
-                (Grid<BaseEntityModel<ExternalData>>) widget;
+        final Grid<BaseEntityModel<AbstractExternalData>> table =
+                (Grid<BaseEntityModel<AbstractExternalData>>) widget;
         GridTestUtils.fireSelectRow(table, ExperimentBrowserGridColumnIDs.CODE, code);
         GWTTestUtil.clickButtonWithID(DataSetSearchHitGrid.BROWSER_ID
                 + AbstractExternalDataGrid.SHOW_DETAILS_BUTTON_ID_SUFFIX);
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 8a1f0001170e2c58c302665154f8ef282e5b04c1..e24a9f76b7205eb747554534e6319202095ed4c9 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,7 +59,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DisplaySettings;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GenericEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GridCustomColumn;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
@@ -530,11 +530,11 @@ public final class CommonClientServiceTest extends AbstractClientServiceTest
                 }
             });
 
-        DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> resultSetConfig =
+        DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> resultSetConfig =
                 DefaultResultSetConfig.createFetchAll();
-        TypedTableResultSet<ExternalData> resultSet =
+        TypedTableResultSet<AbstractExternalData> resultSet =
                 commonClientService.listExperimentDataSets(experimentId, resultSetConfig, true);
-        List<TableModelRowWithObject<ExternalData>> list =
+        List<TableModelRowWithObject<AbstractExternalData>> list =
                 resultSet.getResultSet().getList().extractOriginalObjects();
         assertEquals(1, list.size());
         PhysicalDataSet data = list.get(0).getObjectOrNull().tryGetAsDataSet();
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 cfd01667404cc59a4b901c60a2a28861430d2a6e..e19762edfb21f479ad2ee15274473ccd20774801 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
@@ -54,7 +54,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityVisit;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LastModificationState;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListMaterialCriteria;
@@ -580,7 +580,7 @@ public final class CommonServerTest extends AbstractServerTestCase
         final DataStorePE dataStorePE = new DataStorePE();
         dataStorePE.setCode("DST");
         externalDataPE.setDataStore(dataStorePE);
-        final ExternalData externalData =
+        final AbstractExternalData externalData =
                 DataSetTranslator.translate(externalDataPE, BASE_INDEX_URL, null,
                         new ManagedPropertyEvaluatorFactory(null, null));
         prepareGetSession();
@@ -596,7 +596,7 @@ public final class CommonServerTest extends AbstractServerTestCase
                 }
             });
 
-        final List<ExternalData> list =
+        final List<AbstractExternalData> list =
                 createServer().listSampleExternalData(SESSION_TOKEN, sampleId,
                         showOnlyDirectlyConnected);
 
@@ -620,7 +620,7 @@ public final class CommonServerTest extends AbstractServerTestCase
         final DataStorePE dataStorePE = new DataStorePE();
         dataStorePE.setCode("DST");
         externalDataPE.setDataStore(dataStorePE);
-        final ExternalData externalData =
+        final AbstractExternalData externalData =
                 DataSetTranslator.translate(externalDataPE, BASE_INDEX_URL, null,
                         new ManagedPropertyEvaluatorFactory(null, null));
         prepareGetSession();
@@ -634,7 +634,7 @@ public final class CommonServerTest extends AbstractServerTestCase
                 }
             });
 
-        final List<ExternalData> list =
+        final List<AbstractExternalData> list =
                 createServer().listExperimentExternalData(SESSION_TOKEN, experimentId, true);
 
         assertEquals(1, list.size());
@@ -643,7 +643,7 @@ public final class CommonServerTest extends AbstractServerTestCase
         context.assertIsSatisfied();
     }
 
-    private boolean equals(ExternalData data1, ExternalData data2)
+    private boolean equals(AbstractExternalData data1, AbstractExternalData data2)
     {
         return EqualsBuilder.reflectionEquals(data1, data2);
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceDatabaseTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceDatabaseTest.java
index 396e020ae236de936384454a06ba8ad3f4a63919..79b625e04f6f0b848fbace48d51e37b6c8670e93 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceDatabaseTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/ETLServiceDatabaseTest.java
@@ -45,7 +45,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetBatchUpdateDetai
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentFetchOption;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentFetchOptions;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityPropertiesHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
@@ -240,7 +240,7 @@ public class ETLServiceDatabaseTest extends AbstractDAOTest
                 MatchClauseAttribute.TYPE, "HCS_IMAGE"));
         searchCriteria.addMatchClause(SearchCriteria.MatchClause.createPropertyMatch("COMMENT",
                 "no comment"));
-        List<ExternalData> dataSetsToUpdate =
+        List<AbstractExternalData> dataSetsToUpdate =
                 service.searchForDataSets(sessionToken, searchCriteria);
         assertEquals(13, dataSetsToUpdate.size());
 
@@ -249,7 +249,7 @@ public class ETLServiceDatabaseTest extends AbstractDAOTest
         // Update the comment
         String newComment = "This is a new comment. This is not the old comment.";
         List<DataSetBatchUpdatesDTO> dataSetUpdates = new ArrayList<DataSetBatchUpdatesDTO>();
-        for (ExternalData dataSetToUpdate : dataSetsToUpdate)
+        for (AbstractExternalData dataSetToUpdate : dataSetsToUpdate)
         {
             assertTrue("The modification date should be in the distant past", dataSetToUpdate
                     .getModificationDate().compareTo(now) < 0);
@@ -264,14 +264,14 @@ public class ETLServiceDatabaseTest extends AbstractDAOTest
         performDataSetUpdates(dataSetUpdates, 1);
 
         // Now retrieve the sample again and check that the properties were updated.
-        List<ExternalData> updatedDataSets =
+        List<AbstractExternalData> updatedDataSets =
                 service.searchForDataSets(sessionToken, searchCriteria);
         // The index has not been updated yet, so we have to group the items into those that
         // still have the old comment and those with the new comment
 
-        List<ExternalData> dataSetsWithOldValue = new ArrayList<ExternalData>();
-        List<ExternalData> dataSetsWithNewValue = new ArrayList<ExternalData>();
-        for (ExternalData data : updatedDataSets)
+        List<AbstractExternalData> dataSetsWithOldValue = new ArrayList<AbstractExternalData>();
+        List<AbstractExternalData> dataSetsWithNewValue = new ArrayList<AbstractExternalData>();
+        for (AbstractExternalData data : updatedDataSets)
         {
             String comment = EntityHelper.tryFindPropertyValue(data, "COMMENT");
             if (newComment.equals(comment))
@@ -283,7 +283,7 @@ public class ETLServiceDatabaseTest extends AbstractDAOTest
         assertEquals(0, dataSetsWithOldValue.size());
         assertEquals(dataSetsToUpdate.size(), dataSetsWithNewValue.size());
 
-        for (ExternalData dataSetWithNewValue : dataSetsWithNewValue)
+        for (AbstractExternalData dataSetWithNewValue : dataSetsWithNewValue)
         {
             assertTrue("The modification date should be current", dataSetWithNewValue
                     .getModificationDate().compareTo(now) > 0);
@@ -297,7 +297,7 @@ public class ETLServiceDatabaseTest extends AbstractDAOTest
     @Test(expectedExceptions = EnvironmentFailureException.class)
     public void testPerformEntityOperationsUpdateStaleDataSet()
     {
-        ExternalData dataSetToUpdate = findDatasetByCode("20081105092159188-3");
+        AbstractExternalData dataSetToUpdate = findDatasetByCode("20081105092159188-3");
 
         DataSetBatchUpdatesDTO update =
                 createDataSetUpdateDTO(dataSetToUpdate, "COMMENT",
@@ -392,7 +392,7 @@ public class ETLServiceDatabaseTest extends AbstractDAOTest
         return sampleUpdate;
     }
 
-    private DataSetBatchUpdatesDTO createDataSetUpdateDTO(ExternalData dataSet,
+    private DataSetBatchUpdatesDTO createDataSetUpdateDTO(AbstractExternalData dataSet,
             String propertyCode, String propertyValue)
     {
         // Create the initial information
@@ -540,12 +540,12 @@ public class ETLServiceDatabaseTest extends AbstractDAOTest
         return samples.get(0);
     }
 
-    private ExternalData findDatasetByCode(String code)
+    private AbstractExternalData findDatasetByCode(String code)
     {
         SearchCriteria searchCriteria = new SearchCriteria();
         searchCriteria.addMatchClause(SearchCriteria.MatchClause.createAttributeMatch(
                 MatchClauseAttribute.CODE, code));
-        List<ExternalData> dataSets = service.searchForDataSets(sessionToken, searchCriteria);
+        List<AbstractExternalData> dataSets = service.searchForDataSets(sessionToken, searchCriteria);
         assertEquals(1, dataSets.size());
         return dataSets.get(0);
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceTest.java
index b154c0d1aebdd1437a2bd1561d5d0eff0573f6e2..d65cde2936997503fe030a4a9d09e05d459d2ca3 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/api/v1/GeneralInformationServiceTest.java
@@ -489,7 +489,7 @@ public class GeneralInformationServiceTest extends AbstractServerTestCase
 
                     one(commonServer).listRelatedDataSets(with(SESSION_TOKEN),
                             with(any(DataSetRelatedEntities.class)), with(true));
-                    will(returnValue(new ArrayList<ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData>()));
+                    will(returnValue(new ArrayList<ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData>()));
                 }
             });
         ArrayList<Sample> samples = new ArrayList<Sample>();
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTableTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTableTest.java
index 76a0f8f47749af95d7d21e3fe4ae647be1601171..3d35ef45ccdd5857d864dcdd02d916379493fa6d 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTableTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/DataSetTableTest.java
@@ -49,7 +49,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetKind;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetTypePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUploadContext;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataStorePE;
@@ -374,18 +374,18 @@ public final class DataSetTableTest extends AbstractBOTest
 
                     one(dataStoreServiceConversational2).uploadDataSetsToCIFEX(
                             with(equal(dss2.getSessionToken())),
-                            with(new BaseMatcher<List<ExternalData>>()
+                            with(new BaseMatcher<List<AbstractExternalData>>()
                                 {
 
                                     @Override
                                     public boolean matches(Object item)
                                     {
-                                        List<ExternalData> list = (List<ExternalData>) item;
+                                        List<AbstractExternalData> list = (List<AbstractExternalData>) item;
                                         if (list.size() != 1)
                                         {
                                             return false;
                                         }
-                                        ExternalData data = list.get(0);
+                                        AbstractExternalData data = list.get(0);
                                         return d2PE.getCode().equals(data.getCode());
                                     }
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerTest.java
index f3551f141ebb659bcc5d9b286c9ac58549f536b9..dbe38ae6ae49b08ff12e1e853228b8e57b9e6c41 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/datasetlister/DatasetListerTest.java
@@ -51,7 +51,7 @@ 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.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetArchivingStatus;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IDatasetLocationNode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -93,9 +93,9 @@ public class DatasetListerTest extends AbstractDAOTest
     @Test
     public void testListBySampleTechIdDirect()
     {
-        List<ExternalData> datasets = lister.listBySampleTechId(new TechId(exampleSampleId), true);
+        List<AbstractExternalData> datasets = lister.listBySampleTechId(new TechId(exampleSampleId), true);
         assertEquals(1, datasets.size());
-        ExternalData externalData = datasets.get(0);
+        AbstractExternalData externalData = datasets.get(0);
         assertEquals(exampleSampleId, externalData.getSample().getId().longValue());
         assertFalse(externalData.getProperties().isEmpty());
         assertNotNull(externalData.getExperiment());
@@ -104,23 +104,23 @@ public class DatasetListerTest extends AbstractDAOTest
     @Test
     public void testListBySampleTechIdIndirect()
     {
-        List<ExternalData> indirectlyConnectedChildDatasets =
+        List<AbstractExternalData> indirectlyConnectedChildDatasets =
                 lister.listBySampleTechId(new TechId(exampleSampleId), false);
         assertEquals(5, indirectlyConnectedChildDatasets.size());
         System.err.println(Code.extractCodes(indirectlyConnectedChildDatasets).toString());
 
         assertNotNull(exampleSample.getGeneratedFrom());
-        List<ExternalData> directlyConnectedParentDatasets =
+        List<AbstractExternalData> directlyConnectedParentDatasets =
                 lister.listBySampleTechId(new TechId(exampleSample.getGeneratedFrom()), true);
         assertEquals(1, directlyConnectedParentDatasets.size());
 
-        List<ExternalData> indirectlyConnectedParentDatasets =
+        List<AbstractExternalData> indirectlyConnectedParentDatasets =
                 lister.listBySampleTechId(new TechId(exampleSample.getGeneratedFrom()), false);
         assertEquals(6, indirectlyConnectedParentDatasets.size());
 
         List<String> indirectlyConnectedParentDatasetCodes =
                 Code.extractCodes(indirectlyConnectedParentDatasets);
-        for (ExternalData childDataset : indirectlyConnectedChildDatasets)
+        for (AbstractExternalData childDataset : indirectlyConnectedChildDatasets)
         {
             assertTrue(childDataset.getCode() + " not found among "
                     + indirectlyConnectedParentDatasetCodes.toString(),
@@ -150,7 +150,7 @@ public class DatasetListerTest extends AbstractDAOTest
                 SampleTranslator.translate(samplePEs, "", new HashMap<Long, Set<Metaproject>>(),
                         new ManagedPropertyEvaluatorFactory(null, null));
 
-        Map<Sample, List<ExternalData>> dataSets = lister.listAllDataSetsFor(samples);
+        Map<Sample, List<AbstractExternalData>> dataSets = lister.listAllDataSetsFor(samples);
 
         StringBuilder builder = new StringBuilder();
         for (Sample sample : samples)
@@ -175,10 +175,10 @@ public class DatasetListerTest extends AbstractDAOTest
                 + "      20081105092259900-1 (HCS_IMAGE) [COMMENT: no comment]\n"
                 + "        20081105092359990-2 (HCS_IMAGE) [COMMENT: no comment]\n",
                 builder.toString());
-        Map<String, ExternalData> dataSetsByCode = new HashMap<String, ExternalData>();
+        Map<String, AbstractExternalData> dataSetsByCode = new HashMap<String, AbstractExternalData>();
         for (Sample sample : samples)
         {
-            List<ExternalData> rootDataSets = dataSets.get(sample);
+            List<AbstractExternalData> rootDataSets = dataSets.get(sample);
             assertSameDataSetsForSameCode(dataSetsByCode, rootDataSets);
         }
     }
@@ -187,14 +187,14 @@ public class DatasetListerTest extends AbstractDAOTest
     public void testListDataSetsByCode()
     {
         // 1st is deleted, 2nd has fake code, 3rd & 4th are ok
-        List<ExternalData> dataSets =
+        List<AbstractExternalData> dataSets =
                 lister.listByDatasetCode(Arrays.asList("20081105092158673-1", "blabla",
                         "20081105092159111-1", "20081105092159188-3"));
 
-        Collections.sort(dataSets, new Comparator<ExternalData>()
+        Collections.sort(dataSets, new Comparator<AbstractExternalData>()
             {
                 @Override
-                public int compare(ExternalData o1, ExternalData o2)
+                public int compare(AbstractExternalData o1, AbstractExternalData o2)
                 {
                     return (int) (o1.getId() - o2.getId());
                 }
@@ -219,11 +219,11 @@ public class DatasetListerTest extends AbstractDAOTest
     @Test
     public void testListByTrackingCriteriaWithNoSample()
     {
-        List<ExternalData> dataSets = lister.listByTrackingCriteria(new TrackingDataSetCriteria(9));
-        Collections.sort(dataSets, new Comparator<ExternalData>()
+        List<AbstractExternalData> dataSets = lister.listByTrackingCriteria(new TrackingDataSetCriteria(9));
+        Collections.sort(dataSets, new Comparator<AbstractExternalData>()
             {
                 @Override
-                public int compare(ExternalData o1, ExternalData o2)
+                public int compare(AbstractExternalData o1, AbstractExternalData o2)
                 {
                     return (int) (o1.getId() - o2.getId());
                 }
@@ -237,12 +237,12 @@ public class DatasetListerTest extends AbstractDAOTest
     @Test
     public void testListByTrackingCriteriaWithSampleType()
     {
-        List<ExternalData> dataSets =
+        List<AbstractExternalData> dataSets =
                 lister.listByTrackingCriteria(new TrackingDataSetCriteria("CELL_PLATE", 6));
-        Collections.sort(dataSets, new Comparator<ExternalData>()
+        Collections.sort(dataSets, new Comparator<AbstractExternalData>()
             {
                 @Override
-                public int compare(ExternalData o1, ExternalData o2)
+                public int compare(AbstractExternalData o1, AbstractExternalData o2)
                 {
                     return (int) (o1.getId() - o2.getId());
                 }
@@ -259,7 +259,7 @@ public class DatasetListerTest extends AbstractDAOTest
     {
         final Long containerId = 13L;
         final Long containedId = 15L;
-        List<ExternalData> datasets =
+        List<AbstractExternalData> datasets =
                 lister.listByDatasetIds(Arrays.asList(containerId, containedId));
         assertEquals(2, datasets.size());
         ContainerDataSet containerDataSet = datasets.get(0).tryGetAsContainerDataSet();
@@ -279,7 +279,7 @@ public class DatasetListerTest extends AbstractDAOTest
         final Long ds2Id = 24L;
         final Long ds3Id = 25L;
 
-        List<ExternalData> datasets = lister.listByDatasetIds(Arrays.asList(ds1Id, ds2Id, ds3Id));
+        List<AbstractExternalData> datasets = lister.listByDatasetIds(Arrays.asList(ds1Id, ds2Id, ds3Id));
 
         assertEquals(3, datasets.size());
         assertTrue(datasets.get(0).isLinkData());
@@ -333,7 +333,7 @@ public class DatasetListerTest extends AbstractDAOTest
     public void testContainerParentPopulated()
     {
         final Long containedId = 15L;
-        List<ExternalData> datasets = lister.listByDatasetIds(Arrays.asList(containedId));
+        List<AbstractExternalData> datasets = lister.listByDatasetIds(Arrays.asList(containedId));
         assertEquals(1, datasets.size());
         PhysicalDataSet dataset = datasets.get(0).tryGetAsDataSet();
         assertNotNull(dataset);
@@ -347,12 +347,12 @@ public class DatasetListerTest extends AbstractDAOTest
     public void testContainedDataSetzPopulated()
     {
         final Long containerId = 13L;
-        List<ExternalData> datasets = lister.listByDatasetIds(Arrays.asList(containerId));
+        List<AbstractExternalData> datasets = lister.listByDatasetIds(Arrays.asList(containerId));
         assertEquals(1, datasets.size());
         ContainerDataSet containerDataSet = datasets.get(0).tryGetAsContainerDataSet();
         assertNotNull(containerDataSet);
 
-        List<ExternalData> containedDataSets = containerDataSet.getContainedDataSets();
+        List<AbstractExternalData> containedDataSets = containerDataSet.getContainedDataSets();
         assertEquals(2, containedDataSets.size());
         assertEquals("20110509092359990-11", containedDataSets.get(0).getCode());
         assertEquals("20110509092359990-12", containedDataSets.get(1).getCode());
@@ -361,18 +361,18 @@ public class DatasetListerTest extends AbstractDAOTest
     @Test
     public void testListByDataStore()
     {
-        List<ExternalData> list = lister.listByDataStore(1);
+        List<AbstractExternalData> list = lister.listByDataStore(1);
 
-        Collections.sort(list, new Comparator<ExternalData>()
+        Collections.sort(list, new Comparator<AbstractExternalData>()
             {
                 @Override
-                public int compare(ExternalData o1, ExternalData o2)
+                public int compare(AbstractExternalData o1, AbstractExternalData o2)
                 {
                     return o1.getCode().compareTo(o2.getCode());
                 }
             });
         // NOTE: deleted data set with id 2 is omitted and so are all container and link datasets
-        ExternalData dataSet = list.get(0);
+        AbstractExternalData dataSet = list.get(0);
         assertEquals(5L, dataSet.getId().longValue());
         assertEquals("20081105092159111-1", dataSet.getCode());
         assertEquals("HCS_IMAGE", dataSet.getDataSetType().getCode());
@@ -399,9 +399,9 @@ public class DatasetListerTest extends AbstractDAOTest
     @Test
     public void testListByDataStoreInChunks()
     {
-        List<ExternalData> fullList = new ArrayList<ExternalData>();
+        List<AbstractExternalData> fullList = new ArrayList<AbstractExternalData>();
 
-        List<ExternalData> list =
+        List<AbstractExternalData> list =
                 lister.listByDataStore(1, 8, DatasetLister.DEFAULT_DATASET_FETCH_OPTIONS);
         fullList.addAll(list);
         // We get 12 instead of 8 datasets due to the corner case of many datasets having the same
@@ -419,7 +419,7 @@ public class DatasetListerTest extends AbstractDAOTest
                         DatasetLister.DEFAULT_DATASET_FETCH_OPTIONS);
         assertEquals(0, list.size());
 
-        ExternalData dataSet = fullList.get(0);
+        AbstractExternalData dataSet = fullList.get(0);
         assertEquals(4L, dataSet.getId().longValue());
         assertEquals("20081105092159188-3", dataSet.getCode());
         assertEquals("HCS_IMAGE", dataSet.getDataSetType().getCode());
@@ -534,37 +534,37 @@ public class DatasetListerTest extends AbstractDAOTest
         Assert.assertEquals(0, componentNode.getComponents().size());
     }
 
-    private void assertSameDataSetsForSameCode(Map<String, ExternalData> dataSetsByCode,
-            Collection<ExternalData> dataSets)
+    private void assertSameDataSetsForSameCode(Map<String, AbstractExternalData> dataSetsByCode,
+            Collection<AbstractExternalData> dataSets)
     {
         if (dataSets == null || dataSets.isEmpty())
         {
             return;
         }
-        for (ExternalData dataSet : dataSets)
+        for (AbstractExternalData dataSet : dataSets)
         {
-            ExternalData previousDataSet = dataSetsByCode.put(dataSet.getCode(), dataSet);
+            AbstractExternalData previousDataSet = dataSetsByCode.put(dataSet.getCode(), dataSet);
             if (previousDataSet != null)
             {
                 assertSame("Same data set object expected for " + dataSet.getCode(),
                         previousDataSet, dataSet);
             }
-            Collection<ExternalData> children = dataSet.getChildren();
+            Collection<AbstractExternalData> children = dataSet.getChildren();
             assertSameDataSetsForSameCode(dataSetsByCode, children);
         }
     }
 
-    private void appendChildren(StringBuilder builder, Collection<ExternalData> dataSets,
+    private void appendChildren(StringBuilder builder, Collection<AbstractExternalData> dataSets,
             String indentation)
     {
         if (dataSets.isEmpty() == false)
         {
-            for (ExternalData dataSet : dataSets)
+            for (AbstractExternalData dataSet : dataSets)
             {
                 builder.append('\n').append(indentation).append(dataSet.getCode()).append(" (");
                 builder.append(dataSet.getDataSetType().getCode()).append(") ");
                 builder.append(getSortedProperties(dataSet));
-                Collection<ExternalData> children = dataSet.getChildren();
+                Collection<AbstractExternalData> children = dataSet.getChildren();
                 if (children != null && children.isEmpty() == false)
                 {
                     appendChildren(builder, children, indentation + "  ");
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/task/DataSetRegistrationSummaryTaskTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/task/DataSetRegistrationSummaryTaskTest.java
index 80eb82086b989525e6453ea64060e1c14e2a78dc..16b6d57bda02e6dc8567f5854c5a4da5d9f790b7 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/task/DataSetRegistrationSummaryTaskTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/task/DataSetRegistrationSummaryTaskTest.java
@@ -46,7 +46,7 @@ import ch.systemsx.cisd.openbis.generic.server.ICommonServerForInternalUse;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SessionContextDTO;
 
@@ -319,7 +319,7 @@ public class DataSetRegistrationSummaryTaskTest extends AssertJUnit
     }
 
     private RecordingMatcher<DetailedSearchCriteria> prepareForSearchForDataSets(
-            final String dataSetType, final ExternalData... dataSets)
+            final String dataSetType, final AbstractExternalData... dataSets)
     {
         final RecordingMatcher<DetailedSearchCriteria> recordingMatcher =
                 new RecordingMatcher<DetailedSearchCriteria>();
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java
index c4e044eeb189a4d360cbc915a5a7e581bbe1cc8a..1bee35cdcb0c545f1933cefd64197e0582af6f6b 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java
@@ -237,7 +237,7 @@ public class TranslatorTest extends AssertJUnit
     }
 
     private void assertBasicAttributes(
-            ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData originalDataSet,
+            ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData originalDataSet,
             DataSet translatedDataSet)
     {
         assertEquals(originalDataSet.getCode(), translatedDataSet.getCode());
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/AbstractDataSetBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/AbstractDataSetBuilder.java
index 2bad576c95e687419770c632700d450d8f94f764..a846ca4372f2a2d55af8ff1a35064a7e7e97a50d 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/AbstractDataSetBuilder.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/AbstractDataSetBuilder.java
@@ -26,7 +26,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
@@ -36,7 +36,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 public abstract class AbstractDataSetBuilder<T extends AbstractDataSetBuilder<?>>
 {
 
-    protected final ExternalData dataSet;
+    protected final AbstractExternalData dataSet;
 
     /**
      * Return this object typed to the concrete class. This is a subclass responsibility.
@@ -46,7 +46,7 @@ public abstract class AbstractDataSetBuilder<T extends AbstractDataSetBuilder<?>
     /**
      * Constructor that takes a concrete data set class as an argument.
      */
-    protected AbstractDataSetBuilder(ExternalData concreteDataSet)
+    protected AbstractDataSetBuilder(AbstractExternalData concreteDataSet)
     {
         super();
         this.dataSet = concreteDataSet;
@@ -129,10 +129,10 @@ public abstract class AbstractDataSetBuilder<T extends AbstractDataSetBuilder<?>
 
     public T parent(PhysicalDataSet parent)
     {
-        Collection<ExternalData> parents = dataSet.getParents();
+        Collection<AbstractExternalData> parents = dataSet.getParents();
         if (parents == null)
         {
-            parents = new ArrayList<ExternalData>();
+            parents = new ArrayList<AbstractExternalData>();
             dataSet.setParents(parents);
         }
         parents.add(parent);
@@ -141,10 +141,10 @@ public abstract class AbstractDataSetBuilder<T extends AbstractDataSetBuilder<?>
 
     public T child(PhysicalDataSet child)
     {
-        Collection<ExternalData> children = dataSet.getChildren();
+        Collection<AbstractExternalData> children = dataSet.getChildren();
         if (children == null)
         {
-            children = new ArrayList<ExternalData>();
+            children = new ArrayList<AbstractExternalData>();
             dataSet.setChildren(children);
         }
         children.add(child);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/ContainerDataSetBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/ContainerDataSetBuilder.java
index 3785e3f75aa2d9da0db87a62f0696e24b2cfad5a..4c43966e49666aaf2fc4e7728c801afb58adbb77 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/ContainerDataSetBuilder.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/builders/ContainerDataSetBuilder.java
@@ -21,7 +21,7 @@ import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * Builder class for creating an instance of {@link PhysicalDataSet} or {@link ContainerDataSet}.
@@ -48,11 +48,11 @@ public class ContainerDataSetBuilder extends AbstractDataSetBuilder<ContainerDat
 
     public ContainerDataSetBuilder contains(PhysicalDataSet contained)
     {
-        List<ExternalData> containedDataSets =
+        List<AbstractExternalData> containedDataSets =
                 dataSet.tryGetAsContainerDataSet().getContainedDataSets();
         if (containedDataSets == null)
         {
-            containedDataSets = new ArrayList<ExternalData>();
+            containedDataSets = new ArrayList<AbstractExternalData>();
             dataSet.tryGetAsContainerDataSet().setContainedDataSets(containedDataSets);
         }
         containedDataSets.add(contained);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslatorTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslatorTest.java
index 14565921cd1e5343763546350d3d34864572f742..15f33bca7d545990266357b9fea6430291d07f8c 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslatorTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/DataSetTranslatorTest.java
@@ -28,7 +28,7 @@ import org.testng.annotations.Test;
 import ch.systemsx.cisd.openbis.common.types.BooleanOrUnknown;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetKind;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LinkDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetRelationshipPE;
@@ -65,7 +65,7 @@ public class DataSetTranslatorTest extends AssertJUnit
     {
         ExternalDataPE externalDataPE = new ExternalDataPE();
         externalDataPE.setDataStore(createStore());
-        ExternalData data =
+        AbstractExternalData data =
                 DataSetTranslator.translate(externalDataPE, BASE_INDEX_URL, null,
                         new ManagedPropertyEvaluatorFactory(null, null));
 
@@ -132,7 +132,7 @@ public class DataSetTranslatorTest extends AssertJUnit
         deletionPE.setRegistrator(personPE);
         externalDataPE.setDeletion(deletionPE);
         externalDataPE.setSampleAcquiredFrom(samplePE);
-        ExternalData data =
+        AbstractExternalData data =
                 DataSetTranslator.translate(externalDataPE, BASE_INDEX_URL, null,
                         new ManagedPropertyEvaluatorFactory(null, null));
 
@@ -190,7 +190,7 @@ public class DataSetTranslatorTest extends AssertJUnit
         externalDataPE.addParentRelationship(createParentRelationship(externalDataPE, "parent-1"));
         externalDataPE.addParentRelationship(createParentRelationship(externalDataPE, "parent-2"));
 
-        ExternalData externalData =
+        AbstractExternalData externalData =
                 DataSetTranslator.translate(externalDataPE, BASE_INDEX_URL, null,
                         new ManagedPropertyEvaluatorFactory(null, null));
 
@@ -234,7 +234,7 @@ public class DataSetTranslatorTest extends AssertJUnit
         linkDataPE.addParentRelationship(createParentRelationship(linkDataPE, "parent-1"));
         linkDataPE.addParentRelationship(createParentRelationship(linkDataPE, "parent-2"));
 
-        ExternalData externalData =
+        AbstractExternalData externalData =
                 DataSetTranslator.translate(linkDataPE, BASE_INDEX_URL, null,
                         new ManagedPropertyEvaluatorFactory(null, null));
 
@@ -258,10 +258,10 @@ public class DataSetTranslatorTest extends AssertJUnit
                 .getExternalDataManagementSystem().getLabel());
     }
 
-    private Set<String> extractParentCodes(ExternalData externalData)
+    private Set<String> extractParentCodes(AbstractExternalData externalData)
     {
         final Set<String> result = new HashSet<String>();
-        for (ExternalData parent : externalData.getParents())
+        for (AbstractExternalData parent : externalData.getParents())
         {
             result.add(parent.getCode());
         }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/SimpleDataSetHelperTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/SimpleDataSetHelperTest.java
index bee0f79bc71a02fd2b868d20a1b519baa2e7d1c1..1bc3a83ddf69bd90cf9bf7481320c90641e47f47 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/SimpleDataSetHelperTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/translator/SimpleDataSetHelperTest.java
@@ -30,7 +30,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -46,9 +46,9 @@ public class SimpleDataSetHelperTest extends AssertJUnit
     @Test
     public void testTranslateList()
     {
-        ExternalData ds1 = create(1);
-        ExternalData ds2 = create(2);
-        ExternalData ds3 = new ContainerDataSet();
+        AbstractExternalData ds1 = create(1);
+        AbstractExternalData ds2 = create(2);
+        AbstractExternalData ds3 = new ContainerDataSet();
 
         List<SimpleDataSetInformationDTO> list =
                 SimpleDataSetHelper.filterAndTranslate(Arrays.asList(ds1, ds2, ds3));
@@ -69,7 +69,7 @@ public class SimpleDataSetHelperTest extends AssertJUnit
         check(1, result);
     }
 
-    private ExternalData create(long id)
+    private AbstractExternalData create(long id)
     {
         PhysicalDataSet dataSet = new PhysicalDataSet();
         dataSet.setId(id);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientServiceTest.java
index 42ea6e064b65fd9721391b3de792ea838c01e92a..13757fac39a4f69e0c0af57f1089081907d953b8 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/plugin/generic/client/web/server/GenericClientServiceTest.java
@@ -48,7 +48,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GenericEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
@@ -205,7 +205,7 @@ public final class GenericClientServiceTest extends AbstractClientServiceTest
                 }
             });
 
-        ExternalData info = genericClientService.getDataSetInfo(id);
+        AbstractExternalData info = genericClientService.getDataSetInfo(id);
 
         IEntityProperty transformedXMLProperty = info.getProperties().get(0);
         assertEquals("<?xml version=\"1.0\" encoding=\"UTF-8\"?><b>hello</b>",
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignDataSetToExperimentTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignDataSetToExperimentTest.java
index 9c878ccdc1adee10ae8080e237860b3307107628..6808b91e5cff69aa7bb9a59f706a52a8ed5a51da 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignDataSetToExperimentTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignDataSetToExperimentTest.java
@@ -24,7 +24,7 @@ import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.common.exceptions.AuthorizationFailureException;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -52,7 +52,7 @@ public class AssignDataSetToExperimentTest extends BaseTest
     @Test
     public void dataSetWithoutSampleCanBeUpdatedToAnotherExperiment() throws Exception
     {
-        ExternalData dataset = create(aDataSet().inExperiment(sourceExperiment));
+        AbstractExternalData dataset = create(aDataSet().inExperiment(sourceExperiment));
 
         perform(anUpdateOf(dataset).toExperiment(destinationExperiment));
 
@@ -63,7 +63,7 @@ public class AssignDataSetToExperimentTest extends BaseTest
     public void dataSetWithSampleCanBeUpdatedToAnotherExperiment() throws Exception
     {
         Sample sample = create(aSample().inExperiment(sourceExperiment));
-        ExternalData dataset = create(aDataSet().inSample(sample));
+        AbstractExternalData dataset = create(aDataSet().inSample(sample));
 
         perform(anUpdateOf(dataset).toExperiment(destinationExperiment));
 
@@ -75,7 +75,7 @@ public class AssignDataSetToExperimentTest extends BaseTest
             throws Exception
     {
         Sample sample = create(aSample().inExperiment(sourceExperiment));
-        ExternalData dataset = create(aDataSet().inSample(sample));
+        AbstractExternalData dataset = create(aDataSet().inSample(sample));
 
         perform(anUpdateOf(dataset).toExperiment(destinationExperiment));
 
@@ -85,8 +85,8 @@ public class AssignDataSetToExperimentTest extends BaseTest
     @Test
     public void childDataSetCanBeAssignedToAnotherExperiment() throws Exception
     {
-        ExternalData parent = create(aDataSet().inExperiment(sourceExperiment));
-        ExternalData child = create(aDataSet().inExperiment(sourceExperiment).withParent(parent));
+        AbstractExternalData parent = create(aDataSet().inExperiment(sourceExperiment));
+        AbstractExternalData child = create(aDataSet().inExperiment(sourceExperiment).withParent(parent));
 
         perform(anUpdateOf(child).toExperiment(destinationExperiment));
 
@@ -97,8 +97,8 @@ public class AssignDataSetToExperimentTest extends BaseTest
     public void experimentAssignmentOfParentDataSetIsNotChangedWhenChildDataSetIsAssignedToAnotherExperiment()
             throws Exception
     {
-        ExternalData parent = create(aDataSet().inExperiment(sourceExperiment));
-        ExternalData child = create(aDataSet().inExperiment(sourceExperiment).withParent(parent));
+        AbstractExternalData parent = create(aDataSet().inExperiment(sourceExperiment));
+        AbstractExternalData child = create(aDataSet().inExperiment(sourceExperiment).withParent(parent));
 
         perform(anUpdateOf(child).toExperiment(destinationExperiment));
 
@@ -108,7 +108,7 @@ public class AssignDataSetToExperimentTest extends BaseTest
     @Test
     public void parentDataSetCanBeAssignedToAnotherExperiment() throws Exception
     {
-        ExternalData parent = create(aDataSet().inExperiment(sourceExperiment));
+        AbstractExternalData parent = create(aDataSet().inExperiment(sourceExperiment));
         create(aDataSet().inExperiment(sourceExperiment).withParent(parent));
 
         perform(anUpdateOf(parent).toExperiment(destinationExperiment));
@@ -120,8 +120,8 @@ public class AssignDataSetToExperimentTest extends BaseTest
     public void experimentAssignmentOfChildDataSetIsNotChangedWhenParentDatasetIsAssignedToAnotherExperiment()
             throws Exception
     {
-        ExternalData parent = create(aDataSet().inExperiment(sourceExperiment));
-        ExternalData child = create(aDataSet().inExperiment(sourceExperiment).withParent(parent));
+        AbstractExternalData parent = create(aDataSet().inExperiment(sourceExperiment));
+        AbstractExternalData child = create(aDataSet().inExperiment(sourceExperiment).withParent(parent));
 
         perform(anUpdateOf(parent).toExperiment(destinationExperiment));
 
@@ -131,7 +131,7 @@ public class AssignDataSetToExperimentTest extends BaseTest
     @Test
     public void componentDataSetCanBeAssignedToAnotherExperiment() throws Exception
     {
-        ExternalData component = create(aDataSet().inExperiment(sourceExperiment));
+        AbstractExternalData component = create(aDataSet().inExperiment(sourceExperiment));
         create(aDataSet().inExperiment(sourceExperiment).withComponent(component));
 
         perform(anUpdateOf(component).toExperiment(destinationExperiment));
@@ -143,8 +143,8 @@ public class AssignDataSetToExperimentTest extends BaseTest
     public void experimentAssignmentOfContainerDataSetIsNotChangedWhenComponentDataSetIsAssignedToAnotherExperiment()
             throws Exception
     {
-        ExternalData component = create(aDataSet().inExperiment(sourceExperiment));
-        ExternalData container =
+        AbstractExternalData component = create(aDataSet().inExperiment(sourceExperiment));
+        AbstractExternalData container =
                 create(aDataSet().inExperiment(sourceExperiment).withComponent(component));
 
         perform(anUpdateOf(component).toExperiment(destinationExperiment));
@@ -155,8 +155,8 @@ public class AssignDataSetToExperimentTest extends BaseTest
     @Test
     public void containerDataSetCanBeAssignedToAnotherExperiment() throws Exception
     {
-        ExternalData component = create(aDataSet().inExperiment(sourceExperiment));
-        ExternalData container =
+        AbstractExternalData component = create(aDataSet().inExperiment(sourceExperiment));
+        AbstractExternalData container =
                 create(aDataSet().inExperiment(sourceExperiment).withComponent(component));
 
         perform(anUpdateOf(container).toExperiment(destinationExperiment));
@@ -168,8 +168,8 @@ public class AssignDataSetToExperimentTest extends BaseTest
     public void experimentAssignmentOfComponentDataSetIsNotChangedWhenContainerDataSetIsAssignedToAnotherExperiment()
             throws Exception
     {
-        ExternalData component = create(aDataSet().inExperiment(sourceExperiment));
-        ExternalData container =
+        AbstractExternalData component = create(aDataSet().inExperiment(sourceExperiment));
+        AbstractExternalData container =
                 create(aDataSet().inExperiment(sourceExperiment).withComponent(component));
 
         perform(anUpdateOf(container).toExperiment(destinationExperiment));
@@ -188,7 +188,7 @@ public class AssignDataSetToExperimentTest extends BaseTest
             RoleWithHierarchy destinationSpaceRole, RoleWithHierarchy instanceRole)
             throws Exception
     {
-        ExternalData dataset = create(aDataSet().inExperiment(sourceExperiment));
+        AbstractExternalData dataset = create(aDataSet().inExperiment(sourceExperiment));
         String user =
                 create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace)
                         .withSpaceRole(destinationSpaceRole, destinationSpace)
@@ -205,7 +205,7 @@ public class AssignDataSetToExperimentTest extends BaseTest
             RoleWithHierarchy sourceSpaceRole, RoleWithHierarchy destinationSpaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
-        ExternalData dataset = create(aDataSet().inExperiment(sourceExperiment));
+        AbstractExternalData dataset = create(aDataSet().inExperiment(sourceExperiment));
         String user =
                 create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace)
                         .withSpaceRole(destinationSpaceRole, destinationSpace)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignDataSetToSampleTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignDataSetToSampleTest.java
index 1612093c9b15915847083546f82545de9515b8e0..608e8168bb0f03acf8db4a0d708040a88f92144a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignDataSetToSampleTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignDataSetToSampleTest.java
@@ -25,7 +25,7 @@ import org.testng.annotations.Test;
 import ch.systemsx.cisd.common.exceptions.AuthorizationFailureException;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -57,7 +57,7 @@ public class AssignDataSetToSampleTest extends BaseTest
     @Test
     public void dataSetWithSampleCanBeAssignedToAnotherSample() throws Exception
     {
-        ExternalData dataset = create(aDataSet().inSample(sourceSample));
+        AbstractExternalData dataset = create(aDataSet().inSample(sourceSample));
 
         perform(anUpdateOf(dataset).toSample(destinationSample));
 
@@ -67,7 +67,7 @@ public class AssignDataSetToSampleTest extends BaseTest
     @Test
     public void dataSetIsAssignedWithTheExperimentOfTheNewSample() throws Exception
     {
-        ExternalData dataset = create(aDataSet().inSample(sourceSample));
+        AbstractExternalData dataset = create(aDataSet().inSample(sourceSample));
 
         perform(anUpdateOf(dataset).toSample(destinationSample));
 
@@ -77,7 +77,7 @@ public class AssignDataSetToSampleTest extends BaseTest
     @Test
     public void dataSetWithoutSampleCanBeAssignedToSample() throws Exception
     {
-        ExternalData dataset = create(aDataSet().inExperiment(sourceExperiment));
+        AbstractExternalData dataset = create(aDataSet().inExperiment(sourceExperiment));
 
         perform(anUpdateOf(dataset).toSample(destinationSample));
 
@@ -89,7 +89,7 @@ public class AssignDataSetToSampleTest extends BaseTest
     public void dataSetCannotBeAssignedToSpaceSample() throws Exception
     {
         Sample sample = create(aSample().inSpace(destinationSpace));
-        ExternalData dataset = create(aDataSet().inSample(sourceSample));
+        AbstractExternalData dataset = create(aDataSet().inSample(sourceSample));
 
         perform(anUpdateOf(dataset).toSample(sample));
     }
@@ -99,7 +99,7 @@ public class AssignDataSetToSampleTest extends BaseTest
     public void dataSetCannotBeAssignedToSharedSample() throws Exception
     {
         Sample sample = create(aSample());
-        ExternalData dataset = create(aDataSet().inSample(sourceSample));
+        AbstractExternalData dataset = create(aDataSet().inSample(sourceSample));
 
         perform(anUpdateOf(dataset).toSample(sample));
     }
@@ -107,8 +107,8 @@ public class AssignDataSetToSampleTest extends BaseTest
     @Test
     public void childDataSetCanBeAssignedToAnotherSample() throws Exception
     {
-        ExternalData parent = create(aDataSet().inSample(sourceSample));
-        ExternalData child = create(aDataSet().inSample(sourceSample).withParent(parent));
+        AbstractExternalData parent = create(aDataSet().inSample(sourceSample));
+        AbstractExternalData child = create(aDataSet().inSample(sourceSample).withParent(parent));
 
         perform(anUpdateOf(child).toSample(destinationSample));
 
@@ -119,8 +119,8 @@ public class AssignDataSetToSampleTest extends BaseTest
     public void sampleAssignmentOfParentDataSetIsNotChangedWhenChildDataSetIsAssignedToAnotherSample()
             throws Exception
     {
-        ExternalData parent = create(aDataSet().inSample(sourceSample));
-        ExternalData child = create(aDataSet().inSample(sourceSample).withParent(parent));
+        AbstractExternalData parent = create(aDataSet().inSample(sourceSample));
+        AbstractExternalData child = create(aDataSet().inSample(sourceSample).withParent(parent));
 
         perform(anUpdateOf(child).toSample(destinationSample));
 
@@ -130,7 +130,7 @@ public class AssignDataSetToSampleTest extends BaseTest
     @Test
     public void parentDataSetCanBeAssignedToAnotherSample() throws Exception
     {
-        ExternalData parent = create(aDataSet().inSample(sourceSample));
+        AbstractExternalData parent = create(aDataSet().inSample(sourceSample));
         create(aDataSet().inSample(sourceSample).withParent(parent));
 
         perform(anUpdateOf(parent).toSample(destinationSample));
@@ -142,8 +142,8 @@ public class AssignDataSetToSampleTest extends BaseTest
     public void sampleAssignmentOfChildDataSetIsNotChangedWhenParentDatasetIsAssignedToAnotherSample()
             throws Exception
     {
-        ExternalData parent = create(aDataSet().inSample(sourceSample));
-        ExternalData child = create(aDataSet().inSample(sourceSample).withParent(parent));
+        AbstractExternalData parent = create(aDataSet().inSample(sourceSample));
+        AbstractExternalData child = create(aDataSet().inSample(sourceSample).withParent(parent));
 
         perform(anUpdateOf(parent).toSample(destinationSample));
 
@@ -153,7 +153,7 @@ public class AssignDataSetToSampleTest extends BaseTest
     @Test
     public void componentDataSetCanBeAssignedToAnotherSample() throws Exception
     {
-        ExternalData component = create(aDataSet().inSample(sourceSample));
+        AbstractExternalData component = create(aDataSet().inSample(sourceSample));
         create(aDataSet().inSample(sourceSample).withComponent(component));
 
         perform(anUpdateOf(component).toSample(destinationSample));
@@ -165,8 +165,8 @@ public class AssignDataSetToSampleTest extends BaseTest
     public void sampleAssignmentOfContainerDataSetIsNotChangedWhenComponentDataSetIsAssignedToAnotherSample()
             throws Exception
     {
-        ExternalData component = create(aDataSet().inSample(sourceSample));
-        ExternalData container = create(aDataSet().inSample(sourceSample).withComponent(component));
+        AbstractExternalData component = create(aDataSet().inSample(sourceSample));
+        AbstractExternalData container = create(aDataSet().inSample(sourceSample).withComponent(component));
 
         perform(anUpdateOf(component).toSample(destinationSample));
 
@@ -176,8 +176,8 @@ public class AssignDataSetToSampleTest extends BaseTest
     @Test
     public void containerDataSetCanBeAssignedToAnotherSample() throws Exception
     {
-        ExternalData component = create(aDataSet().inSample(sourceSample));
-        ExternalData container = create(aDataSet().inSample(sourceSample).withComponent(component));
+        AbstractExternalData component = create(aDataSet().inSample(sourceSample));
+        AbstractExternalData container = create(aDataSet().inSample(sourceSample).withComponent(component));
 
         perform(anUpdateOf(container).toSample(destinationSample));
 
@@ -188,8 +188,8 @@ public class AssignDataSetToSampleTest extends BaseTest
     public void sampleAssignmentOfComponentDataSetIsNotChangedWhenContainerDataSetIsAssignedToAnotherSample()
             throws Exception
     {
-        ExternalData component = create(aDataSet().inSample(sourceSample));
-        ExternalData container = create(aDataSet().inSample(sourceSample).withComponent(component));
+        AbstractExternalData component = create(aDataSet().inSample(sourceSample));
+        AbstractExternalData container = create(aDataSet().inSample(sourceSample).withComponent(component));
 
         perform(anUpdateOf(container).toSample(destinationSample));
 
@@ -199,7 +199,7 @@ public class AssignDataSetToSampleTest extends BaseTest
     @Test
     public void dataSetCanBeUnassignedFromSample() throws Exception
     {
-        ExternalData data = create(aDataSet().inSample(sourceSample));
+        AbstractExternalData data = create(aDataSet().inSample(sourceSample));
 
         perform(anUpdateOf(data).removingSample());
 
@@ -218,7 +218,7 @@ public class AssignDataSetToSampleTest extends BaseTest
             RoleWithHierarchy destinationSpaceRole, RoleWithHierarchy instanceRole)
             throws Exception
     {
-        ExternalData dataset = create(aDataSet().inSample(sourceSample));
+        AbstractExternalData dataset = create(aDataSet().inSample(sourceSample));
         String user =
                 create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace)
                         .withSpaceRole(destinationSpaceRole, destinationSpace)
@@ -235,7 +235,7 @@ public class AssignDataSetToSampleTest extends BaseTest
             RoleWithHierarchy destinationSpaceRole, RoleWithHierarchy instanceRole)
             throws Exception
     {
-        ExternalData dataset = create(aDataSet().inSample(sourceSample));
+        AbstractExternalData dataset = create(aDataSet().inSample(sourceSample));
         String user =
                 create(aSession().withSpaceRole(sourceSpaceRole, sourceSpace)
                         .withSpaceRole(destinationSpaceRole, destinationSpace)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignSampleToExperimentTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignSampleToExperimentTest.java
index 70a7cb2106eec6a1c756facfcad397e3f4ac402a..a9ae719fb643870c6c8aa08b1329de0877042743 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignSampleToExperimentTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/AssignSampleToExperimentTest.java
@@ -25,7 +25,7 @@ import org.testng.annotations.Test;
 import ch.systemsx.cisd.common.exceptions.AuthorizationFailureException;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -78,7 +78,7 @@ public class AssignSampleToExperimentTest extends BaseTest
     public void dataSetsOfSampleAreAssociatedWithNewExperiment() throws Exception
     {
         Sample sample = create(aSample().inExperiment(sourceExperiment));
-        ExternalData dataSet = create(aDataSet().inSample(sample));
+        AbstractExternalData dataSet = create(aDataSet().inSample(sample));
 
         perform(anUpdateOf(sample).toExperiment(destinationExperiment));
 
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/CommonServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/CommonServerTest.java
index 655b3946448112e6876e866d521a2e638d5bdafc..d4a672f98c8667692b60c03c2759662661010346 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/CommonServerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/CommonServerTest.java
@@ -31,7 +31,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
 /**
@@ -78,7 +78,7 @@ public class CommonServerTest extends SystemTestCase
     @Test
     public void testGetDataSetWithAssignedPropertyTypesAndProperties()
     {
-        ExternalData dataSet = commonServer.getDataSetInfo(systemSessionToken, new TechId(14));
+        AbstractExternalData dataSet = commonServer.getDataSetInfo(systemSessionToken, new TechId(14));
 
         assertEquals("20110509092359990-11", dataSet.getCode());
         DataSetType dataSetType = dataSet.getDataSetType();
@@ -91,29 +91,29 @@ public class CommonServerTest extends SystemTestCase
     @Test
     public void testGetContainerDataSetWithContainedDataSets()
     {
-        ExternalData dataSet = commonServer.getDataSetInfo(systemSessionToken, new TechId(13));
+        AbstractExternalData dataSet = commonServer.getDataSetInfo(systemSessionToken, new TechId(13));
 
         assertEquals("20110509092359990-10", dataSet.getCode());
         assertEquals(true, dataSet.isContainer());
         ContainerDataSet containerDataSet = dataSet.tryGetAsContainerDataSet();
-        List<ExternalData> containedDataSets = containerDataSet.getContainedDataSets();
+        List<AbstractExternalData> containedDataSets = containerDataSet.getContainedDataSets();
         assertEntities("[20110509092359990-11, 20110509092359990-12]", containedDataSets);
     }
 
     @Test
     public void testGetDataSetWithChildrenAndParents()
     {
-        ExternalData dataSet = commonServer.getDataSetInfo(systemSessionToken, new TechId(10));
+        AbstractExternalData dataSet = commonServer.getDataSetInfo(systemSessionToken, new TechId(10));
 
         assertEquals("20081105092259900-0", dataSet.getCode());
         assertEntities("[20081105092359990-2]", dataSet.getChildren());
-        assertEntities("[20081105092259000-9]", new ArrayList<ExternalData>(dataSet.getParents()));
+        assertEntities("[20081105092259000-9]", new ArrayList<AbstractExternalData>(dataSet.getParents()));
     }
 
     @Test
     public void testGetDataSetWithSample()
     {
-        ExternalData dataSet = commonServer.getDataSetInfo(systemSessionToken, new TechId(5));
+        AbstractExternalData dataSet = commonServer.getDataSetInfo(systemSessionToken, new TechId(5));
 
         assertEquals("20081105092159111-1", dataSet.getCode());
         assertEquals("/CISD/CP-TEST-1", dataSet.getSampleIdentifier());
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DataSetListingTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DataSetListingTest.java
index d5a56d3faf8c3b830f800029a08d136d5d58db7e..859d6f8730ef7b5a6d579ffca03a528873b2d076 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DataSetListingTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DataSetListingTest.java
@@ -28,7 +28,7 @@ import ch.systemsx.cisd.common.shared.basic.string.CommaSeparatedListBuilder;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
 
 /**
@@ -41,13 +41,13 @@ public class DataSetListingTest extends SystemTestCase
     public void testListExperimentDataSetsDirectlyConnected()
     {
         logIntoCommonClientService();
-        DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria =
-                new DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>>();
+        DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> criteria =
+                new DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>>();
 
-        TypedTableResultSet<ExternalData> resultSet =
+        TypedTableResultSet<AbstractExternalData> resultSet =
                 commonClientService.listExperimentDataSets(new TechId(18), criteria, true);
 
-        List<ExternalData> dataSets = asList(resultSet);
+        List<AbstractExternalData> dataSets = asList(resultSet);
         assertEquals("20081105092159111-1", dataSets.get(0).getCode());
         assertProperties(
                 "[ANY_MATERIAL: 1000_C (SIRNA), BACTERIUM: BACTERIUM1 (BACTERIUM), COMMENT: no comment, GENDER: FEMALE]",
@@ -59,17 +59,17 @@ public class DataSetListingTest extends SystemTestCase
     public void testListExperimentDataSetsAlsoIndirectlyConnected()
     {
         logIntoCommonClientService();
-        DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>> criteria =
-                new DefaultResultSetConfig<String, TableModelRowWithObject<ExternalData>>();
+        DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>> criteria =
+                new DefaultResultSetConfig<String, TableModelRowWithObject<AbstractExternalData>>();
 
-        TypedTableResultSet<ExternalData> resultSet =
+        TypedTableResultSet<AbstractExternalData> resultSet =
                 commonClientService.listExperimentDataSets(new TechId(19), criteria, false);
 
-        List<ExternalData> dataSets = asList(resultSet);
-        Collections.sort(dataSets, new Comparator<ExternalData>()
+        List<AbstractExternalData> dataSets = asList(resultSet);
+        Collections.sort(dataSets, new Comparator<AbstractExternalData>()
             {
                 @Override
-                public int compare(ExternalData e1, ExternalData e2)
+                public int compare(AbstractExternalData e1, AbstractExternalData e2)
                 {
                     return e1.getCode().compareTo(e2.getCode());
                 }
@@ -92,10 +92,10 @@ public class DataSetListingTest extends SystemTestCase
         assertEquals(6, dataSets.size());
     }
 
-    private void assertDataSets(String expectedCodes, List<ExternalData> dataSets)
+    private void assertDataSets(String expectedCodes, List<AbstractExternalData> dataSets)
     {
         CommaSeparatedListBuilder builder = new CommaSeparatedListBuilder();
-        for (ExternalData dataSet : dataSets)
+        for (AbstractExternalData dataSet : dataSets)
         {
             builder.append(dataSet.getCode());
         }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DeleteDataSetBeforePostRegistrationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DeleteDataSetBeforePostRegistrationTest.java
index 14aed3277bf7eb825686208ff2e0758fc9972fca..5db17d29dde43e1aa2ed0faccbeda902071c4683 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DeleteDataSetBeforePostRegistrationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/DeleteDataSetBeforePostRegistrationTest.java
@@ -24,7 +24,7 @@ import org.testng.annotations.BeforeClass;
 import org.testng.annotations.Test;
 
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
@@ -44,7 +44,7 @@ public class DeleteDataSetBeforePostRegistrationTest extends BaseTest
     public void emptyTrashWithDataSetInPostRegistrationQueue() throws Exception
     {
         assertEquals(0, getDataSetsForPostRegistration().size());
-        ExternalData dataSet = create(aDataSet().inSample(sample));
+        AbstractExternalData dataSet = create(aDataSet().inSample(sample));
 
         daoFactory.getPostRegistrationDAO().addDataSet(dataSet.getCode());
         assertEquals(1, getDataSetsForPostRegistration().size());
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityOperationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityOperationTest.java
index 55bffbccc0c631fdeb057acaf0bec5368015e149..8a653068500e666c64e2dea7414079124bc64ad7 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityOperationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/EntityOperationTest.java
@@ -34,7 +34,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetBatchUpdateDetails;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialIdentifier;
@@ -219,7 +219,7 @@ public class EntityOperationTest extends SystemTestCase
             return this;
         }
 
-        EntityOperationBuilder dataSet(ExternalData dataSet)
+        EntityOperationBuilder dataSet(AbstractExternalData dataSet)
         {
             NewExternalData newExternalData = new NewExternalData();
             newExternalData.setCode(dataSet.getCode());
@@ -257,7 +257,7 @@ public class EntityOperationTest extends SystemTestCase
             return this;
         }
 
-        EntityOperationBuilder dataSetUpdate(ExternalData dataSet)
+        EntityOperationBuilder dataSetUpdate(AbstractExternalData dataSet)
         {
             DataSetBatchUpdatesDTO dataSetUpdate = new DataSetBatchUpdatesDTO();
             dataSetUpdate.setDetails(new DataSetBatchUpdateDetails());
@@ -766,7 +766,7 @@ public class EntityOperationTest extends SystemTestCase
 
         AtomicEntityOperationResult result = etlService.performEntityOperations(sessionToken, eo);
         assertEquals(1, result.getDataSetsCreatedCount());
-        ExternalData dataSet = etlService.tryGetDataSet(sessionToken, dataSetCode);
+        AbstractExternalData dataSet = etlService.tryGetDataSet(sessionToken, dataSetCode);
 
         assertEquals(dataSetCode, dataSet.getCode());
         assertEquals("HCS_IMAGE", dataSet.getDataSetType().getCode());
@@ -794,7 +794,7 @@ public class EntityOperationTest extends SystemTestCase
 
         AtomicEntityOperationResult result = etlService.performEntityOperations(sessionToken, eo);
         assertEquals(1, result.getDataSetsCreatedCount());
-        ExternalData dataSet = etlService.tryGetDataSet(sessionToken, dataSetCode);
+        AbstractExternalData dataSet = etlService.tryGetDataSet(sessionToken, dataSetCode);
 
         assertEquals(dataSetCode, dataSet.getCode());
         assertEquals("HCS_IMAGE", dataSet.getDataSetType().getCode());
@@ -828,7 +828,7 @@ public class EntityOperationTest extends SystemTestCase
     public void testUpdateDataSetAsSpaceETLServerSucessfully()
     {
         String sessionToken = authenticateAs(SPACE_ETL_SERVER_FOR_A);
-        ExternalData dataSet = commonServer.getDataSetInfo(systemSessionToken, new TechId(4));
+        AbstractExternalData dataSet = commonServer.getDataSetInfo(systemSessionToken, new TechId(4));
         dataSet.setDataSetProperties(new DataSetBuilder().property("COMMENT", "hello").getDataSet()
                 .getProperties());
         AtomicEntityOperationDetails eo =
@@ -837,7 +837,7 @@ public class EntityOperationTest extends SystemTestCase
         AtomicEntityOperationResult result = etlService.performEntityOperations(sessionToken, eo);
         assertEquals(1, result.getDataSetsUpdatedCount());
 
-        ExternalData updatedDataSet = etlService.tryGetDataSet(sessionToken, dataSet.getCode());
+        AbstractExternalData updatedDataSet = etlService.tryGetDataSet(sessionToken, dataSet.getCode());
         assertEquals(new Long(4), updatedDataSet.getId());
         assertEquals("[COMMENT: hello]", updatedDataSet.getProperties().toString());
     }
@@ -846,7 +846,7 @@ public class EntityOperationTest extends SystemTestCase
     public void testUpdateDataSetAsInstanceAdminButLoginAsSpaceETLServerSucessfully()
     {
         String sessionToken = authenticateAs(SPACE_ETL_SERVER_FOR_A);
-        ExternalData dataSet = commonServer.getDataSetInfo(systemSessionToken, new TechId(4));
+        AbstractExternalData dataSet = commonServer.getDataSetInfo(systemSessionToken, new TechId(4));
         dataSet.setDataSetProperties(new DataSetBuilder().property("COMMENT", "hello").getDataSet()
                 .getProperties());
         AtomicEntityOperationDetails eo =
@@ -855,7 +855,7 @@ public class EntityOperationTest extends SystemTestCase
         AtomicEntityOperationResult result = etlService.performEntityOperations(sessionToken, eo);
         assertEquals(1, result.getDataSetsUpdatedCount());
 
-        ExternalData updatedDataSet = etlService.tryGetDataSet(sessionToken, dataSet.getCode());
+        AbstractExternalData updatedDataSet = etlService.tryGetDataSet(sessionToken, dataSet.getCode());
         assertEquals(new Long(4), updatedDataSet.getId());
         assertEquals("[COMMENT: hello]", updatedDataSet.getProperties().toString());
     }
@@ -864,7 +864,7 @@ public class EntityOperationTest extends SystemTestCase
     public void testUpdateDataSetAsSpaceETLServerThrowsAuthorizationFailure()
     {
         String sessionToken = authenticateAs(SPACE_ETL_SERVER_FOR_A);
-        ExternalData dataSet = commonServer.getDataSetInfo(systemSessionToken, new TechId(4));
+        AbstractExternalData dataSet = commonServer.getDataSetInfo(systemSessionToken, new TechId(4));
         AtomicEntityOperationDetails eo =
                 new EntityOperationBuilder().user(SPACE_ETL_SERVER_FOR_B).dataSetUpdate(dataSet)
                         .create();
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/PropertiesHistoryTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/PropertiesHistoryTest.java
index f54d091bad864030f16e198262a3fd85b35c9d92..6cdfc0fc298230629b252acf1fe9bd41f3ef8339 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/PropertiesHistoryTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/PropertiesHistoryTest.java
@@ -43,7 +43,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityHistory;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentUpdates;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewETPTAssignment;
@@ -241,7 +241,7 @@ public class PropertiesHistoryTest extends SystemTestCase
     {
         TechId id = new TechId(5);
         logIntoCommonClientService();
-        ExternalData dataSet = genericClientService.getDataSetInfo(id);
+        AbstractExternalData dataSet = genericClientService.getDataSetInfo(id);
 
         DataSetUpdates updates = new DataSetUpdates();
         updates.setDatasetId(id);
@@ -292,7 +292,7 @@ public class PropertiesHistoryTest extends SystemTestCase
         logIntoCommonClientService();
         commonClientService.updatePropertyTypeAssignment(new NewETPTAssignment(EntityKind.DATA_SET,
                 "COMMENT", "HCS_IMAGE", false, null, null, 1L, false, false, null, true, false));
-        ExternalData dataSet = genericClientService.getDataSetInfo(id);
+        AbstractExternalData dataSet = genericClientService.getDataSetInfo(id);
         assertEquals(4, dataSet.getProperties().size());
 
         DataSetUpdates updates = new DataSetUpdates();
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java
index b6745e81773f2eda9712df549b8ea8c664be9b00..684db5cd76d0386ccb7e933b560ef62f4e00ab8e 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/RelationshipServiceAuthorizationTest.java
@@ -22,7 +22,7 @@ import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.common.exceptions.AuthorizationFailureException;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -68,9 +68,9 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
 
     Sample sharedSample;
 
-    ExternalData sourceDataSet;
+    AbstractExternalData sourceDataSet;
 
-    ExternalData destinationDataSet;
+    AbstractExternalData destinationDataSet;
 
     @BeforeClass(dependsOnMethods = "loginAsSystem")
     public void createFixture() throws Exception
@@ -914,7 +914,7 @@ public class RelationshipServiceAuthorizationTest extends BaseTest
         return daoFactory.getSampleDAO().tryToFindByPermID(sample.getPermId());
     }
 
-    DataPE pe(ExternalData data)
+    DataPE pe(AbstractExternalData data)
     {
         return daoFactory.getDataDAO().tryToFindDataSetByCode(data.getCode());
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/UpdateDataSetContainmentTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/UpdateDataSetContainmentTest.java
index d5c98acc362b4458856ceed46767a70a8247027e..44a900a7ffba29933fbe7e36909ca2d0cdf4ba4c 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/UpdateDataSetContainmentTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/UpdateDataSetContainmentTest.java
@@ -23,7 +23,7 @@ import org.testng.annotations.Test;
 import ch.systemsx.cisd.common.exceptions.AuthorizationFailureException;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -47,8 +47,8 @@ public class UpdateDataSetContainmentTest extends BaseTest
     public void dataSetCanBeSetToBeContainedByAnotherDataSetByUpdatingTheContainerDataSet()
             throws Exception
     {
-        ExternalData componentCandidate = create(aDataSet().inSample(sample));
-        ExternalData container = create(aDataSet().inSample(sample).asContainer());
+        AbstractExternalData componentCandidate = create(aDataSet().inSample(sample));
+        AbstractExternalData container = create(aDataSet().inSample(sample).asContainer());
 
         perform(anUpdateOf(container).withComponent(componentCandidate));
 
@@ -59,8 +59,8 @@ public class UpdateDataSetContainmentTest extends BaseTest
     public void dataSetCanBeSetToBeContainedByAnotherDataSetByUpdatingTheComponentDataSet()
             throws Exception
     {
-        ExternalData componentCandidate = create(aDataSet().inSample(sample));
-        ExternalData container = create(aDataSet().inSample(sample).asContainer());
+        AbstractExternalData componentCandidate = create(aDataSet().inSample(sample));
+        AbstractExternalData container = create(aDataSet().inSample(sample).asContainer());
 
         perform(anUpdateOf(componentCandidate).withContainer(container));
 
@@ -70,8 +70,8 @@ public class UpdateDataSetContainmentTest extends BaseTest
     @Test
     public void dataSetWithContainerTypeCanBeContainerOfAnotherDataSet() throws Exception
     {
-        ExternalData container = create(aDataSet().inSample(sample).asContainer());
-        ExternalData component = create(aDataSet().inSample(sample));
+        AbstractExternalData container = create(aDataSet().inSample(sample).asContainer());
+        AbstractExternalData component = create(aDataSet().inSample(sample));
 
         perform(anUpdateOf(component).withContainer(container));
 
@@ -81,8 +81,8 @@ public class UpdateDataSetContainmentTest extends BaseTest
     @Test
     public void dataSetWithContainerTypeCanHaveComponents() throws Exception
     {
-        ExternalData container = create(aDataSet().inSample(sample).asContainer());
-        ExternalData component = create(aDataSet().inSample(sample));
+        AbstractExternalData container = create(aDataSet().inSample(sample).asContainer());
+        AbstractExternalData component = create(aDataSet().inSample(sample));
 
         perform(anUpdateOf(container).withComponent(component));
 
@@ -92,8 +92,8 @@ public class UpdateDataSetContainmentTest extends BaseTest
     @Test(expectedExceptions = UserFailureException.class)
     public void dataSetWithComponentTypeCannotBeContainerOfAnotherDataSet() throws Exception
     {
-        ExternalData component1 = create(aDataSet().inSample(sample));
-        ExternalData component2 = create(aDataSet().inSample(sample));
+        AbstractExternalData component1 = create(aDataSet().inSample(sample));
+        AbstractExternalData component2 = create(aDataSet().inSample(sample));
 
         perform(anUpdateOf(component1).withContainer(component2));
     }
@@ -101,8 +101,8 @@ public class UpdateDataSetContainmentTest extends BaseTest
     @Test(expectedExceptions = UserFailureException.class)
     public void dataSetWithComponentTypeCannotHaveComponents() throws Exception
     {
-        ExternalData component1 = create(aDataSet().inSample(sample));
-        ExternalData component2 = create(aDataSet().inSample(sample));
+        AbstractExternalData component1 = create(aDataSet().inSample(sample));
+        AbstractExternalData component2 = create(aDataSet().inSample(sample));
 
         perform(anUpdateOf(component1).withComponent(component2));
     }
@@ -110,9 +110,9 @@ public class UpdateDataSetContainmentTest extends BaseTest
     @Test(expectedExceptions = UserFailureException.class)
     public void dataSetCannotBeSelfContainedViaContainerRelation() throws Exception
     {
-        ExternalData component1 = create(aDataSet().inSample(sample).asContainer());
-        ExternalData component2 = create(aDataSet().inSample(sample).asContainer());
-        ExternalData component3 = create(aDataSet().inSample(sample).asContainer());
+        AbstractExternalData component1 = create(aDataSet().inSample(sample).asContainer());
+        AbstractExternalData component2 = create(aDataSet().inSample(sample).asContainer());
+        AbstractExternalData component3 = create(aDataSet().inSample(sample).asContainer());
 
         perform(anUpdateOf(component1).withContainer(component2));
         perform(anUpdateOf(component2).withContainer(component3));
@@ -122,9 +122,9 @@ public class UpdateDataSetContainmentTest extends BaseTest
     @Test(expectedExceptions = UserFailureException.class)
     public void dataSetCannotBeSelfContainedViaComponentsRelation() throws Exception
     {
-        ExternalData component1 = create(aDataSet().inSample(sample).asContainer());
-        ExternalData component2 = create(aDataSet().inSample(sample).asContainer());
-        ExternalData component3 = create(aDataSet().inSample(sample).asContainer());
+        AbstractExternalData component1 = create(aDataSet().inSample(sample).asContainer());
+        AbstractExternalData component2 = create(aDataSet().inSample(sample).asContainer());
+        AbstractExternalData component3 = create(aDataSet().inSample(sample).asContainer());
 
         perform(anUpdateOf(component1).withComponent(component2));
         perform(anUpdateOf(component2).withComponent(component3));
@@ -134,8 +134,8 @@ public class UpdateDataSetContainmentTest extends BaseTest
     @Test
     public void containmentCanBeRemoved() throws Exception
     {
-        ExternalData component = create(aDataSet().inSample(sample));
-        ExternalData container =
+        AbstractExternalData component = create(aDataSet().inSample(sample));
+        AbstractExternalData container =
                 create(aDataSet().inSample(sample).asContainer().withComponent(component));
 
         perform(anUpdateOf(container).withComponents());
@@ -146,9 +146,9 @@ public class UpdateDataSetContainmentTest extends BaseTest
     @Test
     public void containerOfDataSetCanBeChanged() throws Exception
     {
-        ExternalData component = create(aDataSet().inSample(sample));
+        AbstractExternalData component = create(aDataSet().inSample(sample));
         create(aDataSet().inSample(sample).asContainer().withComponent(component));
-        ExternalData newContainer = create(aDataSet().inSample(sample).asContainer());
+        AbstractExternalData newContainer = create(aDataSet().inSample(sample).asContainer());
 
         perform(anUpdateOf(newContainer).withComponent(component));
 
@@ -159,7 +159,7 @@ public class UpdateDataSetContainmentTest extends BaseTest
         { UserFailureException.class })
     public void dataSetCannotContainItself() throws Exception
     {
-        ExternalData dataset = create(aDataSet().inSample(sample));
+        AbstractExternalData dataset = create(aDataSet().inSample(sample));
 
         perform(anUpdateOf(dataset).withComponent(dataset));
     }
@@ -168,10 +168,10 @@ public class UpdateDataSetContainmentTest extends BaseTest
         { UserFailureException.class })
     public void subcomponentsAreNotAllowed() throws Exception
     {
-        ExternalData component = create(aDataSet().inSample(sample));
-        ExternalData container =
+        AbstractExternalData component = create(aDataSet().inSample(sample));
+        AbstractExternalData container =
                 create(aDataSet().inSample(sample).asContainer().withComponent(component));
-        ExternalData subcomponent = create(aDataSet().inSample(sample));
+        AbstractExternalData subcomponent = create(aDataSet().inSample(sample));
 
         perform(anUpdateOf(component).withComponent(subcomponent));
 
@@ -187,8 +187,8 @@ public class UpdateDataSetContainmentTest extends BaseTest
         Project containerProject = create(aProject().inSpace(containerSpace));
         Experiment containerExperiment = create(anExperiment().inProject(containerProject));
         Sample containerSample = create(aSample().inExperiment(containerExperiment));
-        ExternalData container = create(aDataSet().inSample(containerSample));
-        ExternalData component = create(aDataSet().inSample(sample));
+        AbstractExternalData container = create(aDataSet().inSample(containerSample));
+        AbstractExternalData component = create(aDataSet().inSample(sample));
 
         perform(anUpdateOf(container).withComponent(component));
 
@@ -204,8 +204,8 @@ public class UpdateDataSetContainmentTest extends BaseTest
     public void addingContainerToDataSetIsAllowedFor(RoleWithHierarchy spaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
-        ExternalData container = create(aDataSet().inSample(sample));
-        ExternalData component = create(aDataSet().inSample(sample));
+        AbstractExternalData container = create(aDataSet().inSample(sample));
+        AbstractExternalData component = create(aDataSet().inSample(sample));
         String user =
                 create(aSession().withSpaceRole(spaceRole, sample.getSpace())
                         .withInstanceRole(instanceRole)
@@ -220,8 +220,8 @@ public class UpdateDataSetContainmentTest extends BaseTest
     public void addingContainerToDataSetNotIsAllowedFor(RoleWithHierarchy spaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
-        ExternalData container = create(aDataSet().inSample(sample));
-        ExternalData component = create(aDataSet().inSample(sample));
+        AbstractExternalData container = create(aDataSet().inSample(sample));
+        AbstractExternalData component = create(aDataSet().inSample(sample));
         String user =
                 create(aSession().withSpaceRole(spaceRole, sample.getSpace())
                         .withInstanceRole(instanceRole)
@@ -235,8 +235,8 @@ public class UpdateDataSetContainmentTest extends BaseTest
     public void removingContainerFromDataSetIsAllowedFor(RoleWithHierarchy spaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
-        ExternalData component = create(aDataSet().inSample(sample));
-        ExternalData container =
+        AbstractExternalData component = create(aDataSet().inSample(sample));
+        AbstractExternalData container =
                 create(aDataSet().inSample(sample).asContainer().withComponent(component));
 
         String user =
@@ -253,8 +253,8 @@ public class UpdateDataSetContainmentTest extends BaseTest
     public void removingContainerFromDataSetNotIsAllowedFor(RoleWithHierarchy spaceRole,
             RoleWithHierarchy instanceRole) throws Exception
     {
-        ExternalData component = create(aDataSet().inSample(sample));
-        ExternalData container =
+        AbstractExternalData component = create(aDataSet().inSample(sample));
+        AbstractExternalData container =
                 create(aDataSet().inSample(sample).asContainer().withComponent(component));
         String user =
                 create(aSession().withSpaceRole(spaceRole, sample.getSpace())
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/UpdateDataSetParentsTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/UpdateDataSetParentsTest.java
index 1c4102ff04cf0f18671927c22a49c8da83690a66..4a239d9f9ca0f8647d7d94ea51c63c66db9acc2a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/UpdateDataSetParentsTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/UpdateDataSetParentsTest.java
@@ -23,7 +23,7 @@ import org.testng.annotations.Test;
 import ch.systemsx.cisd.common.exceptions.AuthorizationFailureException;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -46,8 +46,8 @@ public class UpdateDataSetParentsTest extends BaseTest
     @Test
     public void dataSetCanBeUpdatedToHaveAnotherDataSetAsItsParent() throws Exception
     {
-        ExternalData parentToBe = create(aDataSet().inSample(sample));
-        ExternalData childToBe = create(aDataSet().inSample(sample));
+        AbstractExternalData parentToBe = create(aDataSet().inSample(sample));
+        AbstractExternalData childToBe = create(aDataSet().inSample(sample));
 
         perform(anUpdateOf(childToBe).withParent(parentToBe));
 
@@ -58,9 +58,9 @@ public class UpdateDataSetParentsTest extends BaseTest
     @Test
     public void dataSetCanBeUpdatedToHaveDifferentParent() throws Exception
     {
-        ExternalData parent = create(aDataSet().inSample(sample));
-        ExternalData child = create(aDataSet().inSample(sample).withParent(parent));
-        ExternalData newParent = create(aDataSet().inSample(sample));
+        AbstractExternalData parent = create(aDataSet().inSample(sample));
+        AbstractExternalData child = create(aDataSet().inSample(sample).withParent(parent));
+        AbstractExternalData newParent = create(aDataSet().inSample(sample));
 
         perform(anUpdateOf(child).withParent(newParent));
 
@@ -72,9 +72,9 @@ public class UpdateDataSetParentsTest extends BaseTest
     @Test
     public void parentOfDataSetCanBeRemoved() throws Exception
     {
-        ExternalData parent1 = create(aDataSet().inSample(sample));
-        ExternalData parent2 = create(aDataSet().inSample(sample));
-        ExternalData child = create(aDataSet().inSample(sample).withParents(parent1, parent2));
+        AbstractExternalData parent1 = create(aDataSet().inSample(sample));
+        AbstractExternalData parent2 = create(aDataSet().inSample(sample));
+        AbstractExternalData child = create(aDataSet().inSample(sample).withParents(parent1, parent2));
 
         perform(anUpdateOf(child).withParent(parent1));
 
@@ -86,9 +86,9 @@ public class UpdateDataSetParentsTest extends BaseTest
     @Test
     public void allParentsOfDataSetCanBeRemoved() throws Exception
     {
-        ExternalData parent1 = create(aDataSet().inSample(sample));
-        ExternalData parent2 = create(aDataSet().inSample(sample));
-        ExternalData child = create(aDataSet().inSample(sample).withParents(parent1, parent2));
+        AbstractExternalData parent1 = create(aDataSet().inSample(sample));
+        AbstractExternalData parent2 = create(aDataSet().inSample(sample));
+        AbstractExternalData child = create(aDataSet().inSample(sample).withParents(parent1, parent2));
 
         perform(anUpdateOf(child).removingParents());
 
@@ -100,9 +100,9 @@ public class UpdateDataSetParentsTest extends BaseTest
     @Test
     public void duplicateParentDefinitionsAreSilentlyDismissed() throws Exception
     {
-        ExternalData parent1 = create(aDataSet().inSample(sample));
-        ExternalData parent2 = create(aDataSet().inSample(sample));
-        ExternalData child = create(aDataSet().inSample(sample));
+        AbstractExternalData parent1 = create(aDataSet().inSample(sample));
+        AbstractExternalData parent2 = create(aDataSet().inSample(sample));
+        AbstractExternalData child = create(aDataSet().inSample(sample));
 
         perform(anUpdateOf(child).withParents(parent1, parent2, parent1, parent2, parent2));
 
@@ -113,7 +113,7 @@ public class UpdateDataSetParentsTest extends BaseTest
         { UserFailureException.class })
     public void dataSetCannotBeItsOwnParent() throws Exception
     {
-        ExternalData data = create(aDataSet().inSample(sample));
+        AbstractExternalData data = create(aDataSet().inSample(sample));
 
         perform(anUpdateOf(data).withParent(data));
     }
@@ -122,8 +122,8 @@ public class UpdateDataSetParentsTest extends BaseTest
         { UserFailureException.class })
     public void dataSetCannotBeItsOwnGrandParent() throws Exception
     {
-        ExternalData parent = create(aDataSet().inSample(sample));
-        ExternalData child = create(aDataSet().inSample(sample).withParent(parent));
+        AbstractExternalData parent = create(aDataSet().inSample(sample));
+        AbstractExternalData child = create(aDataSet().inSample(sample).withParent(parent));
 
         perform(anUpdateOf(parent).withParent(child));
     }
@@ -131,8 +131,8 @@ public class UpdateDataSetParentsTest extends BaseTest
     @Test
     public void parentCanBeInDifferentSpaceThanChild() throws Exception
     {
-        ExternalData parent = create(aDataSet().inSample(parentSample));
-        ExternalData child = create(aDataSet().inSample(childSample));
+        AbstractExternalData parent = create(aDataSet().inSample(parentSample));
+        AbstractExternalData child = create(aDataSet().inSample(childSample));
 
         perform(anUpdateOf(child).withParent(parent));
 
@@ -157,8 +157,8 @@ public class UpdateDataSetParentsTest extends BaseTest
     public void addingParentToDataSetIsAllowedFor(RoleWithHierarchy childSpaceRole,
             RoleWithHierarchy parentSpaceRole, RoleWithHierarchy instanceRole) throws Exception
     {
-        ExternalData parentToBe = create(aDataSet().inSample(parentSample));
-        ExternalData childToBe = create(aDataSet().inSample(childSample));
+        AbstractExternalData parentToBe = create(aDataSet().inSample(parentSample));
+        AbstractExternalData childToBe = create(aDataSet().inSample(childSample));
         String user =
                 create(aSession().withSpaceRole(childSpaceRole, childSpace)
                         .withSpaceRole(parentSpaceRole, parentSpace).withInstanceRole(instanceRole)
@@ -173,8 +173,8 @@ public class UpdateDataSetParentsTest extends BaseTest
     public void addingParentToDataSetNotIsAllowedFor(RoleWithHierarchy childSpaceRole,
             RoleWithHierarchy parentSpaceRole, RoleWithHierarchy instanceRole) throws Exception
     {
-        ExternalData parentToBe = create(aDataSet().inSample(parentSample));
-        ExternalData childToBe = create(aDataSet().inSample(childSample));
+        AbstractExternalData parentToBe = create(aDataSet().inSample(parentSample));
+        AbstractExternalData childToBe = create(aDataSet().inSample(childSample));
         String user =
                 create(aSession().withSpaceRole(childSpaceRole, childSpace)
                         .withSpaceRole(parentSpaceRole, parentSpace).withInstanceRole(instanceRole)
@@ -188,9 +188,9 @@ public class UpdateDataSetParentsTest extends BaseTest
     public void removingParentFromDataSetIsAllowedFor(RoleWithHierarchy childSpaceRole,
             RoleWithHierarchy parentSpaceRole, RoleWithHierarchy instanceRole) throws Exception
     {
-        ExternalData parent1 = create(aDataSet().inSample(parentSample));
-        ExternalData parent2 = create(aDataSet().inSample(parentSample));
-        ExternalData child = create(aDataSet().inSample(childSample).withParents(parent1, parent2));
+        AbstractExternalData parent1 = create(aDataSet().inSample(parentSample));
+        AbstractExternalData parent2 = create(aDataSet().inSample(parentSample));
+        AbstractExternalData child = create(aDataSet().inSample(childSample).withParents(parent1, parent2));
 
         String user =
                 create(aSession().withSpaceRole(childSpaceRole, childSpace)
@@ -206,9 +206,9 @@ public class UpdateDataSetParentsTest extends BaseTest
     public void removingParentFromDataSetNotIsAllowedFor(RoleWithHierarchy childSpaceRole,
             RoleWithHierarchy parentSpaceRole, RoleWithHierarchy instanceRole) throws Exception
     {
-        ExternalData parent1 = create(aDataSet().inSample(parentSample));
-        ExternalData parent2 = create(aDataSet().inSample(parentSample));
-        ExternalData child = create(aDataSet().inSample(childSample).withParents(parent1, parent2));
+        AbstractExternalData parent1 = create(aDataSet().inSample(parentSample));
+        AbstractExternalData parent2 = create(aDataSet().inSample(parentSample));
+        AbstractExternalData child = create(aDataSet().inSample(childSample).withParents(parent1, parent2));
 
         String user =
                 create(aSession().withSpaceRole(childSpaceRole, childSpace)
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
index a4d864fcd8f7dd66936a39f4690effbccef976c1..5fa3222b4430d1ab608b7ea75942754b2a82bbd2 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
@@ -70,7 +70,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SearchSubCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SpaceWithProjectsAndRoleAssignments;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.id.metaproject.MetaprojectIdentifierId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
@@ -786,7 +786,7 @@ public class GeneralInformationServiceTest extends SystemTestCase
         s1.setRegistrationDetails(new EntityRegistrationDetails(
                 new EntityRegistrationDetailsInitializer()));
         Sample sample = new Sample(s1);
-        ExternalData dataSetInfo = genericServer.getDataSetInfo(sessionToken, new TechId(13));
+        AbstractExternalData dataSetInfo = genericServer.getDataSetInfo(sessionToken, new TechId(13));
         DataSetUpdatesDTO updates = new DataSetUpdatesDTO();
         updates.setVersion(dataSetInfo.getVersion());
         updates.setDatasetId(new TechId(dataSetInfo.getId()));
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/BaseTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/BaseTest.java
index 8100ee39e5c75243373540a865efa33b2c4bbcb3..1065160279d2586de92271ee8ea315fae200d35c 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/BaseTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/BaseTest.java
@@ -40,7 +40,7 @@ import ch.systemsx.cisd.openbis.generic.shared.IETLLIMSService;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -277,12 +277,12 @@ public abstract class BaseTest extends AbstractTransactionalTestNGSpringContextT
         return new SampleUpdateBuilder(commonServer, genericServer, refresh(sample));
     }
 
-    protected DataSetUpdateBuilder anUpdateOf(ExternalData dataset)
+    protected DataSetUpdateBuilder anUpdateOf(AbstractExternalData dataset)
     {
         return new DataSetUpdateBuilder(commonServer, genericServer, refresh(dataset));
     }
 
-    protected DataSetDeletionBuilder trash(ExternalData dataset)
+    protected DataSetDeletionBuilder trash(AbstractExternalData dataset)
     {
         return new DataSetDeletionBuilder(commonServer, genericServer, refresh(dataset));
     }
@@ -337,17 +337,17 @@ public abstract class BaseTest extends AbstractTransactionalTestNGSpringContextT
         return new InProjectMatcher(refresh(project));
     }
 
-    protected Matcher<ExternalData> inSample(Sample sample)
+    protected Matcher<AbstractExternalData> inSample(Sample sample)
     {
         return new InSampleMatcher(refresh(sample));
     }
 
-    protected Matcher<ExternalData> hasParents(ExternalData first, ExternalData... rest)
+    protected Matcher<AbstractExternalData> hasParents(AbstractExternalData first, AbstractExternalData... rest)
     {
         return new ExternalDataHasParentsMatcher(refresh(first), refresh(rest));
     }
 
-    protected Matcher<ExternalData> hasChildren(ExternalData first, ExternalData... rest)
+    protected Matcher<AbstractExternalData> hasChildren(AbstractExternalData first, AbstractExternalData... rest)
     {
         return new ExternalDataHasChildrenMatcher(refresh(first), refresh(rest));
     }
@@ -357,12 +357,12 @@ public abstract class BaseTest extends AbstractTransactionalTestNGSpringContextT
         return new HasNoParentMatcher();
     }
 
-    protected Matcher<ExternalData> hasNoChildren()
+    protected Matcher<AbstractExternalData> hasNoChildren()
     {
         return new HasNoChildrenMatcher();
     }
 
-    protected Matcher<ExternalData> hasNoSample()
+    protected Matcher<AbstractExternalData> hasNoSample()
     {
         return new ExternalDataHasNoSampleMatcher();
     }
@@ -382,7 +382,7 @@ public abstract class BaseTest extends AbstractTransactionalTestNGSpringContextT
         return new SampleHasContainerMatcher(refresh(container));
     }
 
-    protected Matcher<ExternalData> hasContainer(ExternalData container)
+    protected Matcher<AbstractExternalData> hasContainer(AbstractExternalData container)
     {
         return new ExternalDataHasContainerMatcher(refresh(container));
     }
@@ -421,11 +421,11 @@ public abstract class BaseTest extends AbstractTransactionalTestNGSpringContextT
         return result;
     }
 
-    protected ExternalData[] refresh(ExternalData[] dataSets)
+    protected AbstractExternalData[] refresh(AbstractExternalData[] dataSets)
     {
-        ExternalData[] result = new ExternalData[dataSets.length];
+        AbstractExternalData[] result = new AbstractExternalData[dataSets.length];
         int i = 0;
-        for (ExternalData data : dataSets)
+        for (AbstractExternalData data : dataSets)
         {
             result[i] = refresh(data);
             i++;
@@ -433,7 +433,7 @@ public abstract class BaseTest extends AbstractTransactionalTestNGSpringContextT
         return result;
     }
 
-    protected ExternalData refresh(ExternalData data)
+    protected AbstractExternalData refresh(AbstractExternalData data)
     {
         return etlService.tryGetDataSet(systemSessionToken, data.getCode());
     }
@@ -487,9 +487,9 @@ public abstract class BaseTest extends AbstractTransactionalTestNGSpringContextT
     public <T> void assertThat(T actual, Matcher<T> matcher)
     {
         T refreshed = actual;
-        if (actual instanceof ExternalData)
+        if (actual instanceof AbstractExternalData)
         {
-            refreshed = (T) refresh((ExternalData) actual);
+            refreshed = (T) refresh((AbstractExternalData) actual);
         } else if (actual instanceof Sample)
         {
             refreshed = (T) refresh((Sample) actual);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/DataSetDeletionBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/DataSetDeletionBuilder.java
index 0b16c46f81cf3ae97f474c8aceb74ff6a79acd2a..263691130a020e89a08240c13d0f0abe1143a326 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/DataSetDeletionBuilder.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/DataSetDeletionBuilder.java
@@ -21,7 +21,7 @@ import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.server.ICommonServerForInternalUse;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.plugin.generic.shared.IGenericServer;
 
 /**
@@ -34,7 +34,7 @@ public class DataSetDeletionBuilder extends UpdateBuilder<List<String>>
     private String dataSetCode;
 
     public DataSetDeletionBuilder(ICommonServerForInternalUse commonServer,
-            IGenericServer genericServer, ExternalData data)
+            IGenericServer genericServer, AbstractExternalData data)
     {
         super(commonServer, genericServer);
         this.dataSetCode = data.getCode();
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/DataSetUpdateBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/DataSetUpdateBuilder.java
index 5fcd29bbc590b786dbea0d232077e2f45a43fb3e..85eb7da77687491742b14142a453cae2949dba0a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/DataSetUpdateBuilder.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/DataSetUpdateBuilder.java
@@ -26,7 +26,7 @@ import ch.systemsx.cisd.openbis.generic.server.ICommonServerForInternalUse;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataSetUpdatesDTO;
@@ -46,14 +46,14 @@ public class DataSetUpdateBuilder extends UpdateBuilder<DataSetUpdatesDTO>
 
     private String fileFormatTypeCode;
 
-    private List<ExternalData> parents;
+    private List<AbstractExternalData> parents;
 
     private String containerCode;
 
-    private List<ExternalData> components;
+    private List<AbstractExternalData> components;
 
     public DataSetUpdateBuilder(ICommonServerForInternalUse commonServer,
-            IGenericServer genericServer, ExternalData data)
+            IGenericServer genericServer, AbstractExternalData data)
     {
         super(commonServer, genericServer);
         this.datasetId = new TechId(data.getId());
@@ -82,22 +82,22 @@ public class DataSetUpdateBuilder extends UpdateBuilder<DataSetUpdatesDTO>
         return this;
     }
 
-    public DataSetUpdateBuilder withParents(ExternalData first, ExternalData... rest)
+    public DataSetUpdateBuilder withParents(AbstractExternalData first, AbstractExternalData... rest)
     {
-        this.parents = new ArrayList<ExternalData>();
+        this.parents = new ArrayList<AbstractExternalData>();
         this.parents.add(first);
         this.parents.addAll(Arrays.asList(rest));
         return this;
     }
 
-    public DataSetUpdateBuilder withParent(ExternalData dataSet)
+    public DataSetUpdateBuilder withParent(AbstractExternalData dataSet)
     {
         return this.withParents(dataSet);
     }
 
     public DataSetUpdateBuilder removingParents()
     {
-        this.parents = new ArrayList<ExternalData>();
+        this.parents = new ArrayList<AbstractExternalData>();
         return this;
     }
 
@@ -107,23 +107,23 @@ public class DataSetUpdateBuilder extends UpdateBuilder<DataSetUpdatesDTO>
         return this;
     }
 
-    public DataSetUpdateBuilder withContainer(ExternalData dataSet)
+    public DataSetUpdateBuilder withContainer(AbstractExternalData dataSet)
     {
         this.containerCode = dataSet.getCode();
         return this;
     }
 
-    public DataSetUpdateBuilder withComponents(ExternalData... dataSets)
+    public DataSetUpdateBuilder withComponents(AbstractExternalData... dataSets)
     {
-        this.components = new ArrayList<ExternalData>();
-        for (ExternalData component : dataSets)
+        this.components = new ArrayList<AbstractExternalData>();
+        for (AbstractExternalData component : dataSets)
         {
             this.components.add(component);
         }
         return this;
     }
 
-    public DataSetUpdateBuilder withComponent(ExternalData dataSet)
+    public DataSetUpdateBuilder withComponent(AbstractExternalData dataSet)
     {
         return this.withComponents(dataSet);
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/ExternalDataBuilder.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/ExternalDataBuilder.java
index d2df88eb2fbed8217eca950f5ea6a2585d248bc3..387b4f1fbc936454316e82c436206024c7baf15a 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/ExternalDataBuilder.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/builder/ExternalDataBuilder.java
@@ -27,7 +27,7 @@ import ch.systemsx.cisd.openbis.generic.shared.IETLLIMSService;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetKind;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.LocatorType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -38,7 +38,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifi
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.plugin.generic.shared.IGenericServer;
 
-public class ExternalDataBuilder extends Builder<ExternalData>
+public class ExternalDataBuilder extends Builder<AbstractExternalData>
 {
     private static int number;
 
@@ -83,16 +83,16 @@ public class ExternalDataBuilder extends Builder<ExternalData>
         return this;
     }
 
-    public ExternalDataBuilder withParents(ExternalData... dataSets)
+    public ExternalDataBuilder withParents(AbstractExternalData... dataSets)
     {
-        for (ExternalData parent : dataSets)
+        for (AbstractExternalData parent : dataSets)
         {
             this.parentCodes.add(parent.getCode());
         }
         return this;
     }
 
-    public ExternalDataBuilder withParent(ExternalData dataSet)
+    public ExternalDataBuilder withParent(AbstractExternalData dataSet)
     {
         return this.withParents(dataSet);
     }
@@ -103,22 +103,22 @@ public class ExternalDataBuilder extends Builder<ExternalData>
         return this;
     }
 
-    public ExternalDataBuilder withComponents(ExternalData... data)
+    public ExternalDataBuilder withComponents(AbstractExternalData... data)
     {
-        for (ExternalData component : data)
+        for (AbstractExternalData component : data)
         {
             this.componentCodes.add(component.getCode());
         }
         return this;
     }
 
-    public ExternalDataBuilder withComponent(ExternalData data)
+    public ExternalDataBuilder withComponent(AbstractExternalData data)
     {
         return this.withComponents(data);
     }
 
     @Override
-    public ExternalData create()
+    public AbstractExternalData create()
     {
         DataSetType dataSetType = new DataSetType();
         dataSetType.setCode("DT" + number++);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasChildrenMatcher.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasChildrenMatcher.java
index 00de6c0d555dfcd02f7cf7335c1270af1a2be745..e2b18d8a909a6347d2b666d75d11e79593960dd7 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasChildrenMatcher.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasChildrenMatcher.java
@@ -22,18 +22,18 @@ import java.util.Set;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
-public class ExternalDataHasChildrenMatcher extends TypeSafeMatcher<ExternalData>
+public class ExternalDataHasChildrenMatcher extends TypeSafeMatcher<AbstractExternalData>
 {
 
     private Set<String> expectedChildren;
 
-    public ExternalDataHasChildrenMatcher(ExternalData first, ExternalData... rest)
+    public ExternalDataHasChildrenMatcher(AbstractExternalData first, AbstractExternalData... rest)
     {
         this.expectedChildren = new HashSet<String>();
         expectedChildren.add(first.getCode());
-        for (ExternalData d : rest)
+        for (AbstractExternalData d : rest)
         {
             expectedChildren.add(d.getCode());
         }
@@ -46,14 +46,14 @@ public class ExternalDataHasChildrenMatcher extends TypeSafeMatcher<ExternalData
     }
 
     @Override
-    public boolean matchesSafely(ExternalData actual)
+    public boolean matchesSafely(AbstractExternalData actual)
     {
         if (actual.getChildren().size() != expectedChildren.size())
         {
             return false;
         }
 
-        for (ExternalData child : actual.getChildren())
+        for (AbstractExternalData child : actual.getChildren())
         {
             if (expectedChildren.contains(child.getCode()) == false)
             {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasContainerMatcher.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasContainerMatcher.java
index 881365158d68c20985989c81c7042eab9ea168bd..d56030c1b37ec422f808a883b3cbdb63e555dc23 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasContainerMatcher.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasContainerMatcher.java
@@ -19,14 +19,14 @@ package ch.systemsx.cisd.openbis.systemtest.base.matcher;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
-public class ExternalDataHasContainerMatcher extends TypeSafeMatcher<ExternalData>
+public class ExternalDataHasContainerMatcher extends TypeSafeMatcher<AbstractExternalData>
 {
 
-    private ExternalData expectedContainer;
+    private AbstractExternalData expectedContainer;
 
-    public ExternalDataHasContainerMatcher(ExternalData expected)
+    public ExternalDataHasContainerMatcher(AbstractExternalData expected)
     {
         this.expectedContainer = expected;
     }
@@ -38,7 +38,7 @@ public class ExternalDataHasContainerMatcher extends TypeSafeMatcher<ExternalDat
     }
 
     @Override
-    public boolean matchesSafely(ExternalData actual)
+    public boolean matchesSafely(AbstractExternalData actual)
     {
         if (actual.tryGetContainer() == null)
         {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasNoSampleMatcher.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasNoSampleMatcher.java
index d4e981798f0af75a7c79f93c63bf0e9e2c0e3122..be4ed3052e26aa2618d2986aa5cd5e937f4d8116 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasNoSampleMatcher.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasNoSampleMatcher.java
@@ -19,9 +19,9 @@ package ch.systemsx.cisd.openbis.systemtest.base.matcher;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
-public class ExternalDataHasNoSampleMatcher extends TypeSafeMatcher<ExternalData>
+public class ExternalDataHasNoSampleMatcher extends TypeSafeMatcher<AbstractExternalData>
 {
 
     public ExternalDataHasNoSampleMatcher()
@@ -35,7 +35,7 @@ public class ExternalDataHasNoSampleMatcher extends TypeSafeMatcher<ExternalData
     }
 
     @Override
-    public boolean matchesSafely(ExternalData actual)
+    public boolean matchesSafely(AbstractExternalData actual)
     {
         return actual.getSample() == null;
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasParentsMatcher.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasParentsMatcher.java
index caa9c354e8c0831dfd2a5769e30cc928b12026d4..da2f6398b318d1d828f0c69348801dc07c7de072 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasParentsMatcher.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/ExternalDataHasParentsMatcher.java
@@ -22,18 +22,18 @@ import java.util.Set;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
-public class ExternalDataHasParentsMatcher extends TypeSafeMatcher<ExternalData>
+public class ExternalDataHasParentsMatcher extends TypeSafeMatcher<AbstractExternalData>
 {
 
     private Set<String> expectedParents;
 
-    public ExternalDataHasParentsMatcher(ExternalData first, ExternalData... rest)
+    public ExternalDataHasParentsMatcher(AbstractExternalData first, AbstractExternalData... rest)
     {
         this.expectedParents = new HashSet<String>();
         expectedParents.add(first.getCode());
-        for (ExternalData data : rest)
+        for (AbstractExternalData data : rest)
         {
             expectedParents.add(data.getCode());
         }
@@ -46,14 +46,14 @@ public class ExternalDataHasParentsMatcher extends TypeSafeMatcher<ExternalData>
     }
 
     @Override
-    public boolean matchesSafely(ExternalData actual)
+    public boolean matchesSafely(AbstractExternalData actual)
     {
         if (actual.getParents().size() != expectedParents.size())
         {
             return false;
         }
 
-        for (ExternalData parent : actual.getParents())
+        for (AbstractExternalData parent : actual.getParents())
         {
             if (!expectedParents.contains(parent.getCode()))
             {
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/HasNoChildrenMatcher.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/HasNoChildrenMatcher.java
index 0fab266e43b5b02e47e564c381a6bd248b875576..527e0759cfd59268492facb4c1d648d6a32d7d0f 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/HasNoChildrenMatcher.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/HasNoChildrenMatcher.java
@@ -19,9 +19,9 @@ package ch.systemsx.cisd.openbis.systemtest.base.matcher;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
-public class HasNoChildrenMatcher extends TypeSafeMatcher<ExternalData>
+public class HasNoChildrenMatcher extends TypeSafeMatcher<AbstractExternalData>
 {
 
     @Override
@@ -31,7 +31,7 @@ public class HasNoChildrenMatcher extends TypeSafeMatcher<ExternalData>
     }
 
     @Override
-    public boolean matchesSafely(ExternalData actual)
+    public boolean matchesSafely(AbstractExternalData actual)
     {
         return actual.getChildren().size() == 0;
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/HasNoContainerMatcher.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/HasNoContainerMatcher.java
index fafdf6442c990bdbeac63189b6d4d512fedaa17d..dbe3f1b0b97394ff867921264b0d1d9f65e1ae41 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/HasNoContainerMatcher.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/HasNoContainerMatcher.java
@@ -19,7 +19,7 @@ package ch.systemsx.cisd.openbis.systemtest.base.matcher;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
 public class HasNoContainerMatcher extends TypeSafeMatcher<Object>
@@ -42,9 +42,9 @@ public class HasNoContainerMatcher extends TypeSafeMatcher<Object>
         if (actual instanceof Sample)
         {
             container = ((Sample) actual).getContainer();
-        } else if (actual instanceof ExternalData)
+        } else if (actual instanceof AbstractExternalData)
         {
-            container = ((ExternalData) actual).tryGetContainer();
+            container = ((AbstractExternalData) actual).tryGetContainer();
         } else
         {
             return false;
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/HasNoParentMatcher.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/HasNoParentMatcher.java
index a80846e4900eb1be4d01e0f284f7523b5ce7e0f3..594e215d5c5d6cfa5df0768876e86c436115cce5 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/HasNoParentMatcher.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/HasNoParentMatcher.java
@@ -21,7 +21,7 @@ import java.util.Collection;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
 public class HasNoParentMatcher extends TypeSafeMatcher<Object>
@@ -44,9 +44,9 @@ public class HasNoParentMatcher extends TypeSafeMatcher<Object>
         if (actual instanceof Sample)
         {
             parents = ((Sample) actual).getParents();
-        } else if (actual instanceof ExternalData)
+        } else if (actual instanceof AbstractExternalData)
         {
-            parents = ((ExternalData) actual).getParents();
+            parents = ((AbstractExternalData) actual).getParents();
         } else
         {
             return false;
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/InSampleMatcher.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/InSampleMatcher.java
index 7f62a9fb8d508428e6074d0bb0664ef095276534..f1b1646c5d127711af278c42d8be25643916eafa 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/InSampleMatcher.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/base/matcher/InSampleMatcher.java
@@ -19,10 +19,10 @@ package ch.systemsx.cisd.openbis.systemtest.base.matcher;
 import org.hamcrest.Description;
 import org.hamcrest.TypeSafeMatcher;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
-public class InSampleMatcher extends TypeSafeMatcher<ExternalData>
+public class InSampleMatcher extends TypeSafeMatcher<AbstractExternalData>
 {
 
     private Sample sample;
@@ -39,7 +39,7 @@ public class InSampleMatcher extends TypeSafeMatcher<ExternalData>
     }
 
     @Override
-    public boolean matchesSafely(ExternalData actual)
+    public boolean matchesSafely(AbstractExternalData actual)
     {
         return this.sample.equals(actual.getSample());
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/DataSetOptimisticLockingTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/DataSetOptimisticLockingTest.java
index 7cd4ea93a8ea3b0a8dd3a67227ded429714c6a31..a4b1e0738d71e88e2249df7bca5dcef6187b936f 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/DataSetOptimisticLockingTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/DataSetOptimisticLockingTest.java
@@ -35,7 +35,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetBatchUpdateDetails;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.PropertyBuilder;
@@ -59,7 +59,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
     public void testChangeFileFormatTypeViaPerformEntityOperation()
     {
         Experiment experiment = toolBox.createAndLoadExperiment(1);
-        ExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment));
+        AbstractExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment));
         assertEquals("XML", ((PhysicalDataSet) dataSet).getFileFormatType().getCode());
         DataSetBatchUpdatesDTO dataSetBatchUpdates = new DataSetBatchUpdatesDTO();
         dataSetBatchUpdates.setVersion(dataSet.getVersion());
@@ -77,7 +77,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
 
         etlService.performEntityOperations(systemSessionToken, builder.getDetails());
 
-        ExternalData loadedDataSet = toolBox.loadDataSet(systemSessionToken, dataSet.getCode());
+        AbstractExternalData loadedDataSet = toolBox.loadDataSet(systemSessionToken, dataSet.getCode());
         assertEquals("HDF5", ((PhysicalDataSet) loadedDataSet).getFileFormatType().getCode());
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker, loadedDataSet, "test");
     }
@@ -86,7 +86,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
     public void testChangeFileFormatTypeViaUpdateDataSet()
     {
         Experiment experiment = toolBox.createAndLoadExperiment(1);
-        ExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment));
+        AbstractExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment));
         assertEquals("XML", ((PhysicalDataSet) dataSet).getFileFormatType().getCode());
         DataSetUpdatesDTO dataSetUpdates =
                 new DataSetUpdateBuilder(commonServer, genericServer, dataSet).create();
@@ -96,7 +96,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
 
         etlService.updateDataSet(sessionToken, dataSetUpdates);
 
-        ExternalData loadedDataSet = toolBox.loadDataSet(systemSessionToken, dataSet.getCode());
+        AbstractExternalData loadedDataSet = toolBox.loadDataSet(systemSessionToken, dataSet.getCode());
         assertEquals("HDF5", ((PhysicalDataSet) loadedDataSet).getFileFormatType().getCode());
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker, loadedDataSet, "test");
     }
@@ -105,7 +105,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
     public void testChangeFileFormatTypeOfAStaleDataSetViaUpdateDataSet()
     {
         Experiment experiment = toolBox.createAndLoadExperiment(1);
-        ExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment));
+        AbstractExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment));
         assertEquals("XML", ((PhysicalDataSet) dataSet).getFileFormatType().getCode());
         DataSetUpdatesDTO dataSetUpdates =
                 new DataSetUpdateBuilder(commonServer, genericServer, dataSet).create();
@@ -131,7 +131,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
         NewDataSet newDataSet = toolBox.dataSet("DS-1", experiment);
         newDataSet.setDataSetType(new DataSetType("HCS_IMAGE"));
         newDataSet.setDataSetProperties(Arrays.asList(new NewProperty("COMMENT", "1")));
-        ExternalData dataSet = toolBox.createAndLoadDataSet(newDataSet);
+        AbstractExternalData dataSet = toolBox.createAndLoadDataSet(newDataSet);
         DataSetBatchUpdatesDTO dataSetBatchUpdates = new DataSetBatchUpdatesDTO();
         dataSetBatchUpdates.setVersion(dataSet.getVersion());
         dataSetBatchUpdates.setDatasetCode(dataSet.getCode());
@@ -148,7 +148,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
 
         etlService.performEntityOperations(systemSessionToken, builder.getDetails());
 
-        ExternalData loadedDataSet = toolBox.loadDataSet(systemSessionToken, dataSet.getCode());
+        AbstractExternalData loadedDataSet = toolBox.loadDataSet(systemSessionToken, dataSet.getCode());
         assertEquals("[COMMENT: 2]", loadedDataSet.getProperties().toString());
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker, loadedDataSet, "test");
     }
@@ -160,7 +160,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
         NewDataSet newDataSet = toolBox.dataSet("DS-1", experiment);
         newDataSet.setDataSetType(new DataSetType("HCS_IMAGE"));
         newDataSet.setDataSetProperties(Arrays.asList(new NewProperty("COMMENT", "1")));
-        ExternalData dataSet = toolBox.createAndLoadDataSet(newDataSet);
+        AbstractExternalData dataSet = toolBox.createAndLoadDataSet(newDataSet);
         DataSetUpdatesDTO dataSetUpdates =
                 new DataSetUpdateBuilder(commonServer, genericServer, dataSet).create();
         dataSetUpdates.getProperties().add(new PropertyBuilder("COMMENT").value("2").getProperty());
@@ -169,7 +169,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
 
         etlService.updateDataSet(sessionToken, dataSetUpdates);
 
-        ExternalData loadedDataSet = toolBox.loadDataSet(systemSessionToken, dataSet.getCode());
+        AbstractExternalData loadedDataSet = toolBox.loadDataSet(systemSessionToken, dataSet.getCode());
         assertEquals("[COMMENT: 2]", loadedDataSet.getProperties().toString());
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker, loadedDataSet, "test");
     }
@@ -181,7 +181,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
         NewDataSet newDataSet = toolBox.dataSet("DS-1", experiment);
         newDataSet.setDataSetType(new DataSetType("HCS_IMAGE"));
         newDataSet.setDataSetProperties(Arrays.asList(new NewProperty("COMMENT", "1")));
-        ExternalData dataSet = toolBox.createAndLoadDataSet(newDataSet);
+        AbstractExternalData dataSet = toolBox.createAndLoadDataSet(newDataSet);
         DataSetBatchUpdatesDTO dataSetBatchUpdates = new DataSetBatchUpdatesDTO();
         dataSetBatchUpdates.setVersion(dataSet.getVersion());
         dataSetBatchUpdates.setDatasetCode(dataSet.getCode());
@@ -211,7 +211,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
     public void testAddMetaProjectViaPerformEntityOperation()
     {
         Experiment experiment = toolBox.createAndLoadExperiment(1);
-        ExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment));
+        AbstractExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment));
         MetaprojectUpdatesDTO metaProjectUpdate = new MetaprojectUpdatesDTO();
         metaProjectUpdate.setAddedEntities(Arrays.asList(new DataSetCodeId(dataSet.getCode())));
         metaProjectUpdate.setRemovedEntities(Arrays.<IObjectId> asList());
@@ -223,7 +223,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
         etlService.performEntityOperations(systemSessionToken, builder.getDetails());
 
         String sessionToken = logIntoCommonClientService().getSessionID();
-        ExternalData loadedDataSet = toolBox.loadDataSet(sessionToken, dataSet.getCode());
+        AbstractExternalData loadedDataSet = toolBox.loadDataSet(sessionToken, dataSet.getCode());
         assertEquals(dataSet.getModifier(), loadedDataSet.getModifier());
         assertEquals(dataSet.getModificationDate(), loadedDataSet.getModificationDate());
         assertEquals("/test/TEST_METAPROJECTS",
@@ -238,7 +238,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
     public void testAddMetaProjectViaUpdateDataSet()
     {
         Experiment experiment = toolBox.createAndLoadExperiment(1);
-        ExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment));
+        AbstractExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment));
         DataSetUpdatesDTO dataSetUpdates =
                 new DataSetUpdateBuilder(commonServer, genericServer, dataSet).create();
         dataSetUpdates.setMetaprojectsOrNull(new String[]
@@ -247,7 +247,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
 
         etlService.updateDataSet(sessionToken, dataSetUpdates);
 
-        ExternalData loadedDataSet = toolBox.loadDataSet(sessionToken, dataSet.getCode());
+        AbstractExternalData loadedDataSet = toolBox.loadDataSet(sessionToken, dataSet.getCode());
         assertEquals(dataSet.getModifier(), loadedDataSet.getModifier());
         assertEquals(dataSet.getModificationDate(), loadedDataSet.getModificationDate());
         assertEquals("/test/TEST_METAPROJECTS",
@@ -262,7 +262,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
     public void testChangeExperimentViaPerformEntityOperation()
     {
         Experiment experiment1 = toolBox.createAndLoadExperiment(1);
-        ExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment1));
+        AbstractExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment1));
         assertEquals(experiment1.getIdentifier(), dataSet.getExperiment().getIdentifier());
         Experiment experiment2 = toolBox.createAndLoadExperiment(2);
         DataSetBatchUpdatesDTO dataSetBatchUpdates = new DataSetBatchUpdatesDTO();
@@ -281,7 +281,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
 
         etlService.performEntityOperations(systemSessionToken, builder.getDetails());
 
-        ExternalData loadedDataSet = toolBox.loadDataSet(dataSet.getCode());
+        AbstractExternalData loadedDataSet = toolBox.loadDataSet(dataSet.getCode());
         assertEquals(experiment2.getIdentifier(), loadedDataSet.getExperiment().getIdentifier());
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker, loadedDataSet, "test");
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker,
@@ -300,7 +300,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
     public void testChangeExperimentViaUpdateDataSet()
     {
         Experiment experiment1 = toolBox.createAndLoadExperiment(1);
-        ExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment1));
+        AbstractExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment1));
         assertEquals(experiment1.getIdentifier(), dataSet.getExperiment().getIdentifier());
         Experiment experiment2 = toolBox.createAndLoadExperiment(2);
         DataSetUpdatesDTO dataSetUpdates =
@@ -311,7 +311,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
 
         etlService.updateDataSet(sessionToken, dataSetUpdates);
 
-        ExternalData loadedDataSet = toolBox.loadDataSet(dataSet.getCode());
+        AbstractExternalData loadedDataSet = toolBox.loadDataSet(dataSet.getCode());
         assertEquals(experiment2.getIdentifier(), loadedDataSet.getExperiment().getIdentifier());
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker, loadedDataSet, "test");
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker,
@@ -331,7 +331,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
     {
         Experiment experiment1 = toolBox.createAndLoadExperiment(1);
         Sample sample1 = toolBox.createAndLoadSample(1, experiment1);
-        ExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", sample1));
+        AbstractExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", sample1));
         assertEquals(experiment1.getIdentifier(), dataSet.getExperiment().getIdentifier());
         assertEquals(sample1.getIdentifier(), dataSet.getSampleIdentifier());
         Experiment experiment2 = toolBox.createAndLoadExperiment(2);
@@ -352,7 +352,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
 
         etlService.performEntityOperations(systemSessionToken, builder.getDetails());
 
-        ExternalData loadedDataSet = toolBox.loadDataSet(dataSet.getCode());
+        AbstractExternalData loadedDataSet = toolBox.loadDataSet(dataSet.getCode());
         assertEquals(experiment2.getIdentifier(), loadedDataSet.getExperiment().getIdentifier());
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker, loadedDataSet, "test");
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker,
@@ -382,7 +382,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
     {
         Experiment experiment1 = toolBox.createAndLoadExperiment(1);
         Sample sample1 = toolBox.createAndLoadSample(1, experiment1);
-        ExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", sample1));
+        AbstractExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", sample1));
         assertEquals(experiment1.getIdentifier(), dataSet.getExperiment().getIdentifier());
         assertEquals(sample1.getIdentifier(), dataSet.getSampleIdentifier());
         Experiment experiment2 = toolBox.createAndLoadExperiment(2);
@@ -395,7 +395,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
 
         etlService.updateDataSet(sessionToken, dataSetUpdates);
 
-        ExternalData loadedDataSet = toolBox.loadDataSet(dataSet.getCode());
+        AbstractExternalData loadedDataSet = toolBox.loadDataSet(dataSet.getCode());
         assertEquals(experiment2.getIdentifier(), loadedDataSet.getExperiment().getIdentifier());
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker, loadedDataSet, "test");
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker,
@@ -424,7 +424,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
     public void testCreateChildDataSets()
     {
         Experiment experiment1 = toolBox.createAndLoadExperiment(1);
-        ExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment1));
+        AbstractExternalData dataSet = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment1));
         Experiment experiment2 = toolBox.createAndLoadExperiment(2);
         NewDataSet child = toolBox.dataSet("DS-1-C", experiment2);
         child.setParentDataSetCodes(Arrays.asList(dataSet.getCode()));
@@ -437,9 +437,9 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
 
         etlService.performEntityOperations(systemSessionToken, builder.getDetails());
 
-        ExternalData loadedDataSet = toolBox.loadDataSet(dataSet.getCode());
-        ExternalData loadedChild = toolBox.loadDataSet(child.getCode());
-        ExternalData loadedGrandChild = toolBox.loadDataSet(grandChild.getCode());
+        AbstractExternalData loadedDataSet = toolBox.loadDataSet(dataSet.getCode());
+        AbstractExternalData loadedChild = toolBox.loadDataSet(child.getCode());
+        AbstractExternalData loadedGrandChild = toolBox.loadDataSet(grandChild.getCode());
         assertEquals(experiment1.getIdentifier(), loadedDataSet.getExperiment().getIdentifier());
         assertEquals("[DS-1-C]", toolBox.extractCodes(loadedDataSet.getChildren()).toString());
         assertEquals(experiment2.getIdentifier(), loadedChild.getExperiment().getIdentifier());
@@ -457,12 +457,12 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
     public void testChangeParentViaPerformEntityOperation()
     {
         Experiment experiment1 = toolBox.createAndLoadExperiment(1);
-        ExternalData dataSet1 = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment1));
-        ExternalData dataSet2 = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-2", experiment1));
+        AbstractExternalData dataSet1 = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment1));
+        AbstractExternalData dataSet2 = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-2", experiment1));
         Experiment experiment2 = toolBox.createAndLoadExperiment(2);
         NewDataSet newDataSet = toolBox.dataSet("DS-3", experiment2);
         newDataSet.setParentDataSetCodes(Arrays.asList(dataSet1.getCode()));
-        ExternalData child = toolBox.createAndLoadDataSet(newDataSet);
+        AbstractExternalData child = toolBox.createAndLoadDataSet(newDataSet);
         DataSetBatchUpdatesDTO dataSetBatchUpdates = new DataSetBatchUpdatesDTO();
         dataSetBatchUpdates.setVersion(child.getVersion());
         dataSetBatchUpdates.setDatasetCode(child.getCode());
@@ -480,9 +480,9 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
 
         etlService.performEntityOperations(systemSessionToken, builder.getDetails());
 
-        ExternalData loadedDataSet1 = toolBox.loadDataSet(dataSet1.getCode());
-        ExternalData loadedDataSet2 = toolBox.loadDataSet(dataSet2.getCode());
-        ExternalData loadedChild = toolBox.loadDataSet(child.getCode());
+        AbstractExternalData loadedDataSet1 = toolBox.loadDataSet(dataSet1.getCode());
+        AbstractExternalData loadedDataSet2 = toolBox.loadDataSet(dataSet2.getCode());
+        AbstractExternalData loadedChild = toolBox.loadDataSet(child.getCode());
         assertEquals(experiment1.getIdentifier(), loadedDataSet1.getExperiment().getIdentifier());
         assertEquals("[]", toolBox.extractCodes(loadedDataSet1.getChildren()).toString());
         assertEquals("[DS-3]", toolBox.extractCodes(loadedDataSet2.getChildren()).toString());
@@ -497,12 +497,12 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
     public void testChangeParentViaUpdateDataSet()
     {
         Experiment experiment1 = toolBox.createAndLoadExperiment(1);
-        ExternalData dataSet1 = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment1));
-        ExternalData dataSet2 = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-2", experiment1));
+        AbstractExternalData dataSet1 = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-1", experiment1));
+        AbstractExternalData dataSet2 = toolBox.createAndLoadDataSet(toolBox.dataSet("DS-2", experiment1));
         Experiment experiment2 = toolBox.createAndLoadExperiment(2);
         NewDataSet newDataSet = toolBox.dataSet("DS-3", experiment2);
         newDataSet.setParentDataSetCodes(Arrays.asList(dataSet1.getCode()));
-        ExternalData child = toolBox.createAndLoadDataSet(newDataSet);
+        AbstractExternalData child = toolBox.createAndLoadDataSet(newDataSet);
         DataSetUpdatesDTO dataSetUpdates =
                 new DataSetUpdateBuilder(commonServer, genericServer, child).create();
         dataSetUpdates.setModifiedParentDatasetCodesOrNull(new String[]
@@ -512,9 +512,9 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
 
         etlService.updateDataSet(sessionToken, dataSetUpdates);
 
-        ExternalData loadedDataSet1 = toolBox.loadDataSet(dataSet1.getCode());
-        ExternalData loadedDataSet2 = toolBox.loadDataSet(dataSet2.getCode());
-        ExternalData loadedChild = toolBox.loadDataSet(child.getCode());
+        AbstractExternalData loadedDataSet1 = toolBox.loadDataSet(dataSet1.getCode());
+        AbstractExternalData loadedDataSet2 = toolBox.loadDataSet(dataSet2.getCode());
+        AbstractExternalData loadedChild = toolBox.loadDataSet(child.getCode());
         assertEquals(experiment1.getIdentifier(), loadedDataSet1.getExperiment().getIdentifier());
         assertEquals("[]", toolBox.extractCodes(loadedDataSet1.getChildren()).toString());
         assertEquals("[DS-3]", toolBox.extractCodes(loadedDataSet2.getChildren()).toString());
@@ -541,7 +541,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
 
         ContainerDataSet loadedContainerDataSet =
                 (ContainerDataSet) toolBox.loadDataSet(containerDataSet.getCode());
-        ExternalData loadedContainedDataSet = toolBox.loadDataSet(containedDataSet.getCode());
+        AbstractExternalData loadedContainedDataSet = toolBox.loadDataSet(containedDataSet.getCode());
         assertEquals("[DS-2]", toolBox.extractCodes(loadedContainerDataSet.getContainedDataSets())
                 .toString());
         assertEquals("DS-1", loadedContainedDataSet.tryGetContainer().getCode());
@@ -561,7 +561,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
         toolBox.createAndLoadDataSet(containerDataSet1);
         NewContainerDataSet containerDataSet2 = toolBox.containerDataSet("DS-2", experiment);
         toolBox.createAndLoadDataSet(containerDataSet2);
-        ExternalData dataSet = toolBox.loadDataSet(containedDataSet.getCode());
+        AbstractExternalData dataSet = toolBox.loadDataSet(containedDataSet.getCode());
         assertEquals("DS-1", dataSet.tryGetContainer().getCode());
         DataSetBatchUpdatesDTO dataSetBatchUpdates = new DataSetBatchUpdatesDTO();
         dataSetBatchUpdates.setVersion(dataSet.getVersion());
@@ -582,7 +582,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
                 (ContainerDataSet) toolBox.loadDataSet(containerDataSet1.getCode());
         ContainerDataSet loadedContainerDataSet2 =
                 (ContainerDataSet) toolBox.loadDataSet(containerDataSet2.getCode());
-        ExternalData loadedContainedDataSet = toolBox.loadDataSet(containedDataSet.getCode());
+        AbstractExternalData loadedContainedDataSet = toolBox.loadDataSet(containedDataSet.getCode());
         assertEquals("[]", toolBox.extractCodes(loadedContainerDataSet1.getContainedDataSets())
                 .toString());
         assertEquals("[DS-3]", toolBox.extractCodes(loadedContainerDataSet2.getContainedDataSets())
@@ -606,7 +606,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
         toolBox.createAndLoadDataSet(containerDataSet1);
         NewContainerDataSet containerDataSet2 = toolBox.containerDataSet("DS-2", experiment);
         toolBox.createAndLoadDataSet(containerDataSet2);
-        ExternalData dataSet = toolBox.loadDataSet(containedDataSet.getCode());
+        AbstractExternalData dataSet = toolBox.loadDataSet(containedDataSet.getCode());
         assertEquals("DS-1", dataSet.tryGetContainer().getCode());
         DataSetBatchUpdatesDTO dataSetBatchUpdates = new DataSetBatchUpdatesDTO();
         dataSetBatchUpdates.setVersion(dataSet.getVersion());
@@ -628,7 +628,7 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
                 (ContainerDataSet) toolBox.loadDataSet(containerDataSet1.getCode());
         ContainerDataSet loadedContainerDataSet2 =
                 (ContainerDataSet) toolBox.loadDataSet(containerDataSet2.getCode());
-        ExternalData loadedContainedDataSet = toolBox.loadDataSet(containedDataSet.getCode());
+        AbstractExternalData loadedContainedDataSet = toolBox.loadDataSet(containedDataSet.getCode());
         assertEquals("[]", toolBox.extractCodes(loadedContainerDataSet1.getContainedDataSets())
                 .toString());
         assertEquals("[DS-3]", toolBox.extractCodes(loadedContainerDataSet2.getContainedDataSets())
@@ -675,8 +675,8 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
         etlService.performEntityOperations(systemSessionToken, builder.getDetails());
 
         loadedContainerDataSet = (ContainerDataSet) toolBox.loadDataSet(containerDataSet.getCode());
-        ExternalData loadedDataSet1 = toolBox.loadDataSet(dataSet1.getCode());
-        ExternalData loadedDataSet2 = toolBox.loadDataSet(dataSet2.getCode());
+        AbstractExternalData loadedDataSet1 = toolBox.loadDataSet(dataSet1.getCode());
+        AbstractExternalData loadedDataSet2 = toolBox.loadDataSet(dataSet2.getCode());
         assertEquals("[DS-2]", toolBox.extractCodes(loadedContainerDataSet.getContainedDataSets())
                 .toString());
         assertEquals(null, loadedDataSet1.tryGetContainer());
@@ -719,8 +719,8 @@ public class DataSetOptimisticLockingTest extends OptimisticLockingTestCase
         etlService.updateDataSet(sessionToken, dataSetBatchUpdates);
 
         loadedContainerDataSet = (ContainerDataSet) toolBox.loadDataSet(containerDataSet.getCode());
-        ExternalData loadedDataSet1 = toolBox.loadDataSet(dataSet1.getCode());
-        ExternalData loadedDataSet2 = toolBox.loadDataSet(dataSet2.getCode());
+        AbstractExternalData loadedDataSet1 = toolBox.loadDataSet(dataSet1.getCode());
+        AbstractExternalData loadedDataSet2 = toolBox.loadDataSet(dataSet2.getCode());
         assertEquals("[DS-2]", toolBox.extractCodes(loadedContainerDataSet.getContainedDataSets())
                 .toString());
         assertEquals(null, loadedDataSet1.tryGetContainer());
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ExperimentOptimisticLockingTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ExperimentOptimisticLockingTest.java
index 3d6431733e89914c9faf4be0533c59f2f37c2806..8975725bcc86f1815b2d4d9c93e0bb64b6db74d0 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ExperimentOptimisticLockingTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ExperimentOptimisticLockingTest.java
@@ -30,7 +30,7 @@ import ch.systemsx.cisd.openbis.generic.server.util.TimeIntervalChecker;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Attachment;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
@@ -316,9 +316,9 @@ public class ExperimentOptimisticLockingTest extends OptimisticLockingTestCase
         NewDataSet dataSet = toolBox.dataSet("DS-1", exp1);
         builder.dataSet(dataSet);
         etlService.performEntityOperations(systemSessionToken, builder.getDetails());
-        List<ExternalData> dataSets =
+        List<AbstractExternalData> dataSets =
                 etlService.listDataSetsByExperimentID(systemSessionToken, new TechId(exp1));
-        ExternalData loadedDataSet = dataSets.get(0);
+        AbstractExternalData loadedDataSet = dataSets.get(0);
         assertEquals(dataSet.getCode(), loadedDataSet.getCode());
         DataSetUpdatesDTO update = new DataSetUpdatesDTO();
         update.setDatasetId(new TechId(loadedDataSet));
@@ -334,13 +334,13 @@ public class ExperimentOptimisticLockingTest extends OptimisticLockingTestCase
         Experiment loadedExperiment1 = toolBox.loadExperiment(exp1);
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker, loadedExperiment1,
                 "test");
-        List<ExternalData> dataSets1 =
+        List<AbstractExternalData> dataSets1 =
                 etlService.listDataSetsByExperimentID(systemSessionToken, new TechId(exp1));
         assertEquals("[]", dataSets1.toString());
         Experiment loadedExperiment2 = toolBox.loadExperiment(exp2);
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker, loadedExperiment2,
                 "test");
-        List<ExternalData> dataSets2 =
+        List<AbstractExternalData> dataSets2 =
                 etlService.listDataSetsByExperimentID(systemSessionToken, new TechId(exp2));
         assertEquals(dataSet.getCode(), dataSets2.get(0).getCode());
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadDataSetOptimisticLockingTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadDataSetOptimisticLockingTest.java
index f1dabfbac11c68bf60916f1a369c7ee6a9bedf3f..df830e91172abe6406979303cca832ea6ca8b1ef 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadDataSetOptimisticLockingTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadDataSetOptimisticLockingTest.java
@@ -35,7 +35,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewContainerDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewDataSet;
@@ -54,7 +54,7 @@ public class MultiThreadDataSetOptimisticLockingTest extends MultiThreadOptimist
     public void testRegisterChildDataSetsForAParentDataSetInTwoThreads()
     {
         final Experiment experiment = toolBox.createAndLoadExperiment(1);
-        final ExternalData parentDataSet =
+        final AbstractExternalData parentDataSet =
                 toolBox.createAndLoadDataSet(toolBox.dataSet("DS-PARENT", experiment));
         final MessageChannel messageChannelMain =
                 new MessageChannelBuilder(10000).name("child data sets main").logger(operationLog)
@@ -107,7 +107,7 @@ public class MultiThreadDataSetOptimisticLockingTest extends MultiThreadOptimist
         etlService.performEntityOperations(systemSessionToken, builder.getDetails());
         messageChannelSecond.assertNextMessage(ToolBox.REGISTERED);
 
-        ExternalData loadedParentDataSet = toolBox.loadDataSet(parentDataSet.getCode());
+        AbstractExternalData loadedParentDataSet = toolBox.loadDataSet(parentDataSet.getCode());
         assertEquals(experiment.getIdentifier(), loadedParentDataSet.getExperiment()
                 .getIdentifier());
         assertEquals("[DS-CHILD1, DS-CHILD2, DS-CHILD3]",
@@ -120,19 +120,19 @@ public class MultiThreadDataSetOptimisticLockingTest extends MultiThreadOptimist
     public void testTrashAndRevertDataSet()
     {
         Experiment experiment = toolBox.createAndLoadExperiment(1);
-        ExternalData parentDataSet =
+        AbstractExternalData parentDataSet =
                 toolBox.createAndLoadDataSet(toolBox.dataSet("DS-PARENT", experiment));
         Sample sample = toolBox.createAndLoadSample(1, experiment);
         NewDataSet newDataSet = toolBox.dataSet("DS-1", experiment);
         newDataSet.setSampleIdentifierOrNull(SampleIdentifierFactory.parse(sample));
         newDataSet.setParentDataSetCodes(Arrays.asList(parentDataSet.getCode()));
-        ExternalData dataSet = toolBox.createAndLoadDataSet(newDataSet);
+        AbstractExternalData dataSet = toolBox.createAndLoadDataSet(newDataSet);
         NewContainerDataSet newContainerDataSet = toolBox.containerDataSet("DS-CONT", experiment);
         newContainerDataSet.setContainedDataSetCodes(Arrays.asList(dataSet.getCode()));
-        ExternalData containerDataSet = toolBox.createAndLoadDataSet(newContainerDataSet);
+        AbstractExternalData containerDataSet = toolBox.createAndLoadDataSet(newContainerDataSet);
         NewDataSet newChilddataSet = toolBox.dataSet("DS-CHILD", experiment);
         newChilddataSet.setParentDataSetCodes(Arrays.asList(newDataSet.getCode()));
-        ExternalData childDataSet = toolBox.createAndLoadDataSet(newChilddataSet);
+        AbstractExternalData childDataSet = toolBox.createAndLoadDataSet(newChilddataSet);
         assertEquals(dataSet.getCode(), childDataSet.getParents().iterator().next().getCode());
         assertEquals(parentDataSet.getCode(), dataSet.getParents().iterator().next().getCode());
         assertEquals(experiment.getIdentifier(), dataSet.getExperiment().getIdentifier());
@@ -148,9 +148,9 @@ public class MultiThreadDataSetOptimisticLockingTest extends MultiThreadOptimist
 
         Experiment loadedExperiment = toolBox.loadExperiment(experiment);
         Sample loadedSample = toolBox.loadSample(sample);
-        ExternalData loadedContainerDataSet = toolBox.loadDataSet(containerDataSet.getCode());
-        ExternalData loadedParentDataSet = toolBox.loadDataSet(parentDataSet.getCode());
-        ExternalData loadedChildDataSet = toolBox.loadDataSet(childDataSet.getCode());
+        AbstractExternalData loadedContainerDataSet = toolBox.loadDataSet(containerDataSet.getCode());
+        AbstractExternalData loadedParentDataSet = toolBox.loadDataSet(parentDataSet.getCode());
+        AbstractExternalData loadedChildDataSet = toolBox.loadDataSet(childDataSet.getCode());
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker, loadedExperiment,
                 "test");
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker, loadedSample, "test");
@@ -171,7 +171,7 @@ public class MultiThreadDataSetOptimisticLockingTest extends MultiThreadOptimist
         loadedExperiment = toolBox.loadExperiment(experiment);
         loadedSample = toolBox.loadSample(sample);
         loadedContainerDataSet = toolBox.loadDataSet(containerDataSet.getCode());
-        ExternalData loadedDataSet = toolBox.loadDataSet(dataSet.getCode());
+        AbstractExternalData loadedDataSet = toolBox.loadDataSet(dataSet.getCode());
         loadedParentDataSet = toolBox.loadDataSet(parentDataSet.getCode());
         loadedChildDataSet = toolBox.loadDataSet(childDataSet.getCode());
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker, loadedExperiment,
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadExperimentOptimisticLockingTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadExperimentOptimisticLockingTest.java
index 2cc42c92bf2d5b56a27cc012c4b2487e00edaefc..fe8be50904aeba35293528b5c09517e02ac0546d 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadExperimentOptimisticLockingTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadExperimentOptimisticLockingTest.java
@@ -36,7 +36,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
@@ -163,7 +163,7 @@ public class MultiThreadExperimentOptimisticLockingTest extends
         messageChannelSecond.assertNextMessage(ToolBox.REGISTERED);
 
         Experiment loadedExperiment = toolBox.loadExperiment(experiment);
-        List<ExternalData> dataSets =
+        List<AbstractExternalData> dataSets =
                 etlService.listDataSetsByExperimentID(systemSessionToken, new TechId(experiment));
         assertEquals("[DS1, DS2, DS3]", toolBox.extractCodes(dataSets).toString());
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker, loadedExperiment,
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadSampleOptimisticLockingTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadSampleOptimisticLockingTest.java
index 696975fb6ef44da1e3a5ad53966d0f88b44f91ab..84a4280dda26aea31a3aca070cd4829b5631932d 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadSampleOptimisticLockingTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/MultiThreadSampleOptimisticLockingTest.java
@@ -35,7 +35,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -211,7 +211,7 @@ public class MultiThreadSampleOptimisticLockingTest extends MultiThreadOptimisti
         messageChannelSecond.assertNextMessage(ToolBox.REGISTERED);
 
         Sample loadedSample = toolBox.loadSample(sample);
-        List<ExternalData> dataSets =
+        List<AbstractExternalData> dataSets =
                 etlService.listDataSetsBySampleID(systemSessionToken, new TechId(sample), true);
         assertEquals("[DS1, DS2, DS3]", toolBox.extractCodes(dataSets).toString());
         toolBox.checkModifierAndModificationDateOfBean(timeIntervalChecker, loadedSample, "test");
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ToolBox.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ToolBox.java
index 0a7e48a6aa89d30fa351b02ef717cc09dcef805f..aa85324cadc2564032d6279c30c345dee7dda3f3 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ToolBox.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/optimistic_locking/ToolBox.java
@@ -36,7 +36,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Deletion;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Grantee;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
@@ -372,7 +372,7 @@ public class ToolBox
                 SampleIdentifierFactory.parse(sample.getIdentifier()));
     }
 
-    public ExternalData createAndLoadDataSet(NewExternalData dataSet)
+    public AbstractExternalData createAndLoadDataSet(NewExternalData dataSet)
     {
         AtomicEntityOperationDetailsBuilder builder =
                 new AtomicEntityOperationDetailsBuilder().dataSet(dataSet);
@@ -380,12 +380,12 @@ public class ToolBox
         return loadDataSet(systemSessionToken, dataSet.getCode());
     }
 
-    public ExternalData loadDataSet(String dataSetCode)
+    public AbstractExternalData loadDataSet(String dataSetCode)
     {
         return loadDataSet(systemSessionToken, dataSetCode);
     }
 
-    public ExternalData loadDataSet(String sessionToken, String dataSetCode)
+    public AbstractExternalData loadDataSet(String sessionToken, String dataSetCode)
     {
         return etlService.tryGetDataSet(sessionToken, dataSetCode);
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/perform_entity_operations/RegistrationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/perform_entity_operations/RegistrationTest.java
index 96332d7a3adf3d066cea62ac362de63cc29dafd9..a1a1930e53be85870254ca7afc2c28f1420c5142 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/perform_entity_operations/RegistrationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/perform_entity_operations/RegistrationTest.java
@@ -42,7 +42,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Attachment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AttachmentWithContent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
@@ -225,7 +225,7 @@ public class RegistrationTest extends SystemTestCase
                         metaproject.getId()));
         assertIdentifiers("[/CISD/CL1]", samples);
         assertContainsMetaproject(samples.get(0).getMetaprojects(), name);
-        List<ExternalData> dataSets =
+        List<AbstractExternalData> dataSets =
                 commonServer.listMetaprojectExternalData(sessionToken, new MetaprojectTechIdId(
                         metaproject.getId()));
         assertIdentifiers("[20081105092159188-3]", dataSets);
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/EntityValidationTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/EntityValidationTest.java
index 740a2222b39ccc9e4d79b6f63e1222f50182f1a4..10bcfdb069813d266852f7525860f1b95a773b70 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/EntityValidationTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/EntityValidationTest.java
@@ -33,7 +33,7 @@ import org.testng.annotations.Test;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DeletionType;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
@@ -310,7 +310,7 @@ public class EntityValidationTest extends GenericSystemTestCase
     {
         updateTestScriptBeforeAction("def validate(entity, isNew):\n  print entity.code()\n");
 
-        ExternalData dataset = commonServer.getDataSetInfo(systemSessionToken, new TechId(26l));
+        AbstractExternalData dataset = commonServer.getDataSetInfo(systemSessionToken, new TechId(26l));
 
         DataSetUpdatesDTO updates = new DataSetUpdatesDTO();
         updates.setDatasetId(new TechId(26));
@@ -332,7 +332,7 @@ public class EntityValidationTest extends GenericSystemTestCase
                     + "  for contained in entity.contained():\n"
                     + "    requestValidation(contained)\n");
 
-            ExternalData dataset = commonServer.getDataSetInfo(systemSessionToken, new TechId(26l));
+            AbstractExternalData dataset = commonServer.getDataSetInfo(systemSessionToken, new TechId(26l));
 
             DataSetUpdatesDTO updates = new DataSetUpdatesDTO();
             updates.setDatasetId(new TechId(26));
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/SampleDetailsTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/SampleDetailsTest.java
index fcfd145a9a0578d5b6c6f9f257c2bb3171dae2bd..6e609cf14d8c6450f01c0550bb4001a0474155b6 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/SampleDetailsTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/plugin/generic/SampleDetailsTest.java
@@ -33,7 +33,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSe
 import ch.systemsx.cisd.openbis.generic.shared.basic.GridRowModel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -186,10 +186,10 @@ public class SampleDetailsTest extends GenericSystemTestCase
         // directly connected
         boolean showOnlyDirectlyConnected = true;
 
-        final TypedTableResultSet<ExternalData> directlyConnectedResults =
+        final TypedTableResultSet<AbstractExternalData> directlyConnectedResults =
                 commonClientService.listSampleDataSets(TechId.create(sample),
                         DefaultResultSetConfig
-                                .<String, TableModelRowWithObject<ExternalData>> createFetchAll(),
+                                .<String, TableModelRowWithObject<AbstractExternalData>> createFetchAll(),
                         showOnlyDirectlyConnected);
 
         assertEquals(1, directlyConnectedResults.getResultSet().getTotalLength());
@@ -204,10 +204,10 @@ public class SampleDetailsTest extends GenericSystemTestCase
 
         // indirectly connected
         showOnlyDirectlyConnected = false;
-        TypedTableResultSet<ExternalData> indirectlyConnectedResults =
+        TypedTableResultSet<AbstractExternalData> indirectlyConnectedResults =
                 commonClientService.listSampleDataSets(TechId.create(sample),
                         DefaultResultSetConfig
-                                .<String, TableModelRowWithObject<ExternalData>> createFetchAll(),
+                                .<String, TableModelRowWithObject<AbstractExternalData>> createFetchAll(),
                         showOnlyDirectlyConnected);
 
         assertEquals(6, indirectlyConnectedResults.getResultSet().getTotalLength());
@@ -367,12 +367,12 @@ public class SampleDetailsTest extends GenericSystemTestCase
         return null; // satisfy compiler
     }
 
-    private static ExternalData getDataSet(
-            GridRowModels<TableModelRowWithObject<ExternalData>> list, String identifier)
+    private static AbstractExternalData getDataSet(
+            GridRowModels<TableModelRowWithObject<AbstractExternalData>> list, String identifier)
     {
-        for (GridRowModel<TableModelRowWithObject<ExternalData>> gridRowModel : list)
+        for (GridRowModel<TableModelRowWithObject<AbstractExternalData>> gridRowModel : list)
         {
-            ExternalData externalData = gridRowModel.getOriginalObject().getObjectOrNull();
+            AbstractExternalData externalData = gridRowModel.getOriginalObject().getObjectOrNull();
             if (DEBUG)
             {
                 System.out.println(externalData.getIdentifier());
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/relationshipshistory/DataSetOwnerRelationshipsHistoryTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/relationshipshistory/DataSetOwnerRelationshipsHistoryTest.java
index 99b85e048e793676cc4e68cc4081ad7210640a80..bc007ee2cd0f38af30d418193ffd8d3a4f81106f 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/relationshipshistory/DataSetOwnerRelationshipsHistoryTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/relationshipshistory/DataSetOwnerRelationshipsHistoryTest.java
@@ -25,7 +25,7 @@ import org.testng.annotations.Test;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DataSetUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
 /**
@@ -42,7 +42,7 @@ public class DataSetOwnerRelationshipsHistoryTest extends AbstractRelationshipsH
 
         logIntoCommonClientService();
 
-        ExternalData dataSet = genericClientService.getDataSetInfo(dataId);
+        AbstractExternalData dataSet = genericClientService.getDataSetInfo(dataId);
         Sample sample = genericClientService.getSampleInfo(sampleId);
 
         DataSetUpdates updates = new DataSetUpdates();
@@ -116,7 +116,7 @@ public class DataSetOwnerRelationshipsHistoryTest extends AbstractRelationshipsH
 
         logIntoCommonClientService();
 
-        ExternalData dataSet = genericClientService.getDataSetInfo(dataId);
+        AbstractExternalData dataSet = genericClientService.getDataSetInfo(dataId);
         Experiment experiment = commonClientService.getExperimentInfo(experimentId);
 
         DataSetUpdates updates = new DataSetUpdates();
@@ -187,7 +187,7 @@ public class DataSetOwnerRelationshipsHistoryTest extends AbstractRelationshipsH
 
         logIntoCommonClientService();
 
-        ExternalData dataSet = genericClientService.getDataSetInfo(dataId);
+        AbstractExternalData dataSet = genericClientService.getDataSetInfo(dataId);
         Experiment experiment = commonClientService.getExperimentInfo(experimentId);
 
         DataSetUpdates updates = new DataSetUpdates();
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/relationshipshistory/DataSetToDataSetRelationshipsHistoryTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/relationshipshistory/DataSetToDataSetRelationshipsHistoryTest.java
index 39d7b1ac7443d2e39f03efa111964327e6c358b8..220bd255e3b494f413507c51db29095758f8637d 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/relationshipshistory/DataSetToDataSetRelationshipsHistoryTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/relationshipshistory/DataSetToDataSetRelationshipsHistoryTest.java
@@ -24,7 +24,7 @@ import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DataSetUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * @author Pawel Glyzewski
@@ -39,8 +39,8 @@ public class DataSetToDataSetRelationshipsHistoryTest extends AbstractRelationsh
 
         logIntoCommonClientService();
 
-        ExternalData container = genericClientService.getDataSetInfo(containerId);
-        ExternalData contained = genericClientService.getDataSetInfo(containedId);
+        AbstractExternalData container = genericClientService.getDataSetInfo(containerId);
+        AbstractExternalData contained = genericClientService.getDataSetInfo(containedId);
 
         DataSetUpdates updates = new DataSetUpdates();
         updates.setDatasetId(containerId);
@@ -120,9 +120,9 @@ public class DataSetToDataSetRelationshipsHistoryTest extends AbstractRelationsh
 
         logIntoCommonClientService();
 
-        ExternalData child = genericClientService.getDataSetInfo(childId);
-        ExternalData parent1 = genericClientService.getDataSetInfo(parent1Id);
-        ExternalData parent2 = genericClientService.getDataSetInfo(parent2Id);
+        AbstractExternalData child = genericClientService.getDataSetInfo(childId);
+        AbstractExternalData parent1 = genericClientService.getDataSetInfo(parent1Id);
+        AbstractExternalData parent2 = genericClientService.getDataSetInfo(parent2Id);
 
         DataSetUpdates updates = new DataSetUpdates();
         updates.setDatasetId(childId);
diff --git a/rtd_cina/source/java/ch/systemsx/cisd/cina/dss/bundle/registrators/CollectionMetadataRegistrator.java b/rtd_cina/source/java/ch/systemsx/cisd/cina/dss/bundle/registrators/CollectionMetadataRegistrator.java
index b37d033d80101d89d3993d45f3d65da97c44c357..c0932a9e52bd420ce1fb48767eaaa4bc38e46d52 100644
--- a/rtd_cina/source/java/ch/systemsx/cisd/cina/dss/bundle/registrators/CollectionMetadataRegistrator.java
+++ b/rtd_cina/source/java/ch/systemsx/cisd/cina/dss/bundle/registrators/CollectionMetadataRegistrator.java
@@ -24,7 +24,7 @@ import java.util.List;
 import ch.systemsx.cisd.cina.shared.metadata.CollectionMetadataExtractor;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.dto.NewProperty;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
@@ -101,7 +101,7 @@ public class CollectionMetadataRegistrator extends BundleDataSetHelper
     private void initializeMetadataDataSetFile(DataSetInformation registeredDataSetInformation,
             String dataSetFileName)
     {
-        ExternalData metadataExternalData =
+        AbstractExternalData metadataExternalData =
                 getOpenbisService().tryGetDataSet(getSessionContext().getSessionToken(),
                         registeredDataSetInformation.getDataSetCode());
         PhysicalDataSet metadataDataSet = metadataExternalData.tryGetAsDataSet();
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForMSInjection.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForMSInjection.java
index 8aae4a1fa678624d9a38d2c5748359e2e36b816b..e685e69840837377d5792d03640059d3d2dc84c6 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForMSInjection.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForMSInjection.java
@@ -37,7 +37,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
@@ -123,9 +123,9 @@ public class DataSetInfoExtractorForMSInjection extends AbstractDataSetInfoExtra
         setDataSetPropertiesFor(info, dataSetProperties, dataSetTypeCode);
         if (parentTypeOrNull != null)
         {
-            List<ExternalData> dataSets = service.listDataSetsBySampleID(sampleID, false);
-            ExternalData youngestDataSet = null;
-            for (ExternalData dataSet : dataSets)
+            List<AbstractExternalData> dataSets = service.listDataSetsBySampleID(sampleID, false);
+            AbstractExternalData youngestDataSet = null;
+            for (AbstractExternalData dataSet : dataSets)
             {
                 if (dataSet.getDataSetType().getCode().equals(parentTypeOrNull))
                 {
@@ -198,7 +198,7 @@ public class DataSetInfoExtractorForMSInjection extends AbstractDataSetInfoExtra
         return biologicalSampleIdentifier;
     }
 
-    private long timeStamp(ExternalData dataSet)
+    private long timeStamp(AbstractExternalData dataSet)
     {
         return dataSet.getRegistrationDate().getTime();
     }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResults.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResults.java
index 660a145f794da47f2c4d74a4eeef5747be4f1a56..199e9398f7e6c97033c27a713fca131ea197ac20 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResults.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResults.java
@@ -34,7 +34,7 @@ import ch.systemsx.cisd.openbis.etlserver.proteomics.dto.ParentDataSetCodes;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
@@ -144,13 +144,13 @@ public class DataSetInfoExtractorForProteinResults extends AbstractDataSetInfoEx
     static ParentDataSetCodes getParentDataSetCodes(String parentDataSetCodesOrNull,
             String baseExperimentIdentifier, IEncapsulatedOpenBISService service)
     {
-        List<ExternalData> parentDataSets = new ArrayList<ExternalData>();
+        List<AbstractExternalData> parentDataSets = new ArrayList<AbstractExternalData>();
         StringBuilder builder = new StringBuilder();
         if (parentDataSetCodesOrNull != null)
         {
             for (String code : StringUtils.split(parentDataSetCodesOrNull, ", "))
             {
-                ExternalData dataSet = service.tryGetDataSet(code);
+                AbstractExternalData dataSet = service.tryGetDataSet(code);
                 if (dataSet != null)
                 {
                     parentDataSets.add(dataSet);
@@ -174,7 +174,7 @@ public class DataSetInfoExtractorForProteinResults extends AbstractDataSetInfoEx
             }
         }
         List<String> parentDataSetCodes = new ArrayList<String>();
-        for (ExternalData dataSet : parentDataSets)
+        for (AbstractExternalData dataSet : parentDataSets)
         {
             parentDataSetCodes.add(dataSet.getCode());
         }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinResultDataSetParentLinkingTask.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinResultDataSetParentLinkingTask.java
index 3243189802e19c108e428ee6d4aa9c311e2aa842..eca1c23c62f239b71bfc0b1106d6a01a4bea41ad 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinResultDataSetParentLinkingTask.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/etlserver/proteomics/ProteinResultDataSetParentLinkingTask.java
@@ -34,7 +34,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetBatchUpdateDetails;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial;
@@ -112,13 +112,13 @@ public class ProteinResultDataSetParentLinkingTask implements IMaintenanceTask
                 {
                     continue;
                 }
-                List<ExternalData> dataSets =
+                List<AbstractExternalData> dataSets =
                         service.listDataSetsByExperimentID(experiment.getId());
                 if (dataSets.isEmpty())
                 {
                     continue;
                 }
-                for (ExternalData ds : dataSets)
+                for (AbstractExternalData ds : dataSets)
                 {
                     if (ds instanceof PhysicalDataSet == false)
                     {
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ExperimentViewer.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ExperimentViewer.java
index 2f9e798d1fa7bc332c0e204dc32a23e8af7268f1..6d978a9d45200af81cd3b42c74c72b9b900b4f7f 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ExperimentViewer.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/client/application/ExperimentViewer.java
@@ -49,7 +49,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescription;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 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.GenericViewContext;
@@ -112,11 +112,11 @@ public class ExperimentViewer extends GenericExperimentViewer
         viewContext.getCommonService().listExperimentDataSets(
                 new TechId(experimentId),
                 DefaultResultSetConfig
-                        .<String, TableModelRowWithObject<ExternalData>> createFetchAll(), true,
-                new AbstractAsyncCallback<TypedTableResultSet<ExternalData>>(viewContext)
+                        .<String, TableModelRowWithObject<AbstractExternalData>> createFetchAll(), true,
+                new AbstractAsyncCallback<TypedTableResultSet<AbstractExternalData>>(viewContext)
                     {
                         @Override
-                        protected void process(TypedTableResultSet<ExternalData> result)
+                        protected void process(TypedTableResultSet<AbstractExternalData> result)
                         {
                             AsyncCallback<List<DatastoreServiceDescription>> callBack =
                                     createCallback(contentPanel, result);
@@ -129,10 +129,10 @@ public class ExperimentViewer extends GenericExperimentViewer
     }
 
     private AsyncCallback<List<DatastoreServiceDescription>> createCallback(
-            final ContentPanel contentPanel, TypedTableResultSet<ExternalData> result)
+            final ContentPanel contentPanel, TypedTableResultSet<AbstractExternalData> result)
     {
         final List<String> dataSetCodes = new ArrayList<String>();
-        for (GridRowModel<TableModelRowWithObject<ExternalData>> gridRowModel : result.getResultSet().getList())
+        for (GridRowModel<TableModelRowWithObject<AbstractExternalData>> gridRowModel : result.getResultSet().getList())
         {
             dataSetCodes.add(gridRowModel.getOriginalObject().getObjectOrNull().getCode());
         }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternal.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternal.java
index 5c2a82ec67848cd2cbe9315de1178748bb09329c..96bb196096be6b8cafa19c194d20c043c3fb9493 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternal.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternal.java
@@ -48,7 +48,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Code;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Metaproject;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
@@ -159,8 +159,8 @@ public class ProteomicsDataServiceInternal extends AbstractServer<IProteomicsDat
             if (RAW_DATA_SAMPLE_VALIDATOR.isValid(person, sample)
                     && sampleIDs.contains(sample.getSample().getId()))
             {
-                Map<String, ExternalData> latestDataSets = sample.getLatestDataSets();
-                ExternalData latestDataSet = latestDataSets.get(dataSetType);
+                Map<String, AbstractExternalData> latestDataSets = sample.getLatestDataSets();
+                AbstractExternalData latestDataSet = latestDataSets.get(dataSetType);
                 if (latestDataSet != null)
                 {
                     String code = latestDataSet.getCode();
@@ -207,7 +207,7 @@ public class ProteomicsDataServiceInternal extends AbstractServer<IProteomicsDat
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_USER)
-    public List<ExternalData> listDataSetsByExperiment(String sessionToken,
+    public List<AbstractExternalData> listDataSetsByExperiment(String sessionToken,
             @AuthorizationGuard(guardClass = ExperimentTechIdPredicate.class)
             TechId experimentID)
     {
@@ -267,10 +267,10 @@ public class ProteomicsDataServiceInternal extends AbstractServer<IProteomicsDat
             parentSamples.add(sample.getGeneratedFrom());
         }
         experimentLoader.enrichWithExperiments(parentSamples);
-        Map<Sample, List<ExternalData>> dataSetsBySamples =
+        Map<Sample, List<AbstractExternalData>> dataSetsBySamples =
                 commonBoFactory.createDatasetLister(session).listAllDataSetsFor(samples);
         List<MsInjectionSample> result = new ArrayList<MsInjectionSample>();
-        for (Entry<Sample, List<ExternalData>> entry : dataSetsBySamples.entrySet())
+        for (Entry<Sample, List<AbstractExternalData>> entry : dataSetsBySamples.entrySet())
         {
             result.add(new MsInjectionSample(entry.getKey(), entry.getValue()));
         }
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalLogger.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalLogger.java
index c9cfb82a8dce65c45ca4c504c344946b307ea45a..32de6c27c0a82ab1b391179a0e8dfb3fbcf81faf 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalLogger.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalLogger.java
@@ -23,7 +23,7 @@ import ch.systemsx.cisd.openbis.common.spring.IInvocationLoggerContext;
 import ch.systemsx.cisd.openbis.generic.shared.AbstractServerLogger;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.plugin.proteomics.shared.IProteomicsDataServiceInternal;
 import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.MsInjectionSample;
@@ -76,7 +76,7 @@ class ProteomicsDataServiceInternalLogger extends AbstractServerLogger implement
     }
 
     @Override
-    public List<ExternalData> listDataSetsByExperiment(String sessionToken, TechId experimentID)
+    public List<AbstractExternalData> listDataSetsByExperiment(String sessionToken, TechId experimentID)
     {
         logAccess(sessionToken, "list_data_sets_by_experiments", "EXPERIMENT_ID(%s)", experimentID);
         return null;
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataService.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataService.java
index 0f45b4ee44bb1634d0e00e17230d245687a13f2f..7c0d8ad630756ce526c88f74d83088f06ba601d0 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataService.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataService.java
@@ -42,7 +42,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.RoleWithHierarchy;
@@ -140,16 +140,16 @@ public class ProteomicsDataService extends AbstractServer<IProteomicsDataService
             info.setBiologicalExperiment(translate(experiment));
         }
         info.setBiologicalSampleProperties(translate(bioSample.getProperties()));
-        List<ExternalData> dataSets = sample.getDataSets();
+        List<AbstractExternalData> dataSets = sample.getDataSets();
         Set<DataSet> transformedDataSets = new HashSet<DataSet>();
-        for (ExternalData dataSet : dataSets)
+        for (AbstractExternalData dataSet : dataSets)
         {
             DataSet transformedDataSet = transform(dataSet);
             transformedDataSets.add(transformedDataSet);
         }
         info.setDataSets(transformedDataSets);
         Map<String, Date> latestDataSetRegistrationDates = new HashMap<String, Date>();
-        for (Entry<String, ExternalData> entry : sample.getLatestDataSets().entrySet())
+        for (Entry<String, AbstractExternalData> entry : sample.getLatestDataSets().entrySet())
         {
             latestDataSetRegistrationDates.put(entry.getKey(), entry.getValue()
                     .getRegistrationDate());
@@ -158,7 +158,7 @@ public class ProteomicsDataService extends AbstractServer<IProteomicsDataService
         return info;
     }
 
-    private DataSet transform(ExternalData dataSet)
+    private DataSet transform(AbstractExternalData dataSet)
     {
         DataSet transformedDataSet = new DataSet();
         transformedDataSet.setId(dataSet.getId());
@@ -166,10 +166,10 @@ public class ProteomicsDataService extends AbstractServer<IProteomicsDataService
         transformedDataSet.setType(dataSet.getDataSetType().getCode());
         transformedDataSet.setRegistrationDate(dataSet.getRegistrationDate());
         transformedDataSet.setProperties(translate(dataSet.getProperties()));
-        Collection<ExternalData> children = dataSet.getChildren();
+        Collection<AbstractExternalData> children = dataSet.getChildren();
         if (children != null && children.isEmpty() == false)
         {
-            for (ExternalData child : children)
+            for (AbstractExternalData child : children)
             {
                 transformedDataSet.addChild(transform(child));
             }
@@ -306,10 +306,10 @@ public class ProteomicsDataService extends AbstractServer<IProteomicsDataService
         try
         {
             List<DataSet> result = new ArrayList<DataSet>();
-            List<ExternalData> dataSets =
+            List<AbstractExternalData> dataSets =
                     service.listDataSetsByExperiment(session.getSessionToken(), new TechId(
                             experimentID));
-            for (ExternalData dataSet : dataSets)
+            for (AbstractExternalData dataSet : dataSets)
             {
                 DataSet ds = new DataSet();
                 ds.setId(dataSet.getId());
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/IProteomicsDataServiceInternal.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/IProteomicsDataServiceInternal.java
index 558f885050412635c56efece6fd909c6643593b7..afcb71a468680e1b34a66838f23881d27c16eca7 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/IProteomicsDataServiceInternal.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/IProteomicsDataServiceInternal.java
@@ -23,7 +23,7 @@ import org.springframework.transaction.annotation.Transactional;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.plugin.proteomics.shared.dto.MsInjectionSample;
 
 /**
@@ -51,7 +51,7 @@ public interface IProteomicsDataServiceInternal extends IServer
     public List<Experiment> listExperiments(String sessionToken, String experimentTypeCode);
 
     @Transactional
-    public List<ExternalData> listDataSetsByExperiment(String sessionToken, TechId experimentID);
+    public List<AbstractExternalData> listDataSetsByExperiment(String sessionToken, TechId experimentID);
 
     @Transactional
     public void processProteinResultDataSets(String sessionToken, String dataSetProcessingKey,
diff --git a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/MsInjectionSample.java b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/MsInjectionSample.java
index 071f912894c82244c13c03e2610d5ce9e82b166d..16c904e3d7b869e242406ca51a503fd13cd85ccf 100644
--- a/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/MsInjectionSample.java
+++ b/rtd_phosphonetx/source/java/ch/systemsx/cisd/openbis/plugin/proteomics/shared/dto/MsInjectionSample.java
@@ -22,7 +22,7 @@ import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
 
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
 /**
@@ -33,21 +33,21 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 public class MsInjectionSample
 {
     private final Sample sample;
-    private final Map<String, ExternalData> latestDataSets = new LinkedHashMap<String, ExternalData>();
-    private final List<ExternalData> dataSets;
+    private final Map<String, AbstractExternalData> latestDataSets = new LinkedHashMap<String, AbstractExternalData>();
+    private final List<AbstractExternalData> dataSets;
 
-    public MsInjectionSample(Sample sample, List<ExternalData> dataSets)
+    public MsInjectionSample(Sample sample, List<AbstractExternalData> dataSets)
     {
         this.sample = sample;
         this.dataSets = dataSets;
         add(dataSets);
     }
 
-    private void add(Collection<ExternalData> datasets)
+    private void add(Collection<AbstractExternalData> datasets)
     {
         if (datasets != null)
         {
-            for (ExternalData dataSet : datasets)
+            for (AbstractExternalData dataSet : datasets)
             {
                 addLatestDataSet(dataSet);
                 add(dataSet.getChildren());
@@ -60,21 +60,21 @@ public class MsInjectionSample
         return sample;
     }
 
-    public final List<ExternalData> getDataSets()
+    public final List<AbstractExternalData> getDataSets()
     {
         return dataSets;
     }
 
-    public Map<String, ExternalData> getLatestDataSets()
+    public Map<String, AbstractExternalData> getLatestDataSets()
     {
         return latestDataSets;
     }
 
-    private void addLatestDataSet(ExternalData dataSet)
+    private void addLatestDataSet(AbstractExternalData dataSet)
     {
         String dataSetTypeCode = dataSet.getDataSetType().getCode();
         Date registrationDate = dataSet.getRegistrationDate();
-        ExternalData latestDataSet = latestDataSets.get(dataSetTypeCode);
+        AbstractExternalData latestDataSet = latestDataSets.get(dataSetTypeCode);
         if (latestDataSet == null
                 || latestDataSet.getRegistrationDate().getTime() < registrationDate.getTime())
         {
diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForMSInjectionTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForMSInjectionTest.java
index 127a65274ec393447cacefdcf36ba96ffba50bd6..7160b3a09b0964f5443b2d3d17a3e345267f836f 100644
--- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForMSInjectionTest.java
+++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForMSInjectionTest.java
@@ -60,7 +60,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetTypePropertyType
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetTypeWithVocabularyTerms;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewSample;
@@ -449,9 +449,9 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe
             {
                 {
                     one(service).listDataSetsBySampleID(SAMPLE_ID, false);
-                    ExternalData ds1 = createDataSet("RAW_DATA", "raw1", 11);
-                    ExternalData ds2 = createDataSet("MZXML_DATA", "mzxml1", 13);
-                    ExternalData ds3 = createDataSet("RAW_DATA", "raw2", 12);
+                    AbstractExternalData ds1 = createDataSet("RAW_DATA", "raw1", 11);
+                    AbstractExternalData ds2 = createDataSet("MZXML_DATA", "mzxml1", 13);
+                    AbstractExternalData ds3 = createDataSet("RAW_DATA", "raw2", 12);
                     will(returnValue(Arrays.asList(ds1, ds2, ds3)));
                 }
             });
@@ -711,7 +711,7 @@ public class DataSetInfoExtractorForMSInjectionTest extends AbstractFileSystemTe
         return entityProperty;
     }
 
-    private ExternalData createDataSet(String type, String code, int timestamp)
+    private AbstractExternalData createDataSet(String type, String code, int timestamp)
     {
         PhysicalDataSet ds = new PhysicalDataSet();
         ds.setDataSetType(new DataSetType(type));
diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResultsTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResultsTest.java
index 9996c181795427528a6b43b9c7a8061c644b6b71..376b995fa47d8ed3e4abd793648119dc22b76932 100644
--- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResultsTest.java
+++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/etlserver/proteomics/DataSetInfoExtractorForProteinResultsTest.java
@@ -47,7 +47,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Experiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentTypePropertyType;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewExperiment;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
@@ -236,8 +236,8 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
                     will(returnValue(experiment));
 
                     one(service).listDataSetsByExperimentID(experiment.getId());
-                    ExternalData ds1 = new DataSetBuilder().code("ds1").getDataSet();
-                    ExternalData ds2 = new DataSetBuilder().code("ds2").getDataSet();
+                    AbstractExternalData ds1 = new DataSetBuilder().code("ds1").getDataSet();
+                    AbstractExternalData ds2 = new DataSetBuilder().code("ds2").getDataSet();
                     will(returnValue(Arrays.asList(ds1, ds2)));
 
                     one(service).registerExperiment(with(any(NewExperiment.class)));
@@ -410,7 +410,7 @@ public class DataSetInfoExtractorForProteinResultsTest extends AbstractFileSyste
         prepareGetDataSet(dataSetCode, new DataSetBuilder().code(dataSetCode).getDataSet());
     }
 
-    private void prepareGetDataSet(final String dataSetCode, final ExternalData data)
+    private void prepareGetDataSet(final String dataSetCode, final AbstractExternalData data)
     {
         context.checking(new Expectations()
             {
diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/RawDataSampleProviderTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/RawDataSampleProviderTest.java
index b8cc9fca88c4835d2a5a1b50932cf128cace515a..5626a6e859f8f3df14cb709b645c0f25cf3ad089 100644
--- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/RawDataSampleProviderTest.java
+++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/client/web/server/RawDataSampleProviderTest.java
@@ -34,7 +34,7 @@ import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.GenericEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
@@ -223,7 +223,7 @@ public class RawDataSampleProviderTest extends AbstractServerTestCase
                     List<MsInjectionSample> list = new ArrayList<MsInjectionSample>();
                     for (Sample sample : samples)
                     {
-                        list.add(new MsInjectionSample(sample, Arrays.<ExternalData>asList()));
+                        list.add(new MsInjectionSample(sample, Arrays.<AbstractExternalData>asList()));
                     }
                     will(returnValue(list));
                 }
diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalTest.java
index 03f978b5aa8527a3afb383a7e4cc54548e426551..54b09fb680a0775fd996f80d050f26182c9fa654 100644
--- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalTest.java
+++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/ProteomicsDataServiceInternalTest.java
@@ -43,7 +43,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStoreServiceKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetBuilder;
@@ -394,7 +394,7 @@ public class ProteomicsDataServiceInternalTest extends AbstractServerTestCase
                                             .registrationDate(new Date(ds2ChildId)).sample(sample)
                                             .type(dataSetType).getDataSet();
 
-                            ds2.setChildren(Arrays.<ExternalData> asList(ds2Child));
+                            ds2.setChildren(Arrays.<AbstractExternalData> asList(ds2Child));
                             dataSetsBySamples.put(sample, Arrays.asList(ds1, ds2));
 
                             filteredSamples.add(sample);
diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataServiceTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataServiceTest.java
index ff428ec4965942722054382fd090b23e0021c722..b811d70b2edf547cf4515dd6ac4701626e73e4a0 100644
--- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataServiceTest.java
+++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/api/v1/ProteomicsDataServiceTest.java
@@ -40,7 +40,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataTypeCode;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
@@ -170,10 +170,10 @@ public class ProteomicsDataServiceTest extends AbstractServerTestCase
         experiment.setProperties(Arrays.<IEntityProperty>asList(p6));
         parent.setExperiment(experiment);
         sample .setGeneratedFrom(parent);
-        final ExternalData ds1 = createDataSet(RAW_DATA, 10);
-        final ExternalData ds2 = createDataSet(MZXML_DATA, 20);
-        ExternalData ds3 = createDataSet(MZXML_DATA, 15);
-        ExternalData ds4 = createDataSet(RAW_DATA, 30);
+        final AbstractExternalData ds1 = createDataSet(RAW_DATA, 10);
+        final AbstractExternalData ds2 = createDataSet(MZXML_DATA, 20);
+        AbstractExternalData ds3 = createDataSet(MZXML_DATA, 15);
+        AbstractExternalData ds4 = createDataSet(RAW_DATA, 30);
         ds2.setChildren(Arrays.asList(ds3));
         ds3.setChildren(Arrays.asList(ds4));
         context.checking(new Expectations()
@@ -410,9 +410,9 @@ public class ProteomicsDataServiceTest extends AbstractServerTestCase
         return property;
     }
 
-    private ExternalData createDataSet(String type, long date)
+    private AbstractExternalData createDataSet(String type, long date)
     {
-        ExternalData dataSet = new ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet();
+        AbstractExternalData dataSet = new ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet();
         dataSet.setId(date);
         dataSet.setCode(type + "-" + date);
         dataSet.setDataSetType(new DataSetType(type));
diff --git a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/authorization/validator/RawDataSampleValidatorTest.java b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/authorization/validator/RawDataSampleValidatorTest.java
index 2b0483806985efd1834c709576f8583a69589917..9b91ff63b2b303198321c4d3cf95957eacf5acfd 100644
--- a/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/authorization/validator/RawDataSampleValidatorTest.java
+++ b/rtd_phosphonetx/sourceTest/java/ch/systemsx/cisd/openbis/plugin/proteomics/server/authorization/validator/RawDataSampleValidatorTest.java
@@ -23,7 +23,7 @@ import org.testng.AssertJUnit;
 import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
@@ -81,7 +81,7 @@ public class RawDataSampleValidatorTest extends AssertJUnit
             }
             sample.setGeneratedFrom(parent);
         }
-        return new MsInjectionSample(sample, Arrays.<ExternalData>asList());
+        return new MsInjectionSample(sample, Arrays.<AbstractExternalData>asList());
     }
 
     private static DatabaseInstance createDatabaseInstance(String code)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/ComputeIntensityLevelTransformationsMaintenanceTask.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/ComputeIntensityLevelTransformationsMaintenanceTask.java
index 4fe390990c2e22621a21e1d304d95b446191badf..20f8fc329308493841298c91da928aa377313f00 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/ComputeIntensityLevelTransformationsMaintenanceTask.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/ComputeIntensityLevelTransformationsMaintenanceTask.java
@@ -43,7 +43,7 @@ import ch.systemsx.cisd.openbis.dss.etl.jython.v1.SimpleImageDataSetRegistrator;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IHierarchicalContentProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.IImagingTransformerDAO;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgChannelDTO;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ImgImageDatasetDTO;
@@ -297,7 +297,7 @@ public class ComputeIntensityLevelTransformationsMaintenanceTask implements IMai
     private Levels computeIntensityRange(ImgImageDatasetDTO imageDataset,
             List<ImgChannelDTO> channels)
     {
-        ExternalData dataset = service.tryGetDataSet(imageDataset.getPermId());
+        AbstractExternalData dataset = service.tryGetDataSet(imageDataset.getPermId());
 
         if (dataset == null)
         {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/PlateStorageProcessor.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/PlateStorageProcessor.java
index d20dd4b63526eeb52740bc43d207d91d4b5ab0a2..a845640a531acebeb2e11818957d85474ff4c4cd 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/PlateStorageProcessor.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/PlateStorageProcessor.java
@@ -38,7 +38,7 @@ import ch.systemsx.cisd.openbis.dss.etl.dto.api.impl.ThumbnailsInfo;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.Size;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifier;
@@ -119,7 +119,7 @@ public final class PlateStorageProcessor extends AbstractImageStorageProcessor
                     dataSetOwner.tryToGetExperiment(), dataSetOwner.getExperimentIdentifier());
         }
 
-        private DatasetOwnerInformation(String dataSetCode, ExternalData containerOrNull,
+        private DatasetOwnerInformation(String dataSetCode, AbstractExternalData containerOrNull,
                 Sample sampleOrNull, SampleIdentifier sampleIdentifier,
                 IEntityProperty[] sampleProperties, Experiment experiment,
                 ExperimentIdentifier experimentIdentifier)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/featurevector/FeatureVectorStorageProcessor.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/featurevector/FeatureVectorStorageProcessor.java
index 70cd0c57689a4b224471fc9af86b7ce8bb29df2c..8977eb3e625cabe340751ffb63dcb6c0d39862a9 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/featurevector/FeatureVectorStorageProcessor.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/featurevector/FeatureVectorStorageProcessor.java
@@ -41,7 +41,7 @@ import ch.systemsx.cisd.openbis.dss.etl.dto.api.impl.ImageDataSetInformation;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.Geometry;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.ScreeningConstants;
@@ -224,7 +224,7 @@ public class FeatureVectorStorageProcessor extends AbstractDelegatingStorageProc
             List<String> parentDataSetCodes = dataSetInformation.getParentDataSetCodes();
             for (String dataSetCode : parentDataSetCodes)
             {
-                ExternalData externalData = openBisService.tryGetDataSet(dataSetCode);
+                AbstractExternalData externalData = openBisService.tryGetDataSet(dataSetCode);
                 if (externalData == null)
                 {
                     throw new UserFailureException("Cannot find a parent dataset in openBIS: "
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/genedata/FeatureStorageProcessor.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/genedata/FeatureStorageProcessor.java
index 1d93dacec0462a1f2b1fc2fd933e8c9fe75e1270..8207c032f5347f38087ac2968af6ac58a422fb1a 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/genedata/FeatureStorageProcessor.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/genedata/FeatureStorageProcessor.java
@@ -44,7 +44,7 @@ import ch.systemsx.cisd.openbis.dss.etl.featurevector.FeatureVectorUploader;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 import ch.systemsx.cisd.openbis.dss.generic.shared.dto.DataSetInformation;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 
 /**
@@ -235,7 +235,7 @@ public class FeatureStorageProcessor extends AbstractDelegatingStorageProcessor
             List<String> parentDataSetCodes = dataSetInformation.getParentDataSetCodes();
             for (String dataSetCode : parentDataSetCodes)
             {
-                ExternalData externalData = openBisService.tryGetDataSet(dataSetCode);
+                AbstractExternalData externalData = openBisService.tryGetDataSet(dataSetCode);
                 if (externalData == null)
                 {
                     throw new UserFailureException("Cannot find a parent dataset in openBIS: "
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/postregistration/RedoSegmentationOnFailureTask.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/postregistration/RedoSegmentationOnFailureTask.java
index 73bae9f81005cfb655e2e13ac6d841bc47afcedd..29b92f562071421809d0f9748f582c7be800d527 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/postregistration/RedoSegmentationOnFailureTask.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/postregistration/RedoSegmentationOnFailureTask.java
@@ -39,7 +39,7 @@ import ch.systemsx.cisd.etlserver.postregistration.NoCleanupTask;
 import ch.systemsx.cisd.openbis.dss.etl.dataaccess.IImagingQueryDAO;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.plugin.screening.server.logic.ScreeningUtils;
 
 /**
@@ -98,9 +98,9 @@ public class RedoSegmentationOnFailureTask extends AbstractPostRegistrationTask
             this.dataSetCode = dataSetCode;
         }
 
-        private String tryExtractLocation(ExternalData data)
+        private String tryExtractLocation(AbstractExternalData data)
         {
-            for (ExternalData containedDataSet : data.tryGetAsContainerDataSet()
+            for (AbstractExternalData containedDataSet : data.tryGetAsContainerDataSet()
                     .getContainedDataSets())
             {
                 if (false == containedDataSet.getDataSetType().getCode().contains("OVERVIEW"))
@@ -114,7 +114,7 @@ public class RedoSegmentationOnFailureTask extends AbstractPostRegistrationTask
         @Override
         public void execute()
         {
-            ExternalData data = service.tryGetDataSet(dataSetCode);
+            AbstractExternalData data = service.tryGetDataSet(dataSetCode);
 
             if (data.isContainer() && ScreeningUtils.isSegmentationHcsImageDataset(data))
             {
@@ -157,7 +157,7 @@ public class RedoSegmentationOnFailureTask extends AbstractPostRegistrationTask
             return dropboxDir;
         }
 
-        private File extractDataSetFile(ExternalData data)
+        private File extractDataSetFile(AbstractExternalData data)
         {
             String location = tryExtractLocation(data);
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java
index e84e43da27fe9e3bb08058cc6164bc0fe09475a8..6023113ff5b52bad79616de1417c671cb83afd9b 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java
@@ -32,7 +32,7 @@ import ch.systemsx.cisd.openbis.dss.shared.DssScreeningUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.CodeNormalizer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CodeAndLabel;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.PlateUtils;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.FeatureValue;
@@ -220,12 +220,12 @@ public class TabularDataGraphServlet extends AbstractTabularDataGraphServlet
                 @Override
                 public List<String> tryGetContainedDatasets(String datasetCode)
                 {
-                    ExternalData ds = openBISService.tryGetDataSet(datasetCode);
+                    AbstractExternalData ds = openBISService.tryGetDataSet(datasetCode);
                     ContainerDataSet container = ds.tryGetAsContainerDataSet();
                     if (container != null)
                     {
                         List<String> list = new LinkedList<String>();
-                        for (ExternalData contained : container.getContainedDataSets())
+                        for (AbstractExternalData contained : container.getContainedDataSets())
                         {
                             list.add(contained.getCode());
                         }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ImageAnalysisMergedRowsReportingPlugin.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ImageAnalysisMergedRowsReportingPlugin.java
index 14ed36be1a16079b907e3eb5c9378a180d8ea865..dbeeed4ee4e2cdb8429304e94cc2c7b0054c0555 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ImageAnalysisMergedRowsReportingPlugin.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ImageAnalysisMergedRowsReportingPlugin.java
@@ -32,7 +32,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.CodeNormalizer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CodeAndLabel;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DoubleTableCell;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ISerializableComparable;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IntegerTableCell;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.StringTableCell;
@@ -203,12 +203,12 @@ public class ImageAnalysisMergedRowsReportingPlugin extends AbstractTableModelRe
                 @Override
                 public List<String> tryGetContainedDatasets(String datasetCode)
                 {
-                    ExternalData ds = openBISService.tryGetDataSet(datasetCode);
+                    AbstractExternalData ds = openBISService.tryGetDataSet(datasetCode);
                     ContainerDataSet container = ds.tryGetAsContainerDataSet();
                     if (container != null)
                     {
                         List<String> list = new LinkedList<String>();
-                        for (ExternalData contained : container.getContainedDataSets())
+                        for (AbstractExternalData contained : container.getContainedDataSets())
                         {
                             list.add(contained.getCode());
                         }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java
index 1edce6ce134817198ab0def78fa9f956d3add059..6121b29d6483eaa51a41fa84cc6b494805e8994f 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java
@@ -71,7 +71,7 @@ import ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.LoadImageConfigurati
 import ch.systemsx.cisd.openbis.dss.shared.DssScreeningUtils;
 import ch.systemsx.cisd.openbis.generic.shared.basic.CodeNormalizer;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.AbstractFormatSelectionCriterion;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.DatasetImageRepresentationFormats;
@@ -567,12 +567,12 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
                 @Override
                 public List<String> tryGetContainedDatasets(String datasetCode)
                 {
-                    ExternalData ds = openBISService.tryGetDataSet(datasetCode);
+                    AbstractExternalData ds = openBISService.tryGetDataSet(datasetCode);
                     ContainerDataSet container = ds.tryGetAsContainerDataSet();
                     if (container != null)
                     {
                         List<String> list = new LinkedList<String>();
-                        for (ExternalData contained : container.getContainedDataSets())
+                        for (AbstractExternalData contained : container.getContainedDataSets())
                         {
                             list.add(contained.getCode());
                         }
@@ -1313,7 +1313,7 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
         Set<String> experimentPermIDs = new HashSet<String>();
         for (IDatasetIdentifier dataSetIdentifier : dataSetIdentifiers)
         {
-            ExternalData dataSet =
+            AbstractExternalData dataSet =
                     getOpenBISService().tryGetDataSet(sessionToken,
                             dataSetIdentifier.getDatasetCode());
             if (dataSet == null)
@@ -1498,7 +1498,7 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
                         tryCreateImageLoader(sessionToken, imageReference.getDatasetCode());
                 if (imageAccessor == null) // Check whether this is a feature vector data set
                 {
-                    final ExternalData imageDataset =
+                    final AbstractExternalData imageDataset =
                             tryFindImageDataset(sessionToken, imageReference.getDatasetCode());
                     if (imageDataset != null)
                     {
@@ -1618,9 +1618,9 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
         return loader;
     }
 
-    private ExternalData tryFindImageDataset(String sessionToken, String datasetCode)
+    private AbstractExternalData tryFindImageDataset(String sessionToken, String datasetCode)
     {
-        ExternalData dataset = tryGetDataSet(sessionToken, datasetCode);
+        AbstractExternalData dataset = tryGetDataSet(sessionToken, datasetCode);
         if (dataset == null)
         {
             throw new IllegalArgumentException("Dataset " + datasetCode + " cannot be found.");
@@ -1630,7 +1630,7 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
             return dataset;
         }
         // it may be the feature dataset
-        Collection<ExternalData> parents = dataset.getParents();
+        Collection<AbstractExternalData> parents = dataset.getParents();
         if (parents.size() > 1)
         {
             throw new IllegalArgumentException("Dataset " + datasetCode
@@ -1638,7 +1638,7 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
         }
         if (parents.size() == 1)
         {
-            ExternalData parent = parents.iterator().next();
+            AbstractExternalData parent = parents.iterator().next();
             if (isImageDataset(parent))
             {
                 return parent;
@@ -1680,7 +1680,7 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc
         return outputStream.toByteArray();
     }
 
-    private boolean isImageDataset(ExternalData dataset)
+    private boolean isImageDataset(AbstractExternalData dataset)
     {
         String datasetTypeCode = dataset.getDataSetType().getCode();
         return datasetTypeCode.matches(ScreeningConstants.ANY_HCS_IMAGE_DATASET_TYPE_PATTERN)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientService.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientService.java
index 93331c7d63b85cb19315874f99e0bc9ca58bbaa4..f58eeb7ca73f09deb9f8f16de318ec0f661cc2c4 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientService.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientService.java
@@ -27,7 +27,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSe
 import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CodeAndLabel;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
@@ -76,9 +76,9 @@ public interface IScreeningClientService extends IClientService
             throws UserFailureException;
 
     /**
-     * For given {@link TechId} returns corresponding {@link ExternalData}.
+     * For given {@link TechId} returns corresponding {@link AbstractExternalData}.
      */
-    public ExternalData getDataSetInfo(TechId datasetTechId) throws UserFailureException;
+    public AbstractExternalData getDataSetInfo(TechId datasetTechId) throws UserFailureException;
 
     /**
      * For given {@link TechId} returns corresponding {@link Material}.
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientServiceAsync.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientServiceAsync.java
index 1fc97b8b20a755c4c4ea5126630b74a60632e5ad..020fbe2f1a7096e12b73f22f1c84e3fcdad3e82a 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientServiceAsync.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/IScreeningClientServiceAsync.java
@@ -28,7 +28,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.dto.TypedTableResultSe
 import ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CodeAndLabel;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
@@ -85,7 +85,7 @@ public interface IScreeningClientServiceAsync extends IClientServiceAsync
             AsyncCallback<PlateImages> createDisplayPlateCallback);
 
     /** @see IScreeningClientService#getDataSetInfo(TechId) */
-    public void getDataSetInfo(TechId datasetTechId, AsyncCallback<ExternalData> callback);
+    public void getDataSetInfo(TechId datasetTechId, AsyncCallback<AbstractExternalData> callback);
 
     /** @see IScreeningClientService#getMaterialInfo(TechId) */
     public void getMaterialInfo(TechId materialTechId, AsyncCallback<Material> callback)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImageDataSetSection.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImageDataSetSection.java
index 6cf7be811732037f652bd17072fad90a7cba7be6..6043fd0a541dacf1fc3a9150e7eee6830f640b2a 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImageDataSetSection.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImageDataSetSection.java
@@ -26,7 +26,7 @@ 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.TabContent;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ScreeningViewContext;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.heatmaps.LayoutUtils;
@@ -39,7 +39,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
  */
 public class ImageDataSetSection extends TabContent
 {
-    private final ExternalData dataSet;
+    private final AbstractExternalData dataSet;
 
     private final WellLocation wellLocationOrNull;
 
@@ -47,7 +47,7 @@ public class ImageDataSetSection extends TabContent
 
     private static final String WELL_IMAGE_SECTION_TITLE_SUFFIX = " Images";
 
-    public ImageDataSetSection(final ScreeningViewContext viewContext, final ExternalData dataSet,
+    public ImageDataSetSection(final ScreeningViewContext viewContext, final AbstractExternalData dataSet,
             WellLocation wellLocationOrNull)
     {
         super(WELL_IMAGE_SECTION_TITLE_PREFIX
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImageDataSetViewer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImageDataSetViewer.java
index f27ea4b7390fcbf9ba802bb6c0bc0208d3121b83..132de292f3b9af04600f573fdd5b00e16f21b827 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImageDataSetViewer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/ImageDataSetViewer.java
@@ -25,7 +25,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.TabContent
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareComponent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset.GenericDataSetViewer;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ScreeningViewContext;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.WellLocation;
@@ -58,7 +58,7 @@ public class ImageDataSetViewer extends GenericDataSetViewer
     }
 
     @Override
-    protected List<TabContent> createAdditionalSectionPanels(ExternalData dataset)
+    protected List<TabContent> createAdditionalSectionPanels(AbstractExternalData dataset)
     {
         List<TabContent> sections = new ArrayList<TabContent>();
 
@@ -67,7 +67,7 @@ public class ImageDataSetViewer extends GenericDataSetViewer
     }
 
     @Override
-    protected void loadDatasetInfo(TechId datasetTechId, AsyncCallback<ExternalData> asyncCallback)
+    protected void loadDatasetInfo(TechId datasetTechId, AsyncCallback<AbstractExternalData> asyncCallback)
     {
         screeningViewContext.getService().getDataSetInfo(datasetTechId, asyncCallback);
     }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/LogicalImageDatasetSection.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/LogicalImageDatasetSection.java
index 4060a1a966107ad67425bb3235191f54ec3efa95..4ba7f8af9a4ff5d75f7c4f1ec687c48f66be44e1 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/LogicalImageDatasetSection.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/LogicalImageDatasetSection.java
@@ -25,7 +25,7 @@ import com.google.gwt.user.client.ui.Widget;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.TabContent;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.DisplayTypeIDGenerator;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ScreeningViewContext;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.detailviewers.dto.LogicalImageReference;
@@ -40,10 +40,10 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.basic.dto.LogicalImageIn
  */
 public class LogicalImageDatasetSection extends TabContent
 {
-    private final ExternalData dataset;
+    private final AbstractExternalData dataset;
 
     public LogicalImageDatasetSection(final ScreeningViewContext viewContext,
-            final ExternalData dataset)
+            final AbstractExternalData dataset)
     {
         super("Images", viewContext, dataset);
         this.dataset = dataset;
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MicroscopyDatasetViewer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MicroscopyDatasetViewer.java
index bb169eefe65470ee480e8cfe2ff4ddeda87daaaf..515ba0f081358a5eee5d0b019e2d910edbfbb2af 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MicroscopyDatasetViewer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/MicroscopyDatasetViewer.java
@@ -25,7 +25,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.TabContent
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareComponent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset.GenericDataSetViewer;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ScreeningViewContext;
 
@@ -54,13 +54,13 @@ public final class MicroscopyDatasetViewer extends GenericDataSetViewer
     }
 
     @Override
-    protected void loadDatasetInfo(TechId datasetTechId, AsyncCallback<ExternalData> asyncCallback)
+    protected void loadDatasetInfo(TechId datasetTechId, AsyncCallback<AbstractExternalData> asyncCallback)
     {
         screeningViewContext.getService().getDataSetInfo(datasetTechId, asyncCallback);
     }
 
     @Override
-    protected List<TabContent> createAdditionalSectionPanels(ExternalData dataset)
+    protected List<TabContent> createAdditionalSectionPanels(AbstractExternalData dataset)
     {
         List<TabContent> sections = new ArrayList<TabContent>();
         if (dataset.tryGetContainer() == null)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateDatasetViewer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateDatasetViewer.java
index f4c496981fd5d7d68cc21b6fffafddf132b47961..64920d55be823e1873ab4155a984c95e9aea2dbe 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateDatasetViewer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/client/application/detailviewers/PlateDatasetViewer.java
@@ -25,7 +25,7 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.TabContent
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DatabaseModificationAwareComponent;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.plugin.generic.client.web.client.application.dataset.GenericDataSetViewer;
 import ch.systemsx.cisd.openbis.plugin.screening.client.web.client.application.ScreeningViewContext;
 
@@ -54,13 +54,13 @@ public final class PlateDatasetViewer extends GenericDataSetViewer
     }
 
     @Override
-    protected void loadDatasetInfo(TechId datasetTechId, AsyncCallback<ExternalData> asyncCallback)
+    protected void loadDatasetInfo(TechId datasetTechId, AsyncCallback<AbstractExternalData> asyncCallback)
     {
         screeningViewContext.getService().getDataSetInfo(datasetTechId, asyncCallback);
     }
 
     @Override
-    protected List<TabContent> createAdditionalSectionPanels(ExternalData dataset)
+    protected List<TabContent> createAdditionalSectionPanels(AbstractExternalData dataset)
     {
         List<TabContent> sections = new ArrayList<TabContent>();
 
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/ScreeningClientService.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/ScreeningClientService.java
index 9ab1a4f3c0124ca3027320c0b3f81594b6f33d0d..cee544c2edbd719485e6867ec4cb32d0355fc855 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/ScreeningClientService.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/client/web/server/ScreeningClientService.java
@@ -42,7 +42,7 @@ import ch.systemsx.cisd.openbis.generic.shared.ICommonServer;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CodeAndLabel;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.SampleParentWithDerived;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModelRowWithObject;
@@ -137,7 +137,7 @@ public final class ScreeningClientService extends AbstractClientService implemen
     }
 
     @Override
-    public ExternalData getDataSetInfo(TechId datasetTechId)
+    public AbstractExternalData getDataSetInfo(TechId datasetTechId)
     {
         return server.getDataSetInfo(getSessionToken(), datasetTechId);
     }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
index 367c25e3790ade20f63e3b0a4ce9c9e0d0343b91..33c015798db8c5a3e5ef627c114960261eb845c8 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServer.java
@@ -54,7 +54,7 @@ import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicProjectIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CodeAndLabel;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListMaterialCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
@@ -360,7 +360,7 @@ public final class ScreeningServer extends AbstractServer<IScreeningServer> impl
 
     @Override
     @RolesAllowed(RoleWithHierarchy.SPACE_OBSERVER)
-    public ExternalData getDataSetInfo(String sessionToken,
+    public AbstractExternalData getDataSetInfo(String sessionToken,
             @AuthorizationGuard(guardClass = DataSetTechIdPredicate.class)
             TechId datasetId)
     {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServerLogger.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServerLogger.java
index 7440da4c4ae292b640e857608cb4b467e0637ae4..8f3da1e0271ae3c95c221e8605ad98ef38ffbc0d 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServerLogger.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/ScreeningServerLogger.java
@@ -26,7 +26,7 @@ import ch.systemsx.cisd.openbis.generic.shared.AbstractServerLogger;
 import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CodeAndLabel;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewAttachment;
@@ -195,7 +195,7 @@ final class ScreeningServerLogger extends AbstractServerLogger implements IScree
     }
 
     @Override
-    public ExternalData getDataSetInfo(String sessionToken, TechId datasetId)
+    public AbstractExternalData getDataSetInfo(String sessionToken, TechId datasetId)
     {
         logAccess(sessionToken, "getDataSetInfo", "datasetId(%s)", datasetId.getId());
         return null;
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/AnalysisSettings.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/AnalysisSettings.java
index 20607e89ada05dcd185d81e8a6a9bfda00a5882c..8eabbaa414a612ebd9d5cb3a596019a9b08f1698 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/AnalysisSettings.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/AnalysisSettings.java
@@ -21,7 +21,7 @@ import java.util.Map;
 import java.util.Properties;
 
 import ch.systemsx.cisd.common.exceptions.ConfigurationFailureException;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 
 /**
  * Helper class which knows data set types which assume that the data set has the analysis summary
@@ -75,7 +75,7 @@ public class AnalysisSettings
      * data set type of the specified data set no reporting plugin providing an analysis summary has
      * been configured.
      */
-    public String tryToGetReportingPluginKey(ExternalData ds)
+    public String tryToGetReportingPluginKey(AbstractExternalData ds)
     {
         return dataSetType2reportingPluginMap.get(ds.getDataSetType().getCode());
     }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ExperimentFeatureVectorSummaryLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ExperimentFeatureVectorSummaryLoader.java
index c9401d2f08dff8deecc6d32ae59a3e3ec20898b1..e00b78363472152d14a6ce092b0e076873bdd320 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ExperimentFeatureVectorSummaryLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ExperimentFeatureVectorSummaryLoader.java
@@ -33,7 +33,7 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.IDataSetTable;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CodeAndLabel;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListMaterialCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.TableModel;
@@ -78,14 +78,14 @@ public class ExperimentFeatureVectorSummaryLoader extends AbstractContentLoader
         ExperimentReference experiment = loadExperimentByTechId(experimentId);
         if (analysisSettings.noAnalysisSettings() == false)
         {
-            List<ExternalData> matchingDataSets =
+            List<AbstractExternalData> matchingDataSets =
                     getMatchingDataSets(experimentId, analysisProcedureCriteria, analysisSettings);
             TableModel tabelModel =
                     new TableModel(Collections.<TableModelColumnHeader> emptyList(),
                             Collections.<TableModelRow> emptyList());
             if (matchingDataSets.size() == 1)
             {
-                ExternalData ds = matchingDataSets.get(0);
+                AbstractExternalData ds = matchingDataSets.get(0);
                 String reportingPluginKey = analysisSettings.tryToGetReportingPluginKey(ds);
                 String dataStore = ds.getDataStore().getCode();
                 List<String> codes = Arrays.asList(ds.getCode());
@@ -135,21 +135,21 @@ public class ExperimentFeatureVectorSummaryLoader extends AbstractContentLoader
                 summaries.getFeatureNames(), null);
     }
 
-    private UserFailureException decorateException(Exception ex, ExternalData dataSet,
+    private UserFailureException decorateException(Exception ex, AbstractExternalData dataSet,
             String message)
     {
         return new UserFailureException("Analysis summary for data set " + dataSet.getCode()
                 + " couldn't retrieved from Data Store Server. " + message, ex);
     }
 
-    private List<ExternalData> getMatchingDataSets(TechId experimentId,
+    private List<AbstractExternalData> getMatchingDataSets(TechId experimentId,
             AnalysisProcedureCriteria analysisProcedureCriteria, AnalysisSettings analysisSettings)
     {
-        List<ExternalData> dataSets =
+        List<AbstractExternalData> dataSets =
                 businessObjectFactory.createDatasetLister(session).listByExperimentTechId(
                         experimentId, true);
-        List<ExternalData> matchingDataSets = new ArrayList<ExternalData>();
-        for (ExternalData dataSet : dataSets)
+        List<AbstractExternalData> matchingDataSets = new ArrayList<AbstractExternalData>();
+        for (AbstractExternalData dataSet : dataSets)
         {
             if (ScreeningUtils.isMatchingAnalysisProcedure(dataSet, analysisProcedureCriteria)
                     && analysisSettings.tryToGetReportingPluginKey(dataSet) != null)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java
index 5437c7cb39b2d9bd1569414eaed1f934aa1cb9b1..b1b60501bba26a4f28e745dba00745b54909da9e 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoader.java
@@ -30,7 +30,7 @@ import java.util.Set;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.plugin.screening.server.IScreeningBusinessObjectFactory;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.FeatureVectorDatasetReference;
@@ -51,7 +51,7 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
     private final AnalysisProcedureCriteria analysisProcedureCriteria;
 
     // Running state
-    private Collection<ExternalData> featureVectorDatasets;
+    private Collection<AbstractExternalData> featureVectorDatasets;
 
     FeatureVectorDatasetLoader(Session session,
             IScreeningBusinessObjectFactory businessObjectFactory, String homeSpaceOrNull,
@@ -75,23 +75,23 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
 
     public static class FeatureVectorExternalData
     {
-        private final ExternalData featureVectorDataset;
+        private final AbstractExternalData featureVectorDataset;
 
-        private final ExternalData imageDatasetOrNull;
+        private final AbstractExternalData imageDatasetOrNull;
 
-        public FeatureVectorExternalData(ExternalData featureVectorDataset,
-                ExternalData imageDatasetOrNull)
+        public FeatureVectorExternalData(AbstractExternalData featureVectorDataset,
+                AbstractExternalData imageDatasetOrNull)
         {
             this.featureVectorDataset = featureVectorDataset;
             this.imageDatasetOrNull = imageDatasetOrNull;
         }
 
-        public ExternalData getFeatureVectorDataset()
+        public AbstractExternalData getFeatureVectorDataset()
         {
             return featureVectorDataset;
         }
 
-        public ExternalData tryGetImageDataset()
+        public AbstractExternalData tryGetImageDataset()
         {
             return imageDatasetOrNull;
         }
@@ -101,7 +101,7 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
      * Enriched with image dataset parents. Note that all feature vector datasets have to be
      * connected directly to the plate, otherwise they will be skipped.
      */
-    public Collection<ExternalData> getFeatureVectorDatasets()
+    public Collection<AbstractExternalData> getFeatureVectorDatasets()
     {
         loadAll();
         return featureVectorDatasets;
@@ -122,10 +122,10 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
 
     private void loadFeatureVectorDatasets()
     {
-        final Map<Long, ExternalData> featureVectorDatasetSet = new HashMap<Long, ExternalData>();
+        final Map<Long, AbstractExternalData> featureVectorDatasetSet = new HashMap<Long, AbstractExternalData>();
 
-        List<ExternalData> imageDatasets = new ArrayList<ExternalData>();
-        for (ExternalData dataset : getDatasets())
+        List<AbstractExternalData> imageDatasets = new ArrayList<AbstractExternalData>();
+        for (AbstractExternalData dataset : getDatasets())
         {
             if (isMatchingAnalysisDataSet(dataset))
             {
@@ -142,9 +142,9 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
         // Add feature vector datasets which are not connected directly to the plate, but are
         // connected to the image dataset.
         // These datasets are already enriched with parent datasets.
-        List<ExternalData> childrenDatasets =
+        List<AbstractExternalData> childrenDatasets =
                 fetchChildrenDataSets(imageDatasets, featureVectorDatasetTypeCode, datasetLister);
-        for (ExternalData dataset : childrenDatasets)
+        for (AbstractExternalData dataset : childrenDatasets)
         {
             if (isMatchingAnalysisDataSet(dataset))
             {
@@ -155,12 +155,12 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
         featureVectorDatasets = featureVectorDatasetSet.values();
     }
 
-    private boolean isMatchingImageDataset(ExternalData dataset)
+    private boolean isMatchingImageDataset(AbstractExternalData dataset)
     {
         return isTypeMatching(dataset, ANY_HCS_IMAGE_DATASET_TYPE_PATTERN);
     }
 
-    private boolean isMatchingAnalysisDataSet(ExternalData dataset)
+    private boolean isMatchingAnalysisDataSet(AbstractExternalData dataset)
     {
         return isTypeMatching(dataset, HCS_IMAGE_ANALYSIS_DATASET_TYPE_PATTERN)
                 && ScreeningUtils.isMatchingAnalysisProcedure(dataset, analysisProcedureCriteria);
@@ -169,16 +169,16 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
     private List<FeatureVectorDatasetReference> asFeatureVectorDatasetReferences()
     {
         List<FeatureVectorDatasetReference> result = new ArrayList<FeatureVectorDatasetReference>();
-        for (ExternalData externalData : featureVectorDatasets)
+        for (AbstractExternalData externalData : featureVectorDatasets)
         {
             result.add(asFeatureVectorDataset(externalData));
         }
         return result;
     }
 
-    private static ExternalData tryGetOneParent(ExternalData externalData)
+    private static AbstractExternalData tryGetOneParent(AbstractExternalData externalData)
     {
-        Collection<ExternalData> parents = externalData.getParents();
+        Collection<AbstractExternalData> parents = externalData.getParents();
         if (parents != null && parents.size() == 1)
         {
             return parents.iterator().next();
@@ -188,11 +188,11 @@ class FeatureVectorDatasetLoader extends HCSImageDatasetLoader
         }
     }
 
-    protected FeatureVectorDatasetReference asFeatureVectorDataset(ExternalData externalData)
+    protected FeatureVectorDatasetReference asFeatureVectorDataset(AbstractExternalData externalData)
     {
         DataStore dataStore = externalData.getDataStore();
         // there should be no more parents than one, we ensure about that earlier
-        ExternalData parentDataset = tryGetOneParent(externalData);
+        AbstractExternalData parentDataset = tryGetOneParent(externalData);
         DataSetType dataSetType = externalData.getDataSetType();
         String dataSetTypeCodeOrNull = dataSetType == null ? null : dataSetType.getCode();
         if (parentDataset == null)
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoader.java
index 0942ad3d12c484d42004f5c3e41908896226f863..1c8c77939d0f86dfdd65ec28283be75c55df7162 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoader.java
@@ -28,7 +28,7 @@ import java.util.Set;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.plugin.screening.server.IScreeningBusinessObjectFactory;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.ImageDatasetReference;
@@ -44,23 +44,23 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
 {
     // TODO 2010-05-27, CR : See PlateDatasetLoader todo comment
 
-    protected static Collection<Long> extractIds(List<ExternalData> datasets)
+    protected static Collection<Long> extractIds(List<AbstractExternalData> datasets)
     {
         List<Long> ids = new ArrayList<Long>();
-        for (ExternalData dataset : datasets)
+        for (AbstractExternalData dataset : datasets)
         {
             ids.add(dataset.getId());
         }
         return ids;
     }
 
-    private static Map<Long/* child data set id */, ExternalData/* parent data sets */> createChildToParentDataSetsMap(
-            Map<Long, Set<Long>> childIdToParentIdsMap, List<ExternalData> parentDatasets)
+    private static Map<Long/* child data set id */, AbstractExternalData/* parent data sets */> createChildToParentDataSetsMap(
+            Map<Long, Set<Long>> childIdToParentIdsMap, List<AbstractExternalData> parentDatasets)
     {
-        Map<Long, ExternalData> childDataSetToParentDataSetsMap = new HashMap<Long, ExternalData>();
+        Map<Long, AbstractExternalData> childDataSetToParentDataSetsMap = new HashMap<Long, AbstractExternalData>();
         for (Entry<Long, Set<Long>> entry : childIdToParentIdsMap.entrySet())
         {
-            List<ExternalData> parents = findDatasetsWithIds(entry.getValue(), parentDatasets);
+            List<AbstractExternalData> parents = findDatasetsWithIds(entry.getValue(), parentDatasets);
             // NOTE: if a child data set has more than one parent data set, all the
             // parents will be ignored.
             if (parents.size() == 1)
@@ -72,11 +72,11 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
         return childDataSetToParentDataSetsMap;
     }
 
-    private static List<ExternalData> findDatasetsWithIds(Set<Long> datasetIds,
-            List<ExternalData> datasets)
+    private static List<AbstractExternalData> findDatasetsWithIds(Set<Long> datasetIds,
+            List<AbstractExternalData> datasets)
     {
-        List<ExternalData> found = new ArrayList<ExternalData>();
-        for (ExternalData dataset : datasets)
+        List<AbstractExternalData> found = new ArrayList<AbstractExternalData>();
+        for (AbstractExternalData dataset : datasets)
         {
             if (datasetIds.contains(dataset.getId()))
             {
@@ -98,7 +98,7 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
     /**
      * Return the image datasets for the specified plates.
      */
-    public List<ExternalData> getImageDatasets()
+    public List<AbstractExternalData> getImageDatasets()
     {
         load();
         return filterImageDatasets();
@@ -107,7 +107,7 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
     /**
      * Return the raw image datasets for the specified plates.
      */
-    private List<ExternalData> getRawImageDatasets()
+    private List<AbstractExternalData> getRawImageDatasets()
     {
         load();
         return filterRawImageDatasets();
@@ -116,11 +116,11 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
     /**
      * Return the segmentation image datasets (overlays) for the specified plates.
      */
-    private List<ExternalData> getSegmentationImageDatasets()
+    private List<AbstractExternalData> getSegmentationImageDatasets()
     {
         load();
-        List<ExternalData> imageDatasets = new ArrayList<ExternalData>();
-        for (ExternalData dataset : getDatasets())
+        List<AbstractExternalData> imageDatasets = new ArrayList<AbstractExternalData>();
+        for (AbstractExternalData dataset : getDatasets())
         {
             if (ScreeningUtils.isBasicHcsImageDataset(dataset))
             {
@@ -158,10 +158,10 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
         return asImageDatasetReferences(getSegmentationImageDatasets());
     }
 
-    private List<ExternalData> filterImageDatasets()
+    private List<AbstractExternalData> filterImageDatasets()
     {
-        List<ExternalData> result = new ArrayList<ExternalData>();
-        for (ExternalData externalData : getDatasets())
+        List<AbstractExternalData> result = new ArrayList<AbstractExternalData>();
+        for (AbstractExternalData externalData : getDatasets())
         {
             if (ScreeningUtils.isBasicHcsImageDataset(externalData))
             {
@@ -174,10 +174,10 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
         return result;
     }
 
-    private List<ExternalData> filterRawImageDatasets()
+    private List<AbstractExternalData> filterRawImageDatasets()
     {
-        List<ExternalData> result = new ArrayList<ExternalData>();
-        for (ExternalData externalData : getDatasets())
+        List<AbstractExternalData> result = new ArrayList<AbstractExternalData>();
+        for (AbstractExternalData externalData : getDatasets())
         {
             if (ScreeningUtils.isRawHcsImageDataset(externalData))
             {
@@ -187,10 +187,10 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
         return result;
     }
 
-    private List<ImageDatasetReference> asImageDatasetReferences(List<ExternalData> imageDatasets)
+    private List<ImageDatasetReference> asImageDatasetReferences(List<AbstractExternalData> imageDatasets)
     {
         List<ImageDatasetReference> references = new ArrayList<ImageDatasetReference>();
-        for (ExternalData imageDataset : imageDatasets)
+        for (AbstractExternalData imageDataset : imageDatasets)
         {
             ImageDatasetReference reference = tryAsImageDataset(imageDataset);
             if (reference != null)
@@ -202,20 +202,20 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
     }
 
     /** Sets parents of all datasets in 'childrenDataSets'. */
-    protected void enrichWithParentDatasets(Collection<ExternalData> childrenDataSets,
-            List<ExternalData> parentDataSets, String childTypePattern, IDatasetLister datasetLister)
+    protected void enrichWithParentDatasets(Collection<AbstractExternalData> childrenDataSets,
+            List<AbstractExternalData> parentDataSets, String childTypePattern, IDatasetLister datasetLister)
     {
-        Map<Long/* child id */, ExternalData/* parent */> childIdToParentDataSetMap =
+        Map<Long/* child id */, AbstractExternalData/* parent */> childIdToParentDataSetMap =
                 createChildToParentDataSetsMap(parentDataSets, childTypePattern, datasetLister);
         enrichWithParentDatasets(childrenDataSets, childIdToParentDataSetMap);
     }
 
-    private void enrichWithParentDatasets(Collection<ExternalData> childrenDataSets,
-            Map<Long, ExternalData> childIdToParentDataSetMap)
+    private void enrichWithParentDatasets(Collection<AbstractExternalData> childrenDataSets,
+            Map<Long, AbstractExternalData> childIdToParentDataSetMap)
     {
-        for (ExternalData child : childrenDataSets)
+        for (AbstractExternalData child : childrenDataSets)
         {
-            ExternalData parentImageDataset = childIdToParentDataSetMap.get(child.getId());
+            AbstractExternalData parentImageDataset = childIdToParentDataSetMap.get(child.getId());
             if (parentImageDataset != null)
             {
                 child.setParents(Arrays.asList(parentImageDataset));
@@ -223,10 +223,10 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
         }
     }
 
-    private Map<Long, ExternalData> createChildToParentDataSetsMap(
-            List<ExternalData> parentDataSets, String childTypePattern, IDatasetLister datasetLister)
+    private Map<Long, AbstractExternalData> createChildToParentDataSetsMap(
+            List<AbstractExternalData> parentDataSets, String childTypePattern, IDatasetLister datasetLister)
     {
-        List<ExternalData> filteredChildrenForParents =
+        List<AbstractExternalData> filteredChildrenForParents =
                 listFilteredChildrenDataSets(parentDataSets, childTypePattern, datasetLister);
         return createChildToParentDataSetsMap(filteredChildrenForParents, parentDataSets,
                 datasetLister);
@@ -236,12 +236,12 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
      * Fetched children datasets (with a matching type) for the specified parent datasets, sets
      * their parents.
      */
-    protected List<ExternalData> fetchChildrenDataSets(List<ExternalData> parentDataSets,
+    protected List<AbstractExternalData> fetchChildrenDataSets(List<AbstractExternalData> parentDataSets,
             String childTypePattern, IDatasetLister datasetLister)
     {
-        List<ExternalData> filteredChildrenForParents =
+        List<AbstractExternalData> filteredChildrenForParents =
                 listFilteredChildrenDataSets(parentDataSets, childTypePattern, datasetLister);
-        Map<Long, ExternalData> childIdToParentDataSetsMap =
+        Map<Long, AbstractExternalData> childIdToParentDataSetsMap =
                 createChildToParentDataSetsMap(filteredChildrenForParents, parentDataSets,
                         datasetLister);
 
@@ -249,12 +249,12 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
         return filteredChildrenForParents;
     }
 
-    private static void setParentDatasets(List<ExternalData> childrenDatasets,
-            Map<Long, ExternalData> childIdToParentDataSetsMap)
+    private static void setParentDatasets(List<AbstractExternalData> childrenDatasets,
+            Map<Long, AbstractExternalData> childIdToParentDataSetsMap)
     {
-        for (ExternalData child : childrenDatasets)
+        for (AbstractExternalData child : childrenDatasets)
         {
-            ExternalData parentImageDataset = childIdToParentDataSetsMap.get(child.getId());
+            AbstractExternalData parentImageDataset = childIdToParentDataSetsMap.get(child.getId());
             if (parentImageDataset != null)
             {
                 child.setParents(Arrays.asList(parentImageDataset));
@@ -262,8 +262,8 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
         }
     }
 
-    private Map<Long, ExternalData> createChildToParentDataSetsMap(
-            List<ExternalData> childrenDataSets, List<ExternalData> parentDataSets,
+    private Map<Long, AbstractExternalData> createChildToParentDataSetsMap(
+            List<AbstractExternalData> childrenDataSets, List<AbstractExternalData> parentDataSets,
             IDatasetLister datasetLister)
     {
         Collection<Long> childrenIds = extractIds(childrenDataSets);
@@ -276,14 +276,14 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
         return businessObjectFactory.createDatasetLister(session);
     }
 
-    private List<ExternalData> listFilteredChildrenDataSets(List<ExternalData> parentDataSets,
+    private List<AbstractExternalData> listFilteredChildrenDataSets(List<AbstractExternalData> parentDataSets,
             String childTypePattern, IDatasetLister datasetLister)
     {
         return ScreeningUtils.filterExternalDataByTypePattern(
                 datasetLister.listByParentTechIds(extractIds(parentDataSets)), childTypePattern);
     }
 
-    private ExternalData tryGetParent(ExternalData externalData)
+    private AbstractExternalData tryGetParent(AbstractExternalData externalData)
     {
         if (externalData.getParents() != null && externalData.getParents().size() == 1)
         {
@@ -294,7 +294,7 @@ class HCSImageDatasetLoader extends PlateDatasetLoader
         }
     }
 
-    protected ImageDatasetReference tryAsImageDataset(ExternalData externalData)
+    protected ImageDatasetReference tryAsImageDataset(AbstractExternalData externalData)
     {
         if (externalData == null || ScreeningUtils.isHcsImageDataset(externalData) == false)
         {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/LogicalImageLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/LogicalImageLoader.java
index 274c8662475f4a21119aa460908151b875d4d032..a9ca89946d7894804e9b75615ee8fa78564a11b7 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/LogicalImageLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/LogicalImageLoader.java
@@ -21,7 +21,7 @@ import java.util.Collection;
 import java.util.List;
 
 import ch.systemsx.cisd.openbis.generic.server.business.bo.IDataBO;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
@@ -149,11 +149,11 @@ public class LogicalImageLoader
 
     private List<DatasetOverlayImagesReference> extractImageOverlays(DataPE imageDataset)
     {
-        List<ExternalData> overlayDatasets = fetchOverlayDatasets(imageDataset);
+        List<AbstractExternalData> overlayDatasets = fetchOverlayDatasets(imageDataset);
 
         List<DatasetOverlayImagesReference> overlays =
                 new ArrayList<DatasetOverlayImagesReference>();
-        for (ExternalData overlay : overlayDatasets)
+        for (AbstractExternalData overlay : overlayDatasets)
         {
             DatasetOverlayImagesReference ref = tryLoadOverlayDatasetReference(overlay);
             if (ref != null)
@@ -164,7 +164,7 @@ public class LogicalImageLoader
         return overlays;
     }
 
-    private List<ExternalData> fetchOverlayDatasets(DataPE imageDataset)
+    private List<AbstractExternalData> fetchOverlayDatasets(DataPE imageDataset)
     {
         List<DataPE> overlayPEs =
                 ScreeningUtils.filterImageOverlayDatasets(imageDataset.getChildren());
@@ -172,7 +172,7 @@ public class LogicalImageLoader
         return businessObjectFactory.createDatasetLister(session).listByDatasetIds(datasetIds);
     }
 
-    private DatasetOverlayImagesReference tryLoadOverlayDatasetReference(ExternalData overlay)
+    private DatasetOverlayImagesReference tryLoadOverlayDatasetReference(AbstractExternalData overlay)
     {
         DatasetImagesReference imageDatasetReference = tryLoadImageDatasetReference(overlay);
         if (imageDatasetReference == null)
@@ -184,12 +184,12 @@ public class LogicalImageLoader
                 imageDatasetReference.getImageParameters(), analysisProcedure);
     }
 
-    private String tryGetAnalysisProcedure(ExternalData dataset)
+    private String tryGetAnalysisProcedure(AbstractExternalData dataset)
     {
         return EntityHelper.tryFindPropertyValue(dataset, ScreeningConstants.ANALYSIS_PROCEDURE);
     }
 
-    private DatasetImagesReference tryLoadImageDatasetReference(ExternalData dataset)
+    private DatasetImagesReference tryLoadImageDatasetReference(AbstractExternalData dataset)
     {
         ImageDatasetParameters imageParameters =
                 ScreeningUtils.tryLoadImageParameters(dataset, businessObjectFactory);
@@ -200,7 +200,7 @@ public class LogicalImageLoader
         return createDatasetImagesReference(dataset, imageParameters);
     }
 
-    private DatasetImagesReference createDatasetImagesReference(ExternalData dataset,
+    private DatasetImagesReference createDatasetImagesReference(AbstractExternalData dataset,
             ImageDatasetParameters imageParameters)
     {
         return DatasetImagesReference.create(ScreeningUtils.createDatasetReference(dataset),
@@ -231,7 +231,7 @@ public class LogicalImageLoader
         return ids;
     }
 
-    private ExternalData translate(DataPE dataSet)
+    private AbstractExternalData translate(DataPE dataSet)
     {
         return DataSetTranslator.translate(dataSet, session.getBaseIndexURL(), null,
                 managedPropertyEvaluatorFactory);
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/MaterialFeaturesFromAllExperimentsLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/MaterialFeaturesFromAllExperimentsLoader.java
index 9af6d9c266a236322e87dcf154e2107c88e542d6..a1e990f616a4a84e2cd00999b6e8fac8bd5cb549 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/MaterialFeaturesFromAllExperimentsLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/MaterialFeaturesFromAllExperimentsLoader.java
@@ -26,7 +26,7 @@ import org.apache.commons.lang.time.StopWatch;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatasetLister;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.Session;
 import ch.systemsx.cisd.openbis.plugin.screening.server.IScreeningBusinessObjectFactory;
 import ch.systemsx.cisd.openbis.plugin.screening.server.dataaccess.ExperimentReferenceQueryResult;
@@ -164,7 +164,7 @@ public class MaterialFeaturesFromAllExperimentsLoader extends AbstractContentLoa
     private int countAnalysisDatasets(ExperimentReference experiment)
     {
         IDatasetLister lister = businessObjectFactory.createDatasetLister(session);
-        List<ExternalData> datasets =
+        List<AbstractExternalData> datasets =
                 lister.listByExperimentTechId(new TechId(experiment.getId()), true);
         return ScreeningUtils.filterImageAnalysisDatasets(datasets).size();
     }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/PlateDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/PlateDatasetLoader.java
index 89045d36af67c7c4752d65595357a8e449847871..856600b4ff74be571a1bc6c5742742fd1c71245e 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/PlateDatasetLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/PlateDatasetLoader.java
@@ -15,7 +15,7 @@ import ch.systemsx.cisd.openbis.generic.server.business.bo.datasetlister.IDatase
 import ch.systemsx.cisd.openbis.generic.server.business.bo.samplelister.ISampleLister;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyType;
@@ -58,7 +58,7 @@ class PlateDatasetLoader
     // Running state
     private List<Sample> samples;
 
-    private List<ExternalData> datasets;
+    private List<AbstractExternalData> datasets;
 
     private HashMap<SampleIdentifier, Sample> samplesByIdentifier;
 
@@ -77,7 +77,7 @@ class PlateDatasetLoader
         this.datasetTypeCodePatterns = datasetTypeCodes;
     }
 
-    protected List<ExternalData> getDatasets()
+    protected List<AbstractExternalData> getDatasets()
     {
         return datasets;
     }
@@ -180,7 +180,7 @@ class PlateDatasetLoader
         }
     }
 
-    protected PlateIdentifier createPlateIdentifier(ExternalData parentDataset)
+    protected PlateIdentifier createPlateIdentifier(AbstractExternalData parentDataset)
     {
         final Sample sample = getSample(parentDataset);
         final String plateCode = sample.getCode();
@@ -189,7 +189,7 @@ class PlateDatasetLoader
         return new PlateIdentifier(plateCode, spaceCodeOrNull, sample.getPermId());
     }
 
-    protected static ExperimentIdentifier createExperimentIdentifier(ExternalData parentDataset)
+    protected static ExperimentIdentifier createExperimentIdentifier(AbstractExternalData parentDataset)
     {
         return asExperimentIdentifier(parentDataset.getExperiment());
     }
@@ -202,7 +202,7 @@ class PlateDatasetLoader
         return experimentId;
     }
 
-    protected Geometry extractPlateGeometry(ExternalData dataSet)
+    protected Geometry extractPlateGeometry(AbstractExternalData dataSet)
     {
         Sample sample = getSample(dataSet);
         List<IEntityProperty> properties = sample.getProperties();
@@ -227,7 +227,7 @@ class PlateDatasetLoader
                 + ScreeningConstants.PLATE_GEOMETRY);
     }
 
-    protected Map<String, String> extractProperties(ExternalData dataSet)
+    protected Map<String, String> extractProperties(AbstractExternalData dataSet)
     {
         final Map<String, String> properties = new HashMap<String, String>();
         if (dataSet.getProperties() != null)
@@ -244,7 +244,7 @@ class PlateDatasetLoader
         return properties;
     }
 
-    private Sample getSample(ExternalData dataset)
+    private Sample getSample(AbstractExternalData dataset)
     {
         // Sample may be NULL even though the selector does not begin with try
         Sample sample = dataset.getSample();
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningUtils.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningUtils.java
index 82de0e11f39eb7c994f1f0a8a8e3981b7887456f..d98f0f0902e488151f535ee92bfbbd5ace0719fb 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningUtils.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningUtils.java
@@ -27,7 +27,7 @@ import ch.systemsx.cisd.hcs.Location;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ContainerDataSet;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DataPE;
 import ch.systemsx.cisd.openbis.generic.shared.managed_property.IManagedPropertyEvaluatorFactory;
 import ch.systemsx.cisd.openbis.generic.shared.translator.DataStoreTranslator;
@@ -77,7 +77,7 @@ public class ScreeningUtils
                 dataStore, dataTypeCode, dataset.getRegistrationDate(), fileTypeCode, experiment);
     }
 
-    public static DatasetReference createDatasetReference(ExternalData dataset)
+    public static DatasetReference createDatasetReference(AbstractExternalData dataset)
     {
         DataStore dataStore = dataset.getDataStore();
         String dataTypeCode = dataset.getDataSetType().getCode();
@@ -89,7 +89,7 @@ public class ScreeningUtils
                 dataStore, dataTypeCode, dataset.getRegistrationDate(), fileTypeCode, experiment);
     }
 
-    private static String tryGetFileTypeCode(ExternalData abstractDataSet)
+    private static String tryGetFileTypeCode(AbstractExternalData abstractDataSet)
     {
         ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet dataSet =
                 abstractDataSet.tryGetAsDataSet();
@@ -119,7 +119,7 @@ public class ScreeningUtils
                 ScreeningConstants.HCS_IMAGE_ANALYSIS_DATASET_TYPE_PATTERN);
     }
 
-    public static List<ExternalData> filterImageAnalysisDatasets(List<ExternalData> datasets)
+    public static List<AbstractExternalData> filterImageAnalysisDatasets(List<AbstractExternalData> datasets)
     {
         return filterExternalDataByTypePattern(datasets,
                 ScreeningConstants.HCS_IMAGE_ANALYSIS_DATASET_TYPE_PATTERN);
@@ -182,7 +182,7 @@ public class ScreeningUtils
         return chosenDatasets;
     }
 
-    private static boolean isContainerMatching(ExternalData dataset,
+    private static boolean isContainerMatching(AbstractExternalData dataset,
             String... datasetTypeCodePatterns)
     {
         ContainerDataSet container = dataset.tryGetContainer();
@@ -196,7 +196,7 @@ public class ScreeningUtils
         return container != null && isOneOfTypesMatching(container, datasetTypeCodePatterns);
     }
 
-    private static boolean isNotEmpty(ExternalData dataset)
+    private static boolean isNotEmpty(AbstractExternalData dataset)
     {
         return dataset.isContainer() == false
                 || dataset.tryGetAsContainerDataSet().getContainedDataSets().size() > 0;
@@ -274,13 +274,13 @@ public class ScreeningUtils
      * true if a dataset contains HCS images. Such a dataset can be a parent of a feature vector
      * dataset or overlay dataset.
      */
-    public static boolean isHcsImageDataset(ExternalData externalData)
+    public static boolean isHcsImageDataset(AbstractExternalData externalData)
     {
         return isTypeMatchingExcludingContainer(externalData,
                 ScreeningConstants.ANY_HCS_IMAGE_DATASET_TYPE_PATTERN);
     }
 
-    private static boolean isTypeMatchingExcludingContainer(ExternalData externalData,
+    private static boolean isTypeMatchingExcludingContainer(AbstractExternalData externalData,
             String typePattern)
     {
         return isOneOfTypesMatching(externalData, typePattern)
@@ -288,7 +288,7 @@ public class ScreeningUtils
                 && isNotEmpty(externalData);
     }
 
-    public static boolean isRawHcsImageDataset(ExternalData externalData)
+    public static boolean isRawHcsImageDataset(AbstractExternalData externalData)
     {
         return isTypeMatchingExcludingContainer(externalData,
                 ScreeningConstants.HCS_RAW_IMAGE_DATASET_TYPE_PATTERN)
@@ -296,23 +296,23 @@ public class ScreeningUtils
                         .getDataSetType().getCode());
     }
 
-    public static boolean isSegmentationHcsImageDataset(ExternalData externalData)
+    public static boolean isSegmentationHcsImageDataset(AbstractExternalData externalData)
     {
         return isTypeMatchingExcludingContainer(externalData,
                 ScreeningConstants.HCS_SEGMENTATION_IMAGE_DATASET_TYPE_PATTERN);
     }
 
-    public static boolean isBasicHcsImageDataset(ExternalData externalData)
+    public static boolean isBasicHcsImageDataset(AbstractExternalData externalData)
     {
         return isHcsImageDataset(externalData)
                 && isSegmentationHcsImageDataset(externalData) == false;
     }
 
-    public static List<ExternalData> filterExternalDataByTypePattern(
-            Collection<ExternalData> datasets, String... datasetTypeCodePatterns)
+    public static List<AbstractExternalData> filterExternalDataByTypePattern(
+            Collection<AbstractExternalData> datasets, String... datasetTypeCodePatterns)
     {
-        List<ExternalData> chosenDatasets = new ArrayList<ExternalData>();
-        for (ExternalData dataset : datasets)
+        List<AbstractExternalData> chosenDatasets = new ArrayList<AbstractExternalData>();
+        for (AbstractExternalData dataset : datasets)
         {
             if (isOneOfTypesMatching(dataset, datasetTypeCodePatterns))
             {
@@ -322,12 +322,12 @@ public class ScreeningUtils
         return chosenDatasets;
     }
 
-    public static boolean isTypeMatching(ExternalData dataset, String datasetTypeCodePattern)
+    public static boolean isTypeMatching(AbstractExternalData dataset, String datasetTypeCodePattern)
     {
         return dataset.getDataSetType().getCode().matches(datasetTypeCodePattern);
     }
 
-    private static boolean isOneOfTypesMatching(ExternalData dataset,
+    private static boolean isOneOfTypesMatching(AbstractExternalData dataset,
             String... datasetTypeCodePatterns)
     {
         for (String datasetTypeCodePattern : datasetTypeCodePatterns)
@@ -341,7 +341,7 @@ public class ScreeningUtils
     }
 
     /** Loads dataset metadata from the imaging database */
-    public static ImageDatasetParameters tryLoadImageParameters(ExternalData dataset,
+    public static ImageDatasetParameters tryLoadImageParameters(AbstractExternalData dataset,
             IScreeningBusinessObjectFactory businessObjectFactory)
     {
         IImageDatasetLoader loader = tryCreateHCSDatasetLoader(dataset, businessObjectFactory);
@@ -353,7 +353,7 @@ public class ScreeningUtils
         return params;
     }
 
-    private static IImageDatasetLoader tryCreateHCSDatasetLoader(ExternalData dataSet,
+    private static IImageDatasetLoader tryCreateHCSDatasetLoader(AbstractExternalData dataSet,
             IScreeningBusinessObjectFactory businessObjectFactory)
     {
         String datastoreCode = dataSet.getDataStore().getCode();
@@ -382,7 +382,7 @@ public class ScreeningUtils
         return sb.toString();
     }
 
-    public static boolean isMatchingAnalysisProcedure(ExternalData dataset,
+    public static boolean isMatchingAnalysisProcedure(AbstractExternalData dataset,
             AnalysisProcedureCriteria analysisProcedureCriteria)
     {
         String dataSetAnalysisProcedure =
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoader.java
index 201b18ee4fc449aef2b9bd13f26a9bfa51b31697..9ba4427a668974fbf5965e71ce5e7212dab661db 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellContentLoader.java
@@ -47,7 +47,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriterion
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchField;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityKind;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityReference;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListMaterialCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
@@ -207,7 +207,7 @@ public class WellContentLoader extends AbstractContentLoader
             Set<PlateIdentifier> plateIdentifiers)
     {
         HCSImageDatasetLoader datasetsRetriever = createImageDatasetsRetriever(plateIdentifiers);
-        Collection<ExternalData> imageDatasets = datasetsRetriever.getImageDatasets();
+        Collection<AbstractExternalData> imageDatasets = datasetsRetriever.getImageDatasets();
         if (imageDatasets.isEmpty())
         {
             return new HashMap<Long, DatasetImagesReference>();
@@ -239,14 +239,14 @@ public class WellContentLoader extends AbstractContentLoader
     // plate has at most one image dataset (can be possible only when there will be abstraction
     // which groups raw/overview/thumbnail images into one dataset).
     private Map<Long, DatasetImagesReference> createPlateToSingleDatasetReferenceMap(
-            Collection<ExternalData> imageDatasets)
+            Collection<AbstractExternalData> imageDatasets)
     {
-        TableMap<Long, ExternalData> plateToDatasetMap =
-                new TableMap<Long/* plate id */, ExternalData>(imageDatasets,
-                        new IKeyExtractor<Long, ExternalData>()
+        TableMap<Long, AbstractExternalData> plateToDatasetMap =
+                new TableMap<Long/* plate id */, AbstractExternalData>(imageDatasets,
+                        new IKeyExtractor<Long, AbstractExternalData>()
                             {
                                 @Override
-                                public Long getKey(ExternalData externalData)
+                                public Long getKey(AbstractExternalData externalData)
                                 {
                                     return externalData.getSample().getId();
                                 }
@@ -256,14 +256,14 @@ public class WellContentLoader extends AbstractContentLoader
     }
 
     private Map<Long, DatasetImagesReference> asDatasetImagesReferenceMap(
-            TableMap<Long, ExternalData> plateToDatasetMap)
+            TableMap<Long, AbstractExternalData> plateToDatasetMap)
     {
         Map<String, ImageDatasetParameters> imageParams = loadImagesReport(plateToDatasetMap);
         Map<Long/* plate id */, DatasetImagesReference> plateToDatasetReferenceMap =
                 new HashMap<Long, DatasetImagesReference>();
         for (Long plateId : plateToDatasetMap.keySet())
         {
-            ExternalData imageDataset = plateToDatasetMap.getOrDie(plateId);
+            AbstractExternalData imageDataset = plateToDatasetMap.getOrDie(plateId);
             DatasetImagesReference imaageDatasetReference =
                     createDatasetImagesReference(imageDataset, imageParams);
             plateToDatasetReferenceMap.put(plateId, imaageDatasetReference);
@@ -339,8 +339,8 @@ public class WellContentLoader extends AbstractContentLoader
 
         FeatureVectorDatasetLoader datasetsRetriever =
                 createFeatureVectorDatasetsRetriever(locations, analysisProcedureCriteria);
-        Collection<ExternalData> imageDatasets = datasetsRetriever.getImageDatasets();
-        Collection<ExternalData> featureVectorDatasets =
+        Collection<AbstractExternalData> imageDatasets = datasetsRetriever.getImageDatasets();
+        Collection<AbstractExternalData> featureVectorDatasets =
                 datasetsRetriever.getFeatureVectorDatasets();
 
         operationLog.info(String.format("[%d msec] load datasets (%d image, %d fv).",
@@ -352,12 +352,12 @@ public class WellContentLoader extends AbstractContentLoader
         operationLog.info(String.format("[%d msec] loadImagesReport",
                 (System.currentTimeMillis() - start)));
 
-        Collection<ExternalData> childlessImageDatasets =
+        Collection<AbstractExternalData> childlessImageDatasets =
                 selectChildlessImageDatasets(imageDatasets, featureVectorDatasets);
 
-        Map<Long/* plate id */, List<ExternalData>> plateToChildlessImageDatasetMap =
+        Map<Long/* plate id */, List<AbstractExternalData>> plateToChildlessImageDatasetMap =
                 createPlateToDatasetMap(childlessImageDatasets);
-        Map<Long/* plate id */, List<ExternalData>> plateToFeatureVectoreDatasetMap =
+        Map<Long/* plate id */, List<AbstractExternalData>> plateToFeatureVectoreDatasetMap =
                 createPlateToDatasetMap(featureVectorDatasets);
 
         return enrichWithDatasets(locations, plateToChildlessImageDatasetMap,
@@ -371,12 +371,12 @@ public class WellContentLoader extends AbstractContentLoader
         return createFeatureVectorDatasetsRetriever(plates, analysisProcedureCriteria);
     }
 
-    private static Collection<ExternalData> selectChildlessImageDatasets(
-            Collection<ExternalData> imageDatasets, Collection<ExternalData> featureVectorDatasets)
+    private static Collection<AbstractExternalData> selectChildlessImageDatasets(
+            Collection<AbstractExternalData> imageDatasets, Collection<AbstractExternalData> featureVectorDatasets)
     {
-        Collection<ExternalData> childlessImageDatasets = new ArrayList<ExternalData>();
+        Collection<AbstractExternalData> childlessImageDatasets = new ArrayList<AbstractExternalData>();
         Set<String> parentImageDatasetCodes = extractParentDatasetCodes(featureVectorDatasets);
-        for (ExternalData imageDataset : imageDatasets)
+        for (AbstractExternalData imageDataset : imageDatasets)
         {
             if (parentImageDatasetCodes.contains(imageDataset.getCode()) == false)
             {
@@ -386,15 +386,15 @@ public class WellContentLoader extends AbstractContentLoader
         return childlessImageDatasets;
     }
 
-    private static Set<String> extractParentDatasetCodes(Collection<ExternalData> datasets)
+    private static Set<String> extractParentDatasetCodes(Collection<AbstractExternalData> datasets)
     {
         Set<String> codes = new HashSet<String>();
-        for (ExternalData dataset : datasets)
+        for (AbstractExternalData dataset : datasets)
         {
-            Collection<ExternalData> parents = dataset.getParents();
+            Collection<AbstractExternalData> parents = dataset.getParents();
             if (parents != null)
             {
-                for (ExternalData parent : parents)
+                for (AbstractExternalData parent : parents)
                 {
                     codes.add(parent.getCode());
                 }
@@ -417,18 +417,18 @@ public class WellContentLoader extends AbstractContentLoader
      * Connects wells with datasets.
      */
     private static List<WellContent> enrichWithDatasets(List<WellContent> wellContents,
-            Map<Long/* plate id */, List<ExternalData>> plateToChildlessImageDatasetMap,
-            Map<Long/* plate id */, List<ExternalData>> plateToFeatureVectoreDatasetMap,
+            Map<Long/* plate id */, List<AbstractExternalData>> plateToChildlessImageDatasetMap,
+            Map<Long/* plate id */, List<AbstractExternalData>> plateToFeatureVectoreDatasetMap,
             Map<String, ImageDatasetParameters> imageParams)
     {
-        final Map<ExternalData, DatasetImagesReference> childlessImageDatasetsToImageReference =
-                new HashMap<ExternalData, DatasetImagesReference>();
-        final Map<ExternalData, DatasetImagesReference> featureVectorDatasetsToImageReference =
-                new HashMap<ExternalData, DatasetImagesReference>();
+        final Map<AbstractExternalData, DatasetImagesReference> childlessImageDatasetsToImageReference =
+                new HashMap<AbstractExternalData, DatasetImagesReference>();
+        final Map<AbstractExternalData, DatasetImagesReference> featureVectorDatasetsToImageReference =
+                new HashMap<AbstractExternalData, DatasetImagesReference>();
         final Map<Long, DatasetImagesReference> plateToSingleImageDatasetReference =
                 new HashMap<Long, DatasetImagesReference>();
-        final Map<ExternalData, DatasetReference> featureVectorDatasetsToReference =
-                new HashMap<ExternalData, DatasetReference>();
+        final Map<AbstractExternalData, DatasetReference> featureVectorDatasetsToReference =
+                new HashMap<AbstractExternalData, DatasetReference>();
         for (WellContent wellContent : wellContents)
         {
             Long plateId = wellContent.getPlate().getId();
@@ -436,9 +436,9 @@ public class WellContentLoader extends AbstractContentLoader
             {
                 continue;
             }
-            final List<ExternalData> featureVectoreDatasets =
+            final List<AbstractExternalData> featureVectoreDatasets =
                     plateToFeatureVectoreDatasetMap.get(plateId);
-            final List<ExternalData> childlessImageDatasets =
+            final List<AbstractExternalData> childlessImageDatasets =
                     plateToChildlessImageDatasetMap.get(plateId);
             final DatasetImagesReference singleImageDatasetOrNull =
                     tryGetSingleImageDataset(childlessImageDatasets, imageParams);
@@ -447,7 +447,7 @@ public class WellContentLoader extends AbstractContentLoader
             boolean onlySingleImageExists = false;
             if (featureVectoreDatasets != null)
             {
-                for (ExternalData featureVectoreDataset : featureVectoreDatasets)
+                for (AbstractExternalData featureVectoreDataset : featureVectoreDatasets)
                 {
                     DatasetReference featureVectoreDatasetReference =
                             ScreeningUtils.createDatasetReference(featureVectoreDataset);
@@ -465,7 +465,7 @@ public class WellContentLoader extends AbstractContentLoader
             }
             if (childlessImageDatasets != null && onlySingleImageExists == false)
             {
-                for (ExternalData childlessImageDataset : childlessImageDatasets)
+                for (AbstractExternalData childlessImageDataset : childlessImageDatasets)
                 {
                     final DatasetImagesReference imagesDatasetReference =
                             createDatasetImagesReference(childlessImageDataset, imageParams);
@@ -481,9 +481,9 @@ public class WellContentLoader extends AbstractContentLoader
             Long plateId = wellContent.getPlate().getId();
             List<WellContent> clonedWellContents = new ArrayList<WellContent>();
 
-            List<ExternalData> featureVectoreDatasets =
+            List<AbstractExternalData> featureVectoreDatasets =
                     plateToFeatureVectoreDatasetMap.get(plateId);
-            List<ExternalData> childlessImageDatasets =
+            List<AbstractExternalData> childlessImageDatasets =
                     plateToChildlessImageDatasetMap.get(plateId);
             DatasetImagesReference singleImageDatasetOrNull =
                     plateToSingleImageDatasetReference.get(plateId);
@@ -491,7 +491,7 @@ public class WellContentLoader extends AbstractContentLoader
 
             if (featureVectoreDatasets != null)
             {
-                for (ExternalData featureVectorDataset : featureVectoreDatasets)
+                for (AbstractExternalData featureVectorDataset : featureVectoreDatasets)
                 {
                     DatasetReference featureVectorDatasetReference =
                             featureVectorDatasetsToReference.get(featureVectorDataset);
@@ -514,7 +514,7 @@ public class WellContentLoader extends AbstractContentLoader
             // have one well content duplicated for each dataset
             if (childlessImageDatasets != null && singleImageAlreadyUsed == false)
             {
-                for (ExternalData childlessImageDataset : childlessImageDatasets)
+                for (AbstractExternalData childlessImageDataset : childlessImageDatasets)
                 {
                     DatasetImagesReference imagesDatasetReference =
                             childlessImageDatasetsToImageReference.get(childlessImageDataset);
@@ -689,12 +689,12 @@ public class WellContentLoader extends AbstractContentLoader
     }
 
     private static DatasetImagesReference tryGetSingleImageDataset(
-            List<ExternalData> childlessImageDatasets,
+            List<AbstractExternalData> childlessImageDatasets,
             Map<String, ImageDatasetParameters> imageParams)
     {
         if (childlessImageDatasets != null && childlessImageDatasets.size() == 1)
         {
-            ExternalData singleImageDataset = childlessImageDatasets.get(0);
+            AbstractExternalData singleImageDataset = childlessImageDatasets.get(0);
             return createDatasetImagesReference(singleImageDataset, imageParams);
         } else
         {
@@ -703,12 +703,12 @@ public class WellContentLoader extends AbstractContentLoader
     }
 
     private static DatasetImagesReference tryGetImageDatasetReference(
-            ExternalData featureVectoreDataset, Map<String, ImageDatasetParameters> imageParams)
+            AbstractExternalData featureVectoreDataset, Map<String, ImageDatasetParameters> imageParams)
     {
-        Collection<ExternalData> parents = featureVectoreDataset.getParents();
+        Collection<AbstractExternalData> parents = featureVectoreDataset.getParents();
         if (parents != null && parents.size() == 1)
         {
-            ExternalData imageDataset = parents.iterator().next();
+            AbstractExternalData imageDataset = parents.iterator().next();
             return createDatasetImagesReference(imageDataset, imageParams);
         } else
         {
@@ -716,7 +716,7 @@ public class WellContentLoader extends AbstractContentLoader
         }
     }
 
-    private static DatasetImagesReference createDatasetImagesReference(ExternalData imageDataset,
+    private static DatasetImagesReference createDatasetImagesReference(AbstractExternalData imageDataset,
             Map<String, ImageDatasetParameters> imageParams)
     {
         ImageDatasetParameters imageParameters = imageParams.get(imageDataset.getCode());
@@ -732,21 +732,21 @@ public class WellContentLoader extends AbstractContentLoader
         }
     }
 
-    private static Map<Long/* sample id */, List<ExternalData>> createPlateToDatasetMap(
-            Collection<ExternalData> datasets)
+    private static Map<Long/* sample id */, List<AbstractExternalData>> createPlateToDatasetMap(
+            Collection<AbstractExternalData> datasets)
     {
-        Map<Long, List<ExternalData>> map = new HashMap<Long, List<ExternalData>>();
-        for (ExternalData dataset : datasets)
+        Map<Long, List<AbstractExternalData>> map = new HashMap<Long, List<AbstractExternalData>>();
+        for (AbstractExternalData dataset : datasets)
         {
             Sample sample = dataset.getSample();
             if (sample != null)
             {
                 Long sampleId = sample.getId();
 
-                List<ExternalData> plateDatasets = map.get(sampleId);
+                List<AbstractExternalData> plateDatasets = map.get(sampleId);
                 if (plateDatasets == null)
                 {
-                    plateDatasets = new ArrayList<ExternalData>();
+                    plateDatasets = new ArrayList<AbstractExternalData>();
                     map.put(sampleId, plateDatasets);
                 }
                 plateDatasets.add(dataset);
@@ -757,10 +757,10 @@ public class WellContentLoader extends AbstractContentLoader
 
     // TODO 2011-04-04, Tomasz Pylak: inefficient, rewrite to use single queryfor all datasets
     private Map<String/* dataset code */, ImageDatasetParameters> loadImagesReport(
-            Iterable<ExternalData> imageDatasets)
+            Iterable<AbstractExternalData> imageDatasets)
     {
         List<ImageDatasetParameters> imageParameters = new ArrayList<ImageDatasetParameters>();
-        for (ExternalData dataSet : imageDatasets)
+        for (AbstractExternalData dataSet : imageDatasets)
         {
             ImageDatasetParameters imageParams =
                     ScreeningUtils.tryLoadImageParameters(dataSet, businessObjectFactory);
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellFeatureCollectionLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellFeatureCollectionLoader.java
index 25d2e4be18c04c562c382a4d5b5c41a6df36ebcd..357ec9ec9e742ce225782df3848748fa15be2a7b 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellFeatureCollectionLoader.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/WellFeatureCollectionLoader.java
@@ -29,7 +29,7 @@ import ch.systemsx.cisd.common.collection.IKeyExtractor;
 import ch.systemsx.cisd.common.collection.TableMap;
 import ch.systemsx.cisd.common.collection.TableMap.UniqueKeyViolationStrategy;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.utils.GroupByMap;
 import ch.systemsx.cisd.openbis.generic.shared.basic.utils.IGroupKeyExtractor;
@@ -67,14 +67,14 @@ public class WellFeatureCollectionLoader extends AbstractContentLoader
         watch.start();
         FeatureVectorDatasetLoader datasetsRetriever =
                 createFeatureVectorDatasetsRetriever(plates, analysisProcedureCriteria);
-        Collection<ExternalData> featureVectorDatasets =
+        Collection<AbstractExternalData> featureVectorDatasets =
                 datasetsRetriever.getFeatureVectorDatasets();
         if (featureVectorDatasets.isEmpty())
         {
             return null;
         }
         List<DatasetReference> datasetPerPlate =
-                chooseSingleDatasetForPlate(new ArrayList<ExternalData>(featureVectorDatasets));
+                chooseSingleDatasetForPlate(new ArrayList<AbstractExternalData>(featureVectorDatasets));
 
         WellFeatureCollection<FeatureVectorValues> features =
                 new FeatureVectorRetriever(featureCodes).tryFetch(datasetPerPlate);
@@ -91,15 +91,15 @@ public class WellFeatureCollectionLoader extends AbstractContentLoader
     // runs, where each plate has at most one analysis dataset in each run. {@link
     // UniqueKeyViolationStrategy} could be set to {@link UniqueKeyViolationStrategy.ERROR} in
     // such a case.
-    private static List<DatasetReference> chooseSingleDatasetForPlate(List<ExternalData> datasets)
+    private static List<DatasetReference> chooseSingleDatasetForPlate(List<AbstractExternalData> datasets)
     {
         Collections.sort(datasets);
-        TableMap<String, ExternalData> plateToDatasetMap =
-                new TableMap<String, ExternalData>(datasets,
-                        new IKeyExtractor<String, ExternalData>()
+        TableMap<String, AbstractExternalData> plateToDatasetMap =
+                new TableMap<String, AbstractExternalData>(datasets,
+                        new IKeyExtractor<String, AbstractExternalData>()
                             {
                                 @Override
-                                public String getKey(ExternalData externalData)
+                                public String getKey(AbstractExternalData externalData)
                                 {
                                     Sample plate = externalData.getSample();
                                     return plate != null ? plate.getPermId() : null;
@@ -111,7 +111,7 @@ public class WellFeatureCollectionLoader extends AbstractContentLoader
         {
             if (platePermId != null)
             {
-                ExternalData dataset = plateToDatasetMap.getOrDie(platePermId);
+                AbstractExternalData dataset = plateToDatasetMap.getOrDie(platePermId);
                 DatasetReference datasetReference = ScreeningUtils.createDatasetReference(dataset);
                 datasetPerPlate.add(datasetReference);
             }
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/IScreeningServer.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/IScreeningServer.java
index 7981b423ccafc83693ab83fc2e862a04bab127ae..35b29628714bb67941a741abf92b106579ca1751 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/IScreeningServer.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/IScreeningServer.java
@@ -24,7 +24,7 @@ import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.IServer;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CodeAndLabel;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Material;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MaterialType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.NewMaterial;
@@ -156,10 +156,10 @@ public interface IScreeningServer extends IServer
             final TechId sampleId) throws UserFailureException;
 
     /**
-     * For given {@link TechId} returns the corresponding {@link ExternalData}.
+     * For given {@link TechId} returns the corresponding {@link AbstractExternalData}.
      */
     @Transactional(readOnly = true)
-    public ExternalData getDataSetInfo(String sessionToken,
+    public AbstractExternalData getDataSetInfo(String sessionToken,
             TechId datasetId);
 
     /**
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningTest.java
index 73617145a12e3576230ef5b6aa071ee7d157b07f..d13e877cc867f0b0b42691fc0257ce545aafc7a9 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreeningTest.java
@@ -74,7 +74,7 @@ import ch.systemsx.cisd.openbis.dss.generic.shared.utils.ImageUtilTest;
 import ch.systemsx.cisd.openbis.dss.screening.shared.api.v1.IDssServiceRpcScreening;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PhysicalDataSet;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.ExperimentBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
@@ -933,7 +933,7 @@ public class DssServiceRpcScreeningTest extends AssertJUnit
                         long id = dataSetIDs[i];
                         permIDs[i] = "ds" + id;
 
-                        ExternalData d = new PhysicalDataSet(); // this dataset is only asked if it is a
+                        AbstractExternalData d = new PhysicalDataSet(); // this dataset is only asked if it is a
                                                         // container
                         one(service).tryGetDataSet(permIDs[i]);
                         will(returnValue(d));
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoaderTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoaderTest.java
index c378a643ff4984f9e91a97d8dd666ef6bd6d2c4a..f7ff89d9b672aa8f58e465bf14c72841f82e7f7f 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoaderTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/FeatureVectorDatasetLoaderTest.java
@@ -31,7 +31,7 @@ import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.common.test.RecordingMatcher;
 import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExternalData;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.builders.DataSetBuilder;
@@ -57,23 +57,23 @@ public class FeatureVectorDatasetLoaderTest extends AbstractServerTestCase
     {
         final RecordingMatcher<ListOrSearchSampleCriteria> recordingCriteriaMatcher =
                 new RecordingMatcher<ListOrSearchSampleCriteria>();
-        final ExternalData ids1 =
+        final AbstractExternalData ids1 =
                 new DataSetBuilder(1l).code("ids1").type("HCS_IMAGE").getDataSet();
-        final ExternalData fds1 =
+        final AbstractExternalData fds1 =
                 new DataSetBuilder(11l).code("fds1").type("HCS_ANALYSIS_WELL_FEATURES")
                         .getDataSet();
-        final ExternalData fds2 =
+        final AbstractExternalData fds2 =
                 new DataSetBuilder(12l).code("fds2").type("HCS_ANALYSIS_WELL_FEATURES")
                         .getDataSet();
-        final ExternalData ids2 =
+        final AbstractExternalData ids2 =
                 new DataSetBuilder(2l).code("ids2").type("HCS_IMAGE").getDataSet();
-        final ExternalData fds3 =
+        final AbstractExternalData fds3 =
                 new DataSetBuilder(21l).code("fds3").type("HCS_ANALYSIS_WELL_FEATURES")
                         .getDataSet();
-        final ExternalData fds4 =
+        final AbstractExternalData fds4 =
                 new DataSetBuilder(100l).code("fds4").type("HCS_ANALYSIS_WELL_FEATURES")
                         .getDataSet();
-        final ExternalData ds1 = new DataSetBuilder(101l).code("ds1").type("BLABLA").getDataSet();
+        final AbstractExternalData ds1 = new DataSetBuilder(101l).code("ds1").type("BLABLA").getDataSet();
         context.checking(new Expectations()
             {
                 {
@@ -107,18 +107,18 @@ public class FeatureVectorDatasetLoaderTest extends AbstractServerTestCase
         FeatureVectorDatasetLoader loader =
                 new FeatureVectorDatasetLoader(session, screeningBOFactory, null, plateIdentifiers);
 
-        List<ExternalData> datasets =
-                new ArrayList<ExternalData>(loader.getFeatureVectorDatasets());
+        List<AbstractExternalData> datasets =
+                new ArrayList<AbstractExternalData>(loader.getFeatureVectorDatasets());
 
         assertEquals("[]", Arrays
                 .asList(recordingCriteriaMatcher.recordedObject().trySampleCodes()).toString());
         assertEquals("[s-1]",
                 Arrays.asList(recordingCriteriaMatcher.recordedObject().trySamplePermIds())
                         .toString());
-        Collections.sort(datasets, new Comparator<ExternalData>()
+        Collections.sort(datasets, new Comparator<AbstractExternalData>()
             {
                 @Override
-                public int compare(ExternalData o1, ExternalData o2)
+                public int compare(AbstractExternalData o1, AbstractExternalData o2)
                 {
                     return o1.getCode().compareTo(o2.getCode());
                 }
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoaderTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoaderTest.java
index 8a5344af3b60dbc6394e7b287a693126fa6b1e6b..fb1f25c0054b3d456441b8162f72d643839bb869 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoaderTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/HCSImageDatasetLoaderTest.java
@@ -32,7 +32,7 @@ import org.testng.annotations.Test;
 import ch.systemsx.cisd.common.test.RecordingMatcher;
 import ch.systemsx.cisd.openbis.generic.shared.AbstractServerTestCase;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Sample;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.VocabularyTerm;
@@ -82,22 +82,22 @@ public class HCSImageDatasetLoaderTest extends AbstractServerTestCase
         value.setCode("96_WELLS_8X12");
         sampleBuilder.property(ScreeningConstants.PLATE_GEOMETRY).value(value);
         final Sample sample = sampleBuilder.getSample();
-        final ExternalData ids1 =
+        final AbstractExternalData ids1 =
                 dataSet(1l).code("ids1").type("HCS_IMAGE").sample(sample).getDataSet();
-        final ExternalData sds1 =
+        final AbstractExternalData sds1 =
                 dataSet(11l).code("sds1").type("HCS_IMAGE_SEGMENTATION").sample(sample)
                         .getDataSet();
-        final ExternalData sds2 =
+        final AbstractExternalData sds2 =
                 dataSet(12l).code("sds2").type("HCS_IMAGE_SEGMENTATION").sample(sample)
                         .getDataSet();
-        final ExternalData ids2 =
+        final AbstractExternalData ids2 =
                 dataSet(2l).code("ids2").type("HCS_IMAGE").sample(sample).getDataSet();
-        final ExternalData sds3 =
+        final AbstractExternalData sds3 =
                 dataSet(21l).code("sds3").type("HCS_IMAGE_SEGMENTATION").sample(sample)
                         .getDataSet();
-        final ExternalData sds4 =
+        final AbstractExternalData sds4 =
                 dataSet(100l).code("sds4").type("HCS_IMAGE_SEGMENTATION").getDataSet();
-        final ExternalData ds1 =
+        final AbstractExternalData ds1 =
                 dataSet(101l).code("ds1").type("BLABLA").sample(sample).getDataSet();
         context.checking(new Expectations()
             {
diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningApiImplTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningApiImplTest.java
index 0f14c06644982a4b01451aafce411491bf2d9476..193346fa44e0b7c0ec42ddd0144864f7edf95165 100644
--- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningApiImplTest.java
+++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/server/logic/ScreeningApiImplTest.java
@@ -39,7 +39,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataSetType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DataStore;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityProperty;
 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.AbstractExternalData;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IEntityProperty;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ListOrSearchSampleCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Project;
@@ -251,10 +251,10 @@ public class ScreeningApiImplTest extends AbstractServerTestCase
                     allowing(screeningBOFactory).createDatasetLister(session);
                     will(returnValue(datasetLister));
                     one(datasetLister).listBySampleIds(with(asSet(1)));
-                    final ExternalData rawImage = imageRawDataSet(p1, "2", 2);
-                    ExternalData imageSegmentationDataSet =
+                    final AbstractExternalData rawImage = imageRawDataSet(p1, "2", 2);
+                    AbstractExternalData imageSegmentationDataSet =
                             imageSegmentationDataSet(p1, "3", 3, rawImage);
-                    ExternalData imageAnalysisDataSet = imageAnalysisDataSet(p1, "4", 4);
+                    AbstractExternalData imageAnalysisDataSet = imageAnalysisDataSet(p1, "4", 4);
                     will(returnValue(Arrays.asList(imageDataSet(p1, "1", 1), rawImage,
                             imageSegmentationDataSet, imageAnalysisDataSet)));
 
@@ -460,9 +460,9 @@ public class ScreeningApiImplTest extends AbstractServerTestCase
         return sample;
     }
 
-    private ExternalData imageDataSet(Sample sample, String code, long id)
+    private AbstractExternalData imageDataSet(Sample sample, String code, long id)
     {
-        ExternalData dataSet = createDataSet(sample, code, id);
+        AbstractExternalData dataSet = createDataSet(sample, code, id);
         dataSet.setDataSetType(dataSetType("HCS_IMAGE"));
         dataSet.setExperiment(new Experiment());
         dataSet.getExperiment().setProject(new Project());
@@ -470,9 +470,9 @@ public class ScreeningApiImplTest extends AbstractServerTestCase
         return dataSet;
     }
 
-    private ExternalData imageRawDataSet(Sample sample, String code, long id)
+    private AbstractExternalData imageRawDataSet(Sample sample, String code, long id)
     {
-        ExternalData dataSet = createDataSet(sample, code, id);
+        AbstractExternalData dataSet = createDataSet(sample, code, id);
         dataSet.setDataSetType(dataSetType("HCS_IMAGE_RAW"));
         dataSet.setExperiment(new Experiment());
         dataSet.getExperiment().setProject(new Project());
@@ -480,10 +480,10 @@ public class ScreeningApiImplTest extends AbstractServerTestCase
         return dataSet;
     }
 
-    private ExternalData imageSegmentationDataSet(Sample sample, String code, long id,
-            ExternalData parent)
+    private AbstractExternalData imageSegmentationDataSet(Sample sample, String code, long id,
+            AbstractExternalData parent)
     {
-        ExternalData dataSet = createDataSet(sample, code, id);
+        AbstractExternalData dataSet = createDataSet(sample, code, id);
         dataSet.setDataSetType(dataSetType("HCS_IMAGE_SEGMENTATION"));
         dataSet.setParents(Collections.singleton(parent));
         dataSet.setExperiment(new Experiment());
@@ -492,9 +492,9 @@ public class ScreeningApiImplTest extends AbstractServerTestCase
         return dataSet;
     }
 
-    private ExternalData imageAnalysisDataSet(Sample sample, String code, long id)
+    private AbstractExternalData imageAnalysisDataSet(Sample sample, String code, long id)
     {
-        ExternalData dataSet = createDataSet(sample, code, id);
+        AbstractExternalData dataSet = createDataSet(sample, code, id);
         dataSet.setDataSetType(dataSetType("HCS_IMAGE_ANALYSIS_DATA"));
         dataSet.setExperiment(new Experiment());
         dataSet.getExperiment().setProject(new Project());