diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/FeatureVectorIdentifierPredicate.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DatasetIdentifierPredicate.java
similarity index 83%
rename from screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/FeatureVectorIdentifierPredicate.java
rename to screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DatasetIdentifierPredicate.java
index c6d7d7ce0c46f9972167c40cd327d5e2f1cae72b..fe3b4b21655fc16348a2f141a42da26e528709af 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/FeatureVectorIdentifierPredicate.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DatasetIdentifierPredicate.java
@@ -21,19 +21,20 @@ import java.util.List;
 import ch.systemsx.cisd.common.exceptions.Status;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.authorization.IAuthorizationGuardPredicate;
-import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.IFeatureVectorDatasetIdentifier;
+import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.IDatasetIdentifier;
 
 /**
+ * Predicate that checks if the user has access to a collection of data set identifiers.
+ * 
  * @author Chandrasekhar Ramakrishnan
  */
-public class FeatureVectorIdentifierPredicate
+public class DatasetIdentifierPredicate
         implements
-        IAuthorizationGuardPredicate<IDssServiceRpcScreeningInternal, List<? extends IFeatureVectorDatasetIdentifier>>
+        IAuthorizationGuardPredicate<IDssServiceRpcScreeningInternal, List<? extends IDatasetIdentifier>>
 {
 
     public Status evaluate(IDssServiceRpcScreeningInternal receiver, String sessionToken,
-            List<? extends IFeatureVectorDatasetIdentifier> featureDatasets)
-            throws UserFailureException
+            List<? extends IDatasetIdentifier> featureDatasets) throws UserFailureException
     {
         try
         {
diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/v1/IDssServiceRpcScreening.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/v1/IDssServiceRpcScreening.java
index 2bfc8168b8e8309f441709e70385f494cdc6ba34..3645a85a1f63b49bf6288465bef3749f81072246 100644
--- a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/v1/IDssServiceRpcScreening.java
+++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/shared/api/v1/IDssServiceRpcScreening.java
@@ -23,7 +23,7 @@ import ch.systemsx.cisd.common.api.IRpcService;
 import ch.systemsx.cisd.common.api.MinimalMinorVersion;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.authorization.AuthorizationGuard;
 import ch.systemsx.cisd.openbis.dss.generic.shared.api.authorization.DataSetAccessGuard;
-import ch.systemsx.cisd.openbis.dss.screening.server.FeatureVectorIdentifierPredicate;
+import ch.systemsx.cisd.openbis.dss.screening.server.DatasetIdentifierPredicate;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.FeatureVectorDataset;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.FeatureVectorDatasetReference;
 import ch.systemsx.cisd.openbis.plugin.screening.shared.api.v1.dto.FeatureVectorDatasetWellReference;
@@ -59,7 +59,7 @@ public interface IDssServiceRpcScreening extends IRpcService
     @DataSetAccessGuard
     public List<String> listAvailableFeatureNames(
             String sessionToken,
-            @AuthorizationGuard(guardClass = FeatureVectorIdentifierPredicate.class) List<? extends IFeatureVectorDatasetIdentifier> featureDatasets);
+            @AuthorizationGuard(guardClass = DatasetIdentifierPredicate.class) List<? extends IFeatureVectorDatasetIdentifier> featureDatasets);
 
     /**
      * For a given set of feature vector data sets provide the list of all available features. This
@@ -70,7 +70,7 @@ public interface IDssServiceRpcScreening extends IRpcService
     @DataSetAccessGuard
     public List<String> listAvailableFeatureCodes(
             String sessionToken,
-            @AuthorizationGuard(guardClass = FeatureVectorIdentifierPredicate.class) List<? extends IFeatureVectorDatasetIdentifier> featureDatasets);
+            @AuthorizationGuard(guardClass = DatasetIdentifierPredicate.class) List<? extends IFeatureVectorDatasetIdentifier> featureDatasets);
 
     /**
      * Conceptually, for a given list of data well references (i.e. specified wells on specified
@@ -86,7 +86,7 @@ public interface IDssServiceRpcScreening extends IRpcService
     @DataSetAccessGuard
     public List<FeatureVectorDataset> loadFeatures(
             String sessionToken,
-            @AuthorizationGuard(guardClass = FeatureVectorIdentifierPredicate.class) List<FeatureVectorDatasetReference> featureDatasets,
+            @AuthorizationGuard(guardClass = DatasetIdentifierPredicate.class) List<FeatureVectorDatasetReference> featureDatasets,
             List<String> featureCodes);
 
     /**
@@ -109,7 +109,7 @@ public interface IDssServiceRpcScreening extends IRpcService
     @DataSetAccessGuard
     public List<FeatureVectorWithDescription> loadFeaturesForDatasetWellReferences(
             String sessionToken,
-            @AuthorizationGuard(guardClass = FeatureVectorIdentifierPredicate.class) List<FeatureVectorDatasetWellReference> datasetWellReferences,
+            @AuthorizationGuard(guardClass = DatasetIdentifierPredicate.class) List<FeatureVectorDatasetWellReference> datasetWellReferences,
             List<String> featureCodes);
 
     /**
@@ -122,7 +122,7 @@ public interface IDssServiceRpcScreening extends IRpcService
     @DataSetAccessGuard
     public InputStream loadImages(
             String sessionToken,
-            @AuthorizationGuard(guardClass = FeatureVectorIdentifierPredicate.class) List<PlateImageReference> imageReferences);
+            @AuthorizationGuard(guardClass = DatasetIdentifierPredicate.class) List<PlateImageReference> imageReferences);
 
     /**
      * For a given set of image data sets, provide all image channels that have been acquired and
@@ -131,6 +131,6 @@ public interface IDssServiceRpcScreening extends IRpcService
     @DataSetAccessGuard
     public List<ImageDatasetMetadata> listImageMetadata(
             String sessionToken,
-            @AuthorizationGuard(guardClass = FeatureVectorIdentifierPredicate.class) List<? extends IImageDatasetIdentifier> imageDatasets);
+            @AuthorizationGuard(guardClass = DatasetIdentifierPredicate.class) List<? extends IImageDatasetIdentifier> imageDatasets);
 
 }
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 08c5a3696b4e60dc55fba906bb1fc8a571efb2a7..b819a11993932daad94d17ff5336d0d738a043d0 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
@@ -20,8 +20,11 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
+import org.aopalliance.intercept.MethodInterceptor;
+import org.aopalliance.intercept.MethodInvocation;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
+import org.springframework.aop.framework.ProxyFactory;
 import org.testng.AssertJUnit;
 import org.testng.annotations.AfterMethod;
 import org.testng.annotations.BeforeMethod;
@@ -29,6 +32,8 @@ import org.testng.annotations.Test;
 
 import ch.systemsx.cisd.base.convert.NativeTaggedArray;
 import ch.systemsx.cisd.base.mdarray.MDFloatArray;
+import ch.systemsx.cisd.openbis.dss.generic.server.DssServiceRpcAuthorizationAdvisor;
+import ch.systemsx.cisd.openbis.dss.generic.server.DssServiceRpcAuthorizationAdvisor.DssServiceRpcAuthorizationMethodInterceptor;
 import ch.systemsx.cisd.openbis.dss.generic.shared.IEncapsulatedOpenBISService;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
@@ -113,6 +118,36 @@ public class DssServiceRpcScreeningTest extends AssertJUnit
         context.assertIsSatisfied();
     }
 
+    @Test
+    public void testAuthorization()
+    {
+        prepareAssetDataSetsAreAccessible();
+        prepareGetFeatureDefinitions(1, "f1", "f2");
+        prepareGetFeatureDefinitions(2, "f2", "f3");
+
+        // Add the expectation for checkDataSetCollectionAccess again -- we expect it to be invoked
+        // once more from the authorization code.
+        context.checking(new Expectations()
+            {
+                {
+                    one(service).checkDataSetCollectionAccess(SESSION_TOKEN,
+                            Arrays.asList("ds1", "ds2"));
+                }
+            });
+
+        TestMethodInterceptor interceptor = new TestMethodInterceptor();
+        IDssServiceRpcScreeningInternal serviceInternal = getAdvisedService(interceptor);
+
+        List<String> names =
+                serviceInternal.listAvailableFeatureCodes(SESSION_TOKEN, Arrays.asList(
+                        featureVectorDatasetIdentifier1, featureVectorDatasetIdentifier2));
+
+        assertTrue(interceptor.methodInvoked);
+
+        assertEquals("[f1, f2, f3]", names.toString());
+        context.assertIsSatisfied();
+    }
+
     @Test
     public void testLoadFeatures()
     {
@@ -123,8 +158,8 @@ public class DssServiceRpcScreeningTest extends AssertJUnit
         prepareCreateFeatureVectorDataSet(2, "F2");
 
         List<FeatureVectorDataset> dataSets =
-                screeningService.loadFeatures(SESSION_TOKEN, Arrays.asList(r1, r2), Arrays.asList(
-                        "f1", "f2"));
+                screeningService.loadFeatures(SESSION_TOKEN, Arrays.asList(r1, r2),
+                        Arrays.asList("f1", "f2"));
 
         assertSame(r1, dataSets.get(0).getDataset());
         assertEquals("[F1, F2]", dataSets.get(0).getFeatureCodes().toString());
@@ -229,4 +264,29 @@ public class DssServiceRpcScreeningTest extends AssertJUnit
     {
         return new FeatureVectorDatasetReference(dataSetCode, "", null, null, null, null, null);
     }
+
+    // Used for the authorization test
+    private static class TestMethodInterceptor extends DssServiceRpcAuthorizationMethodInterceptor
+            implements MethodInterceptor
+    {
+        private boolean methodInvoked = false;
+
+        @Override
+        public Object invoke(MethodInvocation methodInvocation) throws Throwable
+        {
+            Object result = super.invoke(methodInvocation);
+            methodInvoked = true;
+            return result;
+        }
+    }
+
+    private IDssServiceRpcScreeningInternal getAdvisedService(
+            TestMethodInterceptor testMethodInterceptor)
+    {
+        ProxyFactory pf = new ProxyFactory();
+        pf.addAdvisor(new DssServiceRpcAuthorizationAdvisor(testMethodInterceptor));
+        pf.setTarget(screeningService);
+        pf.addInterface(IDssServiceRpcScreeningInternal.class);
+        return (IDssServiceRpcScreeningInternal) pf.getProxy();
+    }
 }