diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/common/AbstractAuthorizationValidator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/common/AbstractAuthorizationValidator.java
new file mode 100644
index 0000000000000000000000000000000000000000..69c1d4955401e168fdfc4751d7ebd1141f57db97
--- /dev/null
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/common/AbstractAuthorizationValidator.java
@@ -0,0 +1,85 @@
+/*
+ * Copyright 2017 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.ethz.sis.openbis.generic.server.asapi.v3.translator.common;
+
+import org.springframework.beans.factory.annotation.Autowired;
+
+import ch.systemsx.cisd.openbis.generic.server.authorization.AuthorizationDataProvider;
+import ch.systemsx.cisd.openbis.generic.server.authorization.validator.ProjectByIdentiferValidator;
+import ch.systemsx.cisd.openbis.generic.server.authorization.validator.SimpleSpaceValidator;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
+import ch.systemsx.cisd.openbis.generic.shared.basic.ICodeHolder;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdentifierHolder;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
+
+/**
+ * @author pkupczyk
+ */
+public class AbstractAuthorizationValidator
+{
+
+    @Autowired
+    protected IDAOFactory daoFactory;
+
+    protected boolean isValid(PersonPE person, SpaceIdentifier spaceIdentifier, ProjectIdentifier projectIdentifier)
+    {
+        AuthorizationDataProvider provider = new AuthorizationDataProvider(daoFactory);
+
+        SimpleSpaceValidator spaceValidator = new SimpleSpaceValidator();
+        spaceValidator.init(provider);
+
+        ProjectByIdentiferValidator projectValidator = new ProjectByIdentiferValidator();
+        projectValidator.init(provider);
+
+        if (spaceIdentifier != null)
+        {
+            if (spaceValidator.isValid(person, new ICodeHolder()
+                {
+                    @Override
+                    public String getCode()
+                    {
+                        return spaceIdentifier.getSpaceCode();
+                    }
+                }))
+            {
+                return true;
+            } else
+            {
+                if (projectIdentifier != null)
+                {
+                    return projectValidator.isValid(person, new IIdentifierHolder()
+                        {
+                            @Override
+                            public String getIdentifier()
+                            {
+                                return projectIdentifier.toString();
+                            }
+                        });
+                } else
+                {
+                    return false;
+                }
+            }
+        } else
+        {
+            return true;
+        }
+    }
+
+}
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetAuthorizationRecord.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetAuthorizationRecord.java
deleted file mode 100644
index 83d3b2a6d94903d3d72cf64e2e346720e1e361cf..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetAuthorizationRecord.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright 2015 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.ethz.sis.openbis.generic.server.asapi.v3.translator.dataset;
-
-/**
- * @author pkupczyk
- */
-public class DataSetAuthorizationRecord
-{
-
-    public Long id;
-
-    public Boolean isStorageConfirmed;
-
-    public String sampleCode;
-
-    public String sampleSpaceCode;
-
-    public String sampleContainerCode;
-
-    public String experimentCode;
-
-    public String experimentProjectCode;
-
-    public String experimentSpaceCode;
-
-}
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetAuthorizationValidator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetAuthorizationValidator.java
index 0cf33f9b7868e4c2e52921f191b2cdd4e634a9a3..f575f645396ca421c92c04b96d5a32dbcf2e73b5 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetAuthorizationValidator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetAuthorizationValidator.java
@@ -16,92 +16,39 @@
 
 package ch.ethz.sis.openbis.generic.server.asapi.v3.translator.dataset;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentIdentifier;
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdentifier;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.translator.common.AbstractAuthorizationValidator;
 import ch.systemsx.cisd.openbis.generic.server.authorization.AuthorizationDataProvider;
-import ch.systemsx.cisd.openbis.generic.server.authorization.validator.AbstractDataSetByExperimentOrSampleIdentifierValidator;
-import ch.systemsx.cisd.openbis.generic.server.authorization.validator.AbstractValidator;
-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.dto.DataSetAccessPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 
-import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
-import net.lemnik.eodsql.QueryTool;
-
 /**
  * @author pkupczyk
  */
 @Component
-public class DataSetAuthorizationValidator implements IDataSetAuthorizationValidator
+public class DataSetAuthorizationValidator extends AbstractAuthorizationValidator implements IDataSetAuthorizationValidator
 {
 
-    @Autowired
-    private IDAOFactory daoFactory;
-
     @Override
     public Set<Long> validate(PersonPE person, Collection<Long> dataSetIds)
     {
-        DataSetQuery query = QueryTool.getManagedQuery(DataSetQuery.class);
-        List<DataSetAuthorizationRecord> records = query.getAuthorizations(new LongOpenHashSet(dataSetIds));
-        AbstractValidator<DataSetAuthorizationRecord> validator =
-                new AbstractDataSetByExperimentOrSampleIdentifierValidator<DataSetAuthorizationRecord>()
-                    {
-
-                        @Override
-                        protected boolean isStorageConfirmed(DataSetAuthorizationRecord record)
-                        {
-                            if (record.isStorageConfirmed != null)
-                            {
-                                return record.isStorageConfirmed;
-                            } else
-                            {
-                                return true;
-                            }
-                        }
-
-                        @Override
-                        protected String getExperimentIdentifier(DataSetAuthorizationRecord record)
-                        {
-                            if (record.experimentCode != null)
-                            {
-                                return new ExperimentIdentifier(record.experimentSpaceCode, record.experimentProjectCode, record.experimentCode)
-                                        .getIdentifier();
-                            } else
-                            {
-                                return null;
-                            }
-                        }
-
-                        @Override
-                        protected String getSampleIdentifier(DataSetAuthorizationRecord record)
-                        {
-                            if (record.sampleCode != null)
-                            {
-                                return new SampleIdentifier(record.sampleSpaceCode, record.sampleContainerCode, record.sampleCode).getIdentifier();
-                            } else
-                            {
-                                return null;
-                            }
-                        }
-
-                    };
-
-        validator.init(new AuthorizationDataProvider(daoFactory));
-
+        AuthorizationDataProvider provider = new AuthorizationDataProvider(daoFactory);
+        Set<DataSetAccessPE> accessDatas =
+                provider.getDatasetCollectionAccessDataByTechIds(TechId.createList(new ArrayList<Long>(dataSetIds)), false);
         Set<Long> result = new HashSet<Long>();
 
-        for (DataSetAuthorizationRecord record : records)
+        for (DataSetAccessPE accessData : accessDatas)
         {
-            if (validator.doValidation(person, record))
+            if (isValid(person, accessData.getSpaceIdentifier(), accessData.getProjectIdentifier()))
             {
-                result.add(record.id);
+                result.add(accessData.getDataSetId());
             }
         }
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java
index 540d443dc6a229b57a6ed1c7a840dbff1465cf74..8a975f0ffff5d69e0119994375434e3b6462d2c8 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/dataset/DataSetQuery.java
@@ -35,18 +35,6 @@ import net.lemnik.eodsql.Select;
 public interface DataSetQuery extends ObjectQuery
 {
 
-    @Select(sql = "select d.id, ed.storage_confirmation as isStorageConfirmed, s.code as sampleCode, sc.code as sampleContainerCode, ss.code as sampleSpaceCode, "
-            + "e.code as experimentCode, ep.code as experimentProjectCode, es.code as experimentSpaceCode from data d "
-            + "left join external_data ed on d.id = ed.data_id "
-            + "left join samples s on d.samp_id = s.id "
-            + "left join samples sc on s.samp_id_part_of = sc.id "
-            + "left join spaces ss on s.space_id = ss.id "
-            + "left join experiments e on d.expe_id = e.id "
-            + "left join projects ep on e.proj_id = ep.id "
-            + "left join spaces es on ep.space_id = es.id "
-            + "where d.id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE)
-    public List<DataSetAuthorizationRecord> getAuthorizations(LongSet dataSetIds);
-
     @Select(sql = "select d.id, d.code, d.is_derived as isDerived, d.data_producer_code as dataProducer, d.production_timestamp as dataProductionDate, d.access_timestamp as accessDate, d.modification_timestamp as modificationDate, d.registration_timestamp as registrationDate, d.data_set_kind as dataSetKind "
             + "from data d where d.id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE)
     public List<DataSetBaseRecord> getDataSets(LongSet dataSetIds);
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleAuthorizationRecord.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleAuthorizationRecord.java
deleted file mode 100644
index 0040118d1d2ba501e5119d8d6fdb068a5b891c0e..0000000000000000000000000000000000000000
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleAuthorizationRecord.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright 2015 ETH Zuerich, CISD
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package ch.ethz.sis.openbis.generic.server.asapi.v3.translator.sample;
-
-/**
- * @author pkupczyk
- */
-public class SampleAuthorizationRecord
-{
-
-    public Long id;
-
-    public String code;
-
-    public String spaceCode;
-
-    public String containerCode;
-
-}
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleAuthorizationValidator.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleAuthorizationValidator.java
index 7c96d939c576edf9935bb24d5307adcc8a0307d0..040c10b3f4aa639ed83fcf986e8928e27165014a 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleAuthorizationValidator.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleAuthorizationValidator.java
@@ -16,57 +16,38 @@
 
 package ch.ethz.sis.openbis.generic.server.asapi.v3.translator.sample;
 
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 
-import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
-import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdentifier;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.translator.common.AbstractAuthorizationValidator;
 import ch.systemsx.cisd.openbis.generic.server.authorization.AuthorizationDataProvider;
-import ch.systemsx.cisd.openbis.generic.server.authorization.validator.SampleByIdentiferValidator;
-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.dto.PersonPE;
-
-import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
-import net.lemnik.eodsql.QueryTool;
+import ch.systemsx.cisd.openbis.generic.shared.dto.SampleAccessPE;
 
 /**
  * @author pkupczyk
  */
 @Component
-public class SampleAuthorizationValidator implements ISampleAuthorizationValidator
+public class SampleAuthorizationValidator extends AbstractAuthorizationValidator implements ISampleAuthorizationValidator
 {
 
-    @Autowired
-    private IDAOFactory daoFactory;
-
     @Override
     public Set<Long> validate(PersonPE person, Collection<Long> sampleIds)
     {
-        SampleQuery query = QueryTool.getManagedQuery(SampleQuery.class);
-        List<SampleAuthorizationRecord> records = query.getAuthorizations(new LongOpenHashSet(sampleIds));
-        SampleByIdentiferValidator validator = new SampleByIdentiferValidator();
-        validator.init(new AuthorizationDataProvider(daoFactory));
+        AuthorizationDataProvider provider = new AuthorizationDataProvider(daoFactory);
+        Set<SampleAccessPE> accessDatas = provider.getSampleCollectionAccessDataByTechIds(TechId.createList(new ArrayList<Long>(sampleIds)), false);
         Set<Long> result = new HashSet<Long>();
 
-        for (SampleAuthorizationRecord record : records)
+        for (SampleAccessPE accessData : accessDatas)
         {
-            final SampleAuthorizationRecord theRecord = record;
-
-            if (validator.doValidation(person, new IIdentifierHolder()
-                {
-                    @Override
-                    public String getIdentifier()
-                    {
-                        return new SampleIdentifier(theRecord.spaceCode, theRecord.containerCode, theRecord.code).getIdentifier();
-                    }
-                }))
+            if (isValid(person, accessData.getSpaceIdentifier(), accessData.getProjectIdentifier()))
             {
-                result.add(record.id);
+                result.add(accessData.getSampleId());
             }
         }
 
diff --git a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleQuery.java b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleQuery.java
index 80929755ac05e29cc4c019935a34aef9a5c949ac..bf8d4ededb8a9d728ce553f355adf982461bf1dc 100644
--- a/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleQuery.java
+++ b/openbis/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/translator/sample/SampleQuery.java
@@ -35,12 +35,6 @@ import net.lemnik.eodsql.Select;
 public interface SampleQuery extends ObjectQuery
 {
 
-    @Select(sql = "select s.id, s.code, sp.code as spaceCode, sc.code as containerCode "
-            + "from samples s left join spaces sp on s.space_id = sp.id "
-            + "left join samples sc on s.samp_id_part_of = sc.id "
-            + "where s.id = any(?{1})", parameterBindings = { LongSetMapper.class }, fetchSize = FETCH_SIZE)
-    public List<SampleAuthorizationRecord> getAuthorizations(LongSet sampleIds);
-
     @Select(sql = "select s.id, s.code, s.perm_id as permId, sp.code as spaceCode, p.code as projectCode, "
             + "sc.code as containerCode, s.registration_timestamp as registrationDate, "
             + "s.modification_timestamp as modificationDate "
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleAccessPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleAccessPE.java
index 9c442a2203a23140ca0e1ba4fdb5979efa9661f3..a10c358de7de539cb103ec285bf8b6ea127b4634 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleAccessPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/SampleAccessPE.java
@@ -29,6 +29,7 @@ import org.apache.commons.lang.builder.HashCodeBuilder;
 import org.apache.commons.lang.builder.ToStringBuilder;
 
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
 
 /**
  * A PE for retrieving only the information necessary to determine if a user/person can access a sample.
@@ -106,6 +107,18 @@ public class SampleAccessPE
         this.spaceCode = spaceCode;
     }
 
+    @Transient
+    public SpaceIdentifier getSpaceIdentifier()
+    {
+        if (getSpaceCode() != null)
+        {
+            return new SpaceIdentifier(getSpaceCode());
+        } else
+        {
+            return null;
+        }
+    }
+
     @Transient
     public ProjectIdentifier getProjectIdentifier()
     {