diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/AuthorizationDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/AuthorizationDataProvider.java
index 597a04aec735c1d9e0196867be31f56efa433d88..8818ab48cb6c848fc4dc84277307a83687ebe4f3 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/AuthorizationDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/AuthorizationDataProvider.java
@@ -448,12 +448,6 @@ final public class AuthorizationDataProvider implements IAuthorizationDataProvid
         return daoFactory.getSampleDAO().getByTechId(techId);
     }
 
-    @Override
-    public SamplePE tryGetSample(PermId id)
-    {
-        return daoFactory.getSampleDAO().tryToFindByPermID(id.getId());
-    }
-
     @Override
     public GridCustomFilterPE getGridCustomFilter(TechId techId)
     {
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 51c354f99ad8f96a9a9b8c12672e9fbb28ff0f56..903e4db4230140a468ede4b6c01175ef34840d86 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
@@ -25,7 +25,7 @@ import ch.systemsx.cisd.common.exceptions.Status;
 import ch.systemsx.cisd.common.exceptions.StatusFlag;
 import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.DataSetCodePredicate;
 import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.DelegatedPredicate;
-import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.ExperimentIdentifierPredicate;
+import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.ExperimentAugmentedCodePredicate;
 import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.MetaprojectTechIdPredicate;
 import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.SampleOwnerIdentifierPredicate;
 import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.SpaceIdentifierPredicate;
@@ -222,7 +222,7 @@ public class AuthorizationServiceUtils
 
     private boolean canAccessExperiment(String experimentId)
     {
-        ExperimentIdentifierPredicate predicate = new ExperimentIdentifierPredicate();
+        ExperimentAugmentedCodePredicate predicate = new ExperimentAugmentedCodePredicate();
 
         predicate.init(new AuthorizationDataProvider(daoFactory));
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/IAuthorizationDataProvider.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/IAuthorizationDataProvider.java
index 0ab8877e2b4a8bc954ceeac60a40960761624f2a..71685af3508907a7d652004ce70a0c938aa1c0f1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/IAuthorizationDataProvider.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/IAuthorizationDataProvider.java
@@ -140,11 +140,6 @@ public interface IAuthorizationDataProvider extends IDatabaseInstanceFinder
      */
     public SamplePE getSample(TechId techId);
 
-    /**
-     * Returns the sample with given <var>permId</var> or null if such sample doesn't exist.
-     */
-    public SamplePE tryGetSample(PermId id);
-
     /**
      * Returns the filter with given <var>techId</var>
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/PredicateExecutor.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/PredicateExecutor.java
index 2acf7be1c312d04f058e41773af6cb8cf8805343..2bac26d692f400c8d504e6bc2b030978730a7e8f 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/PredicateExecutor.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/PredicateExecutor.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.server.authorization;
 
 import java.util.List;
 
+import ch.rinn.restrictions.Private;
 import ch.systemsx.cisd.common.exceptions.Status;
 import ch.systemsx.cisd.openbis.generic.server.authorization.annotation.ShouldFlattenCollections;
 import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.ArrayPredicate;
@@ -104,7 +105,8 @@ public final class PredicateExecutor
                 shouldFlattenCollections);
     }
 
-    public final <T> Status evaluate(final PersonPE person,
+    @Private
+    final <T> Status evaluate(final PersonPE person,
             final List<RoleWithIdentifier> allowedRoles, final T argumentValue,
             final Class<? extends IPredicate<?>> predicateClass, final Class<T> argumentType,
             final boolean shouldFlattenCollections)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/AbstractExperimentPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/AbstractExperimentPredicate.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d7aaf3e353cad2df49917a186581a53ccadfc6b
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/AbstractExperimentPredicate.java
@@ -0,0 +1,53 @@
+/*
+ * Copyright 2013 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.server.authorization.predicate;
+
+import ch.systemsx.cisd.openbis.generic.server.authorization.IAuthorizationDataProvider;
+import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.AbstractTechIdPredicate.ExperimentTechIdPredicate;
+
+/**
+ * An abstract <code>IPredicate</code> for experiments.
+ * 
+ * @author Bernd Rinn
+ */
+abstract class AbstractExperimentPredicate<T> extends AbstractPredicate<T>
+{
+    protected final ExperimentTechIdPredicate experimentTechIdPredicate;
+
+    protected final SpaceIdentifierPredicate spacePredicate;
+
+    protected final ExperimentPermIdPredicate experimentPermIdPredicate;
+
+    protected final ExperimentAugmentedCodePredicate experimentAugmentedCodePredicate;
+
+    public AbstractExperimentPredicate()
+    {
+        this.experimentTechIdPredicate = new ExperimentTechIdPredicate();
+        this.spacePredicate = new SpaceIdentifierPredicate();
+        this.experimentPermIdPredicate = new ExperimentPermIdPredicate();
+        this.experimentAugmentedCodePredicate = new ExperimentAugmentedCodePredicate();
+    }
+
+    @Override
+    public final void init(IAuthorizationDataProvider provider)
+    {
+        experimentTechIdPredicate.init(provider);
+        spacePredicate.init(provider);
+        experimentPermIdPredicate.init(provider);
+        experimentAugmentedCodePredicate.init(provider);
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/AbstractProjectPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/AbstractProjectPredicate.java
new file mode 100644
index 0000000000000000000000000000000000000000..b26d73e529565ae3c94868e73a5e8a9001c8d7a9
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/AbstractProjectPredicate.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2013 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.server.authorization.predicate;
+
+import ch.systemsx.cisd.openbis.generic.server.authorization.IAuthorizationDataProvider;
+import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.AbstractTechIdPredicate.ProjectTechIdPredicate;
+
+/**
+ * An <code>IPredicate</code> implementation that has the tools for authenticating projects based on
+ * any kind of identifier.
+ * 
+ * @author Bernd Rinn
+ */
+abstract class AbstractProjectPredicate<T> extends AbstractPredicate<T>
+{
+    protected final SpaceIdentifierPredicate spacePredicate;
+
+    protected final ProjectTechIdPredicate projectTechIdPredicate;
+
+    protected final ProjectPermIdPredicate projectPermIdPredicate;
+
+    protected final ProjectAugmentedCodePredicate projectAugmentedCodePredicate;
+
+    public AbstractProjectPredicate()
+    {
+        this.spacePredicate = new SpaceIdentifierPredicate();
+        this.projectTechIdPredicate = new ProjectTechIdPredicate();
+        this.projectPermIdPredicate = new ProjectPermIdPredicate();
+        this.projectAugmentedCodePredicate = new ProjectAugmentedCodePredicate();
+    }
+
+    @Override
+    public final void init(IAuthorizationDataProvider provider)
+    {
+        spacePredicate.init(provider);
+        projectTechIdPredicate.init(provider);
+        projectPermIdPredicate.init(provider);
+        projectAugmentedCodePredicate.init(provider);
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/AbstractSamplePredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/AbstractSamplePredicate.java
new file mode 100644
index 0000000000000000000000000000000000000000..8fb99535b0af314134b5711f8d7fa871c90c1e0d
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/AbstractSamplePredicate.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright 2013 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.server.authorization.predicate;
+
+import ch.systemsx.cisd.openbis.generic.server.authorization.IAuthorizationDataProvider;
+
+/**
+ * An abstract <code>IPredicate</code> for samples.
+ * 
+ * @author Bernd Rinn
+ */
+abstract class AbstractSamplePredicate<T> extends AbstractPredicate<T>
+{
+    protected final SampleTechIdPredicate sampleTechIdPredicate;
+
+    protected final SpaceIdentifierPredicate spacePredicate;
+
+    protected final SamplePermIdPredicate samplePermIdPredicate;
+
+    protected final SampleOwnerIdentifierPredicate sampleOwnerPredicate;
+
+    protected final SampleAugmentedCodePredicate sampleAugmentedCodePredicate;
+
+    public AbstractSamplePredicate()
+    {
+        this.sampleTechIdPredicate = new SampleTechIdPredicate();
+        this.spacePredicate = new SpaceIdentifierPredicate();
+        this.samplePermIdPredicate = new SamplePermIdPredicate();
+        this.sampleOwnerPredicate = new SampleOwnerIdentifierPredicate();
+        this.sampleAugmentedCodePredicate = new SampleAugmentedCodePredicate(sampleOwnerPredicate);
+    }
+
+    @Override
+    public final void init(IAuthorizationDataProvider provider)
+    {
+        sampleTechIdPredicate.init(provider);
+        spacePredicate.init(provider);
+        samplePermIdPredicate.init(provider);
+        sampleAugmentedCodePredicate.init(provider);
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DatabaseInstanceIdentifierPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DatabaseInstanceIdentifierPredicate.java
index 248f35c636a9fc113545e25934c852ceacfceede..be46a65336c99fd66d3188d0eeef6c790ce71166 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DatabaseInstanceIdentifierPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DatabaseInstanceIdentifierPredicate.java
@@ -45,6 +45,10 @@ public final class DatabaseInstanceIdentifierPredicate extends
     private final static boolean isMatching(final List<RoleWithIdentifier> allowedRoles,
             final String databaseInstanceUUID, final boolean isReadAccess)
     {
+        if (isReadAccess)
+        {
+            return true;
+        }
         for (final RoleWithIdentifier role : allowedRoles)
         {
             final RoleLevel roleGroup = role.getRoleLevel();
@@ -53,14 +57,6 @@ public final class DatabaseInstanceIdentifierPredicate extends
             {
                 return true;
             }
-            // TODO 2008-08-07, Tomasz Pylak: is this really necessary to belong to a group to have
-            // access to instance samples?
-            if (roleGroup.equals(RoleLevel.SPACE)
-                    && role.getAssignedSpace().getDatabaseInstance().getUuid().equals(
-                            databaseInstanceUUID) && isReadAccess)
-            {
-                return true;
-            }
         }
         return false;
     }
@@ -76,8 +72,8 @@ public final class DatabaseInstanceIdentifierPredicate extends
     }
 
     @Override
-    protected
-    final Status doEvaluation(final PersonPE person, final List<RoleWithIdentifier> allowedRoles,
+    protected final Status doEvaluation(final PersonPE person,
+            final List<RoleWithIdentifier> allowedRoles,
             final DatabaseInstanceIdentifier databaseInstanceIdentifier)
     {
         assert initialized : "Predicate has not been initialized";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DelegatedPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DelegatedPredicate.java
index 85a5e35ffa2fd4bf835186a6e37969efaa521fee..58d795dfee19b44456fe98b1c11ad8f3eb25705a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DelegatedPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/DelegatedPredicate.java
@@ -39,6 +39,8 @@ public abstract class DelegatedPredicate<P, T> extends AbstractPredicate<T>
 {
     private final IPredicate<P> delegate;
 
+    boolean initialized;
+
     protected IAuthorizationDataProvider authorizationDataProvider;
 
     public DelegatedPredicate(final IPredicate<P> delegate)
@@ -58,8 +60,10 @@ public abstract class DelegatedPredicate<P, T> extends AbstractPredicate<T>
     @Override
     public final void init(IAuthorizationDataProvider provider)
     {
+        assert initialized == false;
         this.authorizationDataProvider = provider;
         delegate.init(provider);
+        initialized = true;
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentAugmentedCodePredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentAugmentedCodePredicate.java
new file mode 100644
index 0000000000000000000000000000000000000000..c7b32b5f6c920ab00ff77e78f4f432f98b88cb2b
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentAugmentedCodePredicate.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2011 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.server.authorization.predicate;
+
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
+
+/**
+ * Predicate based on the augmented code of an experiment.
+ * 
+ * @author Franz-Josef Elmer
+ */
+public class ExperimentAugmentedCodePredicate extends DelegatedPredicate<SpaceIdentifier, String>
+{
+    public ExperimentAugmentedCodePredicate()
+    {
+        super(new SpaceIdentifierPredicate(false));
+    }
+
+    @Override
+    public SpaceIdentifier tryConvert(String value)
+    {
+        return new ExperimentIdentifierFactory(value).createIdentifier();
+    }
+
+    @Override
+    public String getCandidateDescription()
+    {
+        return "experiment";
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentIdentifierPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentIdentifierPredicate.java
index d734ec1bbde62e5f73f50c17d898c2ad9d685b22..66147f597c24d6d1f3f511a48545eee9f3c34aeb 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentIdentifierPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentIdentifierPredicate.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2011 ETH Zuerich, CISD
+ * Copyright 2013 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.
@@ -16,32 +16,70 @@
 
 package ch.systemsx.cisd.openbis.generic.server.authorization.predicate;
 
-import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.Experiment;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ExperimentIdentifierFactory;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
+import java.util.List;
+
+import ch.systemsx.cisd.common.exceptions.Status;
+import ch.systemsx.cisd.openbis.generic.server.authorization.RoleWithIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.ExperimentIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PermId;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 
 /**
- * Predicate based on {@link Experiment}.
+ * An <code>IPredicate</code> implementation based on {@link ExperimentIdentifier}.
  * 
- * @author Franz-Josef Elmer
+ * @author Bernd Rinn
  */
-public class ExperimentIdentifierPredicate extends DelegatedPredicate<SpaceIdentifier, String>
+public class ExperimentIdentifierPredicate extends
+        AbstractExperimentPredicate<ExperimentIdentifier>
 {
-    public ExperimentIdentifierPredicate()
-    {
-        super(new SpaceIdentifierPredicate(false));
-    }
-
     @Override
-    public SpaceIdentifier tryConvert(String value)
+    public final String getCandidateDescription()
     {
-        return new ExperimentIdentifierFactory(value).createIdentifier();
+        return "experiment identifier";
     }
 
     @Override
-    public String getCandidateDescription()
+    protected Status doEvaluation(final PersonPE person,
+            final List<RoleWithIdentifier> allowedRoles,
+            final ExperimentIdentifier identifier)
     {
-        return "experiment";
+        assert spacePredicate.initialized : "Predicate has not been initialized";
+        assert experimentTechIdPredicate.initialized : "Predicate has not been initialized";
+        assert experimentPermIdPredicate.initialized : "Predicate has not been initialized";
+        assert experimentAugmentedCodePredicate.initialized : "Predicate has not been initialized";
+        Status status = null;
+        if (identifier.getDatabaseId() != null)
+        {
+            status = experimentTechIdPredicate.doEvaluation(person,
+                    allowedRoles, new TechId(identifier.getDatabaseId()));
+            if (Status.OK.equals(status) == false)
+            {
+                return status;
+            }
+        }
+        if (identifier.getPermId() != null)
+        {
+            status = experimentPermIdPredicate.doEvaluation(person,
+                    allowedRoles, new PermId(identifier.getPermId()));
+            if (Status.OK.equals(status) == false)
+            {
+                return status;
+            }
+        }
+        if (identifier.getAugmentedCode() != null)
+        {
+            status = experimentAugmentedCodePredicate.doEvaluation(person,
+                    allowedRoles, identifier.getAugmentedCode());
+            if (Status.OK.equals(status) == false)
+            {
+                return status;
+            }
+        }
+        if (status == null)
+        {
+            return Status.createError("No identifier given");
+        }
+        return Status.OK;
     }
-
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentPEPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentPEPredicate.java
index 946386e3e80b3da8be994e0861dc09e0aa8329cb..fdf6f48d3da8d10bc55f6ac9c164390bbf7aadb8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentPEPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentPEPredicate.java
@@ -26,6 +26,16 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 public class ExperimentPEPredicate extends PersistentEntityPredicate<ExperimentPE>
 {
 
+    public ExperimentPEPredicate()
+    {
+        super();
+    }
+
+    public ExperimentPEPredicate(boolean isReadAccess)
+    {
+        super(isReadAccess);
+    }
+
     @Override
     public SpacePE getSpace(ExperimentPE value)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentPermIdPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentPermIdPredicate.java
new file mode 100644
index 0000000000000000000000000000000000000000..9fe72115949a3cc365cc93f65a3819312ce31d1c
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentPermIdPredicate.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2009 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.server.authorization.predicate;
+
+import java.util.List;
+
+import ch.systemsx.cisd.common.exceptions.Status;
+import ch.systemsx.cisd.openbis.generic.server.authorization.IAuthorizationDataProvider;
+import ch.systemsx.cisd.openbis.generic.server.authorization.RoleWithIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PermId;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
+
+/**
+ * An <code>IPredicate</code> implementation based on permId of an experiment.
+ * 
+ * @author Izabela Adamczyk
+ */
+public class ExperimentPermIdPredicate extends AbstractDatabaseInstancePredicate<PermId>
+{
+
+    private final ExperimentPEPredicate experimentPEPredicate;
+
+    public ExperimentPermIdPredicate()
+    {
+        this(true);
+    }
+
+    public ExperimentPermIdPredicate(boolean isReadAccess)
+    {
+        experimentPEPredicate = new ExperimentPEPredicate(isReadAccess);
+    }
+
+    //
+    // AbstractPredicate
+    //
+
+    @Override
+    public final void init(IAuthorizationDataProvider provider)
+    {
+        super.init(provider);
+        experimentPEPredicate.init(provider);
+    }
+
+    @Override
+    public final String getCandidateDescription()
+    {
+        return "experiment perm id";
+    }
+
+    @Override
+    protected final Status doEvaluation(final PersonPE person,
+            final List<RoleWithIdentifier> allowedRoles, final PermId id)
+    {
+        ExperimentPE experiment = authorizationDataProvider.tryGetExperimentByPermId(id.getId());
+        if (experiment == null)
+        {
+            return Status.createError(String.format("User '%s' does not have enough privileges.",
+                    person.getUserId()));
+        }
+        return experimentPEPredicate.evaluate(person, allowedRoles, experiment);
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentUpdatesPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentUpdatesPredicate.java
index 2545969c4859f94b2f7d8b996a56941f54840549..7d1cf715f163858504f709e16b2cb259b8d81a95 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentUpdatesPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ExperimentUpdatesPredicate.java
@@ -19,9 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server.authorization.predicate;
 import java.util.List;
 
 import ch.systemsx.cisd.common.exceptions.Status;
-import ch.systemsx.cisd.openbis.generic.server.authorization.IAuthorizationDataProvider;
 import ch.systemsx.cisd.openbis.generic.server.authorization.RoleWithIdentifier;
-import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.AbstractTechIdPredicate.ExperimentTechIdPredicate;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 
@@ -32,25 +30,8 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
  * 
  * @author Tomasz Pylak
  */
-public class ExperimentUpdatesPredicate extends AbstractPredicate<ExperimentUpdatesDTO>
+public class ExperimentUpdatesPredicate extends AbstractExperimentPredicate<ExperimentUpdatesDTO>
 {
-    private final ExperimentTechIdPredicate experimentTechIdPredicate;
-
-    private final SpaceIdentifierPredicate spacePredicate;
-
-    public ExperimentUpdatesPredicate()
-    {
-        this.experimentTechIdPredicate = new ExperimentTechIdPredicate();
-        this.spacePredicate = new SpaceIdentifierPredicate();
-    }
-
-    @Override
-    public final void init(IAuthorizationDataProvider provider)
-    {
-        experimentTechIdPredicate.init(provider);
-        spacePredicate.init(provider);
-    }
-
     @Override
     public final String getCandidateDescription()
     {
@@ -62,6 +43,7 @@ public class ExperimentUpdatesPredicate extends AbstractPredicate<ExperimentUpda
             final List<RoleWithIdentifier> allowedRoles,
             final ExperimentUpdatesDTO updates)
     {
+        assert spacePredicate.initialized : "Predicate has not been initialized";
         assert experimentTechIdPredicate.initialized : "Predicate has not been initialized";
 
         // Skip all further checks if the person has instance-wide write permissions.
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/PersistentEntityPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/PersistentEntityPredicate.java
index b6cdbc22c7d0a97b27cca3e5d9285da945fdd5fd..ec17e2691cbc606b3381dc93ee3ca4decf2733ad 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/PersistentEntityPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/PersistentEntityPredicate.java
@@ -28,12 +28,28 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 
 /**
- * A predicate for persistent entities.
+ * A predicate for persistent entities. This predicate by default authenticates for write access.
  * 
  * @author anttil
  */
 public abstract class PersistentEntityPredicate<T> implements IPredicate<T>
 {
+    // Everyone can read from the database instance level, but only users with appropriate role can
+    // write. This flag tells if only the read-only access is required to database instance objects.
+    private final boolean isReadAccess;
+
+    /**
+     * Default: authenticate for write access.
+     */
+    public PersistentEntityPredicate()
+    {
+        this(false);
+    }
+
+    public PersistentEntityPredicate(boolean isReadAccess)
+    {
+        this.isReadAccess = isReadAccess;
+    }
 
     @Override
     public Status evaluate(PersonPE person, List<RoleWithIdentifier> allowedRoles, T value)
@@ -44,9 +60,15 @@ public abstract class PersistentEntityPredicate<T> implements IPredicate<T>
             return Status.createError("null value cannot be authorized");
         }
 
-        SpacePE space = getSpace(value);
-        DatabaseInstancePE instance =
-                space != null ? space.getDatabaseInstance() : getInstance(value);
+        final SpacePE space = getSpace(value);
+        final boolean isInstanceEntity = (space == null);
+        if (isInstanceEntity && isReadAccess)
+        {
+            return Status.OK;
+        }
+        @SuppressWarnings("null")
+        final DatabaseInstancePE instance =
+                isInstanceEntity ? getInstance(value) : space.getDatabaseInstance();
 
         for (RoleWithIdentifier allowed : allowedRoles)
         {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ProjectAugmentedCodePredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ProjectAugmentedCodePredicate.java
new file mode 100644
index 0000000000000000000000000000000000000000..8b213d9defc7b438e928eb4d14ca4a343742e854
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ProjectAugmentedCodePredicate.java
@@ -0,0 +1,46 @@
+/*
+ * Copyright 2012 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.server.authorization.predicate;
+
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierFactory;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
+
+/**
+ * A {@link IPredicate} for a project's augmented code (i.e. DB:/SPACE/PROJECT).
+ * 
+ * @author Bernd Rinn
+ */
+public class ProjectAugmentedCodePredicate extends DelegatedPredicate<SpaceIdentifier, String>
+{
+    public ProjectAugmentedCodePredicate()
+    {
+        super(new SpaceIdentifierPredicate(false));
+    }
+
+    @Override
+    public SpaceIdentifier tryConvert(String value)
+    {
+        return new ProjectIdentifierFactory(value).createIdentifier();
+    }
+
+    @Override
+    public String getCandidateDescription()
+    {
+        return "project";
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ProjectIdentifierPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ProjectIdentifierPredicate.java
index 64dd2db3c3f7db89874ac0142e03b6e203313ecc..d151b387594525143e1b8ad04462d828253ecad0 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ProjectIdentifierPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ProjectIdentifierPredicate.java
@@ -1,5 +1,5 @@
 /*
- * Copyright 2012 ETH Zuerich, CISD
+ * Copyright 2013 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.
@@ -20,35 +20,64 @@ import java.util.List;
 
 import ch.systemsx.cisd.common.exceptions.Status;
 import ch.systemsx.cisd.openbis.generic.server.authorization.RoleWithIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.ProjectIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifier;
-import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.ProjectIdentifierFactory;
 
 /**
- * A {@link IPredicate} for a project permanent id (i.e. DB:/SPACE/PROJECT).
+ * An <code>IPredicate</code> implementation based on {@link ProjectIdentifier}.
  * 
  * @author Bernd Rinn
  */
-public class ProjectIdentifierPredicate extends AbstractSpacePredicate<String>
+public class ProjectIdentifierPredicate extends AbstractProjectPredicate<ProjectIdentifier>
 {
     @Override
-    public String getCandidateDescription()
+    public final String getCandidateDescription()
     {
         return "project identifier";
     }
 
     @Override
-    protected Status doEvaluation(PersonPE person, List<RoleWithIdentifier> allowedRoles,
-            String value)
+    protected Status doEvaluation(final PersonPE person,
+            final List<RoleWithIdentifier> allowedRoles,
+            final ProjectIdentifier identifier)
     {
-        final ProjectIdentifier identifier = new ProjectIdentifierFactory(value).createIdentifier();
-        final ProjectPE project = authorizationDataProvider.tryGetProjectByIdentifier(identifier);
-        if (project == null)
+        assert spacePredicate.initialized : "Predicate has not been initialized";
+        assert projectTechIdPredicate.initialized : "Predicate has not been initialized";
+        assert projectPermIdPredicate.initialized : "Predicate has not been initialized";
+        assert projectAugmentedCodePredicate.initialized : "Predicate has not been initialized";
+        Status status = null;
+        if (identifier.getDatabaseId() != null)
         {
-            return Status.createError(String.format("User '%s' does not have enough privileges.",
-                    person.getUserId()));
+            status = projectTechIdPredicate.doEvaluation(person,
+                    allowedRoles, new TechId(identifier.getDatabaseId()));
+            if (Status.OK.equals(status) == false)
+            {
+                return status;
+            }
         }
-        return evaluateSpace(person, allowedRoles, project.getSpace());
+        if (identifier.getPermId() != null)
+        {
+            status = projectPermIdPredicate.doEvaluation(person,
+                    allowedRoles, identifier.getPermId());
+            if (Status.OK.equals(status) == false)
+            {
+                return status;
+            }
+        }
+        if (identifier.getAugmentedCode() != null)
+        {
+            status = projectAugmentedCodePredicate.doEvaluation(person,
+                    allowedRoles, identifier.getAugmentedCode());
+            if (Status.OK.equals(status) == false)
+            {
+                return status;
+            }
+        }
+        if (status == null)
+        {
+            return Status.createError("No identifier given");
+        }
+        return Status.OK;
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ProjectUpdatesPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ProjectUpdatesPredicate.java
index bd3c36e53dbdf5229ebb46005ddb2247f0e60fa0..1c21e2ab5b25000a64bc0983744303a31d101c84 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ProjectUpdatesPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/ProjectUpdatesPredicate.java
@@ -19,9 +19,7 @@ package ch.systemsx.cisd.openbis.generic.server.authorization.predicate;
 import java.util.List;
 
 import ch.systemsx.cisd.common.exceptions.Status;
-import ch.systemsx.cisd.openbis.generic.server.authorization.IAuthorizationDataProvider;
 import ch.systemsx.cisd.openbis.generic.server.authorization.RoleWithIdentifier;
-import ch.systemsx.cisd.openbis.generic.server.authorization.predicate.AbstractTechIdPredicate.ProjectTechIdPredicate;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectUpdatesDTO;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.DatabaseInstanceIdentifier;
@@ -29,38 +27,13 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SpaceIdentifier;
 
 /**
  * An <code>IPredicate</code> implementation based on {@link ProjectUpdatesDTO}. Checks that: 1) the
- * user has rights to update the project 2) if project is moved to a different group the user has
- * access to this group.
+ * user has rights to update the project 2) if project is moved to a different space the user has
+ * access to this space.
  * 
  * @author Tomasz Pylak
  */
-public class ProjectUpdatesPredicate extends AbstractPredicate<ProjectUpdatesDTO>
+public class ProjectUpdatesPredicate extends AbstractProjectPredicate<ProjectUpdatesDTO>
 {
-    private final SpaceIdentifierPredicate spacePredicate;
-
-    private final ProjectTechIdPredicate projectTechIdPredicate;
-
-    private final ProjectPermIdPredicate projectPermIdPredicate;
-
-    private final ProjectIdentifierPredicate projectIdentifierPredicate;
-
-    public ProjectUpdatesPredicate()
-    {
-        this.spacePredicate = new SpaceIdentifierPredicate();
-        this.projectTechIdPredicate = new ProjectTechIdPredicate();
-        this.projectPermIdPredicate = new ProjectPermIdPredicate();
-        this.projectIdentifierPredicate = new ProjectIdentifierPredicate();
-    }
-
-    @Override
-    public final void init(IAuthorizationDataProvider provider)
-    {
-        spacePredicate.init(provider);
-        projectTechIdPredicate.init(provider);
-        projectPermIdPredicate.init(provider);
-        projectIdentifierPredicate.init(provider);
-    }
-
     @Override
     public final String getCandidateDescription()
     {
@@ -74,6 +47,8 @@ public class ProjectUpdatesPredicate extends AbstractPredicate<ProjectUpdatesDTO
     {
         assert spacePredicate.initialized : "Predicate has not been initialized";
         assert projectTechIdPredicate.initialized : "Predicate has not been initialized";
+        assert projectPermIdPredicate.initialized : "Predicate has not been initialized";
+        assert projectAugmentedCodePredicate.initialized : "Predicate has not been initialized";
         Status status;
         if (updates.getTechId() != null)
         {
@@ -85,7 +60,7 @@ public class ProjectUpdatesPredicate extends AbstractPredicate<ProjectUpdatesDTO
                     allowedRoles, updates.getPermId());
         } else
         {
-            status = projectIdentifierPredicate.doEvaluation(person,
+            status = projectAugmentedCodePredicate.doEvaluation(person,
                     allowedRoles, updates.getIdentifier());
         }
         if (status.equals(Status.OK) == false)
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleAugmentedCodePredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleAugmentedCodePredicate.java
new file mode 100644
index 0000000000000000000000000000000000000000..55d63e7e164349ff16368b3820fb9359fd134a5c
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleAugmentedCodePredicate.java
@@ -0,0 +1,51 @@
+/*
+ * Copyright 2013 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.server.authorization.predicate;
+
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleIdentifierFactory;
+import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.SampleOwnerIdentifier;
+
+/**
+ * Predicate based on the augmented code of a sample.
+ * 
+ * @author Bernd Rinn
+ */
+public class SampleAugmentedCodePredicate extends DelegatedPredicate<SampleOwnerIdentifier, String>
+{
+    public SampleAugmentedCodePredicate()
+    {
+        this(new SampleOwnerIdentifierPredicate());
+    }
+
+    public SampleAugmentedCodePredicate(SampleOwnerIdentifierPredicate delegate)
+    {
+        super(delegate);
+    }
+
+    @Override
+    public SampleOwnerIdentifier tryConvert(String value)
+    {
+        return new SampleIdentifierFactory(value).createIdentifier();
+    }
+
+    @Override
+    public String getCandidateDescription()
+    {
+        return "sample";
+    }
+
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleIdentifierPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleIdentifierPredicate.java
new file mode 100644
index 0000000000000000000000000000000000000000..ba4e7c4ceea0f187be84f149349b9c9102e0c467
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleIdentifierPredicate.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2013 ETH Zuerich, CISD
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package ch.systemsx.cisd.openbis.generic.server.authorization.predicate;
+
+import java.util.List;
+
+import ch.systemsx.cisd.common.exceptions.Status;
+import ch.systemsx.cisd.openbis.generic.server.authorization.RoleWithIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.ExperimentIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SampleIdentifier;
+import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PermId;
+import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
+
+/**
+ * An <code>IPredicate</code> implementation based on {@link ExperimentIdentifier}.
+ * 
+ * @author Bernd Rinn
+ */
+public class SampleIdentifierPredicate extends
+        AbstractSamplePredicate<SampleIdentifier>
+{
+    @Override
+    public final String getCandidateDescription()
+    {
+        return "sample identifier";
+    }
+
+    @Override
+    protected Status doEvaluation(final PersonPE person,
+            final List<RoleWithIdentifier> allowedRoles,
+            final SampleIdentifier identifier)
+    {
+        assert spacePredicate.initialized : "Predicate has not been initialized";
+        assert sampleTechIdPredicate.initialized : "Predicate has not been initialized";
+        assert samplePermIdPredicate.initialized : "Predicate has not been initialized";
+        assert sampleAugmentedCodePredicate.initialized : "Predicate has not been initialized";
+        Status status = null;
+        if (identifier.getDatabaseId() != null)
+        {
+            status = sampleTechIdPredicate.doEvaluation(person,
+                    allowedRoles, new TechId(identifier.getDatabaseId()));
+            if (Status.OK.equals(status) == false)
+            {
+                return status;
+            }
+        }
+        if (identifier.getPermId() != null)
+        {
+            status = samplePermIdPredicate.doEvaluation(person,
+                    allowedRoles, new PermId(identifier.getPermId()));
+            if (Status.OK.equals(status) == false)
+            {
+                return status;
+            }
+        }
+        if (identifier.getAugmentedCode() != null)
+        {
+            status = sampleAugmentedCodePredicate.doEvaluation(person,
+                    allowedRoles, identifier.getAugmentedCode());
+            if (Status.OK.equals(status) == false)
+            {
+                return status;
+            }
+        }
+        if (status == null)
+        {
+            return Status.createError("No identifier given");
+        }
+        return Status.OK;
+    }
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleOwnerIdentifierPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleOwnerIdentifierPredicate.java
index f170ba2085d1a3d3d54140fe35eb7b52ccef3099..bcd6e09abf338b3a92e38fb8db3c552c6a145ae1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleOwnerIdentifierPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleOwnerIdentifierPredicate.java
@@ -35,6 +35,8 @@ public class SampleOwnerIdentifierPredicate extends AbstractPredicate<SampleOwne
 
     private final DatabaseInstanceIdentifierPredicate databaseInstanceIdentifierPredicate;
 
+    boolean initialized;
+
     public SampleOwnerIdentifierPredicate()
     {
         this(true, false);
@@ -58,8 +60,10 @@ public class SampleOwnerIdentifierPredicate extends AbstractPredicate<SampleOwne
     @Override
     public final void init(IAuthorizationDataProvider provider)
     {
+        assert initialized == false;
         spacePredicate.init(provider);
         databaseInstanceIdentifierPredicate.init(provider);
+        initialized = true;
     }
 
     @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SamplePEPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SamplePEPredicate.java
index 3404f551b0a7f5032fe3e973f187f0d98fcb319a..77377de4976ab59ed87e6ad5eeb50ee00809cc36 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SamplePEPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SamplePEPredicate.java
@@ -21,11 +21,24 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SpacePE;
 
 /**
+ * This predicate by default authenticates for write access, i.e. it will allow not access to shared
+ * samples for all users.
+ * 
  * @author anttil
  */
 public class SamplePEPredicate extends PersistentEntityPredicate<SamplePE>
 {
 
+    public SamplePEPredicate()
+    {
+        super();
+    }
+
+    public SamplePEPredicate(boolean isReadAccess)
+    {
+        super(isReadAccess);
+    }
+
     @Override
     public SpacePE getSpace(SamplePE value)
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SamplePermIdPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SamplePermIdPredicate.java
index 93bf3ec20f7a9d942340a478ac7cecd91fd88394..0f6934f4175b66e59707548544ea3c69fadec630 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SamplePermIdPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SamplePermIdPredicate.java
@@ -33,7 +33,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SamplePE;
 public class SamplePermIdPredicate extends AbstractDatabaseInstancePredicate<PermId>
 {
 
-    private final SampleOwnerIdentifierPredicate sampleOwnerIdentifierPredicate;
+    private final SamplePEPredicate samplePEPredicate;
 
     public SamplePermIdPredicate()
     {
@@ -42,7 +42,7 @@ public class SamplePermIdPredicate extends AbstractDatabaseInstancePredicate<Per
 
     public SamplePermIdPredicate(boolean isReadAccess)
     {
-        sampleOwnerIdentifierPredicate = new SampleOwnerIdentifierPredicate(isReadAccess);
+        samplePEPredicate = new SamplePEPredicate(isReadAccess);
     }
 
     //
@@ -53,7 +53,7 @@ public class SamplePermIdPredicate extends AbstractDatabaseInstancePredicate<Per
     public final void init(IAuthorizationDataProvider provider)
     {
         super.init(provider);
-        sampleOwnerIdentifierPredicate.init(provider);
+        samplePEPredicate.init(provider);
     }
 
     @Override
@@ -66,14 +66,13 @@ public class SamplePermIdPredicate extends AbstractDatabaseInstancePredicate<Per
     protected final Status doEvaluation(final PersonPE person,
             final List<RoleWithIdentifier> allowedRoles, final PermId id)
     {
-        SamplePE sample = authorizationDataProvider.tryGetSample(id);
+        SamplePE sample = authorizationDataProvider.tryGetSampleByPermId(id.getId());
         if (sample == null)
         {
             return Status.createError(String.format("User '%s' does not have enough privileges.",
                     person.getUserId()));
         }
-        return sampleOwnerIdentifierPredicate.doEvaluation(person, allowedRoles,
-                sample.getSampleIdentifier());
+        return samplePEPredicate.evaluate(person, allowedRoles, sample);
     }
 
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleUpdatesPredicate.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleUpdatesPredicate.java
index c069a3cccc1f01944db0ab40cc8bd5c209ef6459..3f73b47f44434289746417bd03c5d7516600a451 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleUpdatesPredicate.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/authorization/predicate/SampleUpdatesPredicate.java
@@ -19,7 +19,6 @@ package ch.systemsx.cisd.openbis.generic.server.authorization.predicate;
 import java.util.List;
 
 import ch.systemsx.cisd.common.exceptions.Status;
-import ch.systemsx.cisd.openbis.generic.server.authorization.IAuthorizationDataProvider;
 import ch.systemsx.cisd.openbis.generic.server.authorization.RoleWithIdentifier;
 import ch.systemsx.cisd.openbis.generic.shared.dto.PersonPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO;
@@ -31,43 +30,27 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.SampleUpdatesDTO;
  * 
  * @author Izabela Adamczyk
  */
-public class SampleUpdatesPredicate extends AbstractPredicate<SampleUpdatesDTO>
+public class SampleUpdatesPredicate extends AbstractSamplePredicate<SampleUpdatesDTO>
 {
-    private final SampleTechIdPredicate sampleTechIdPredicate;
-
-    private final SpaceIdentifierPredicate spacePredicate;
-
-    private final SampleOwnerIdentifierPredicate samplePredicate;
-
-    public SampleUpdatesPredicate()
-    {
-        this.sampleTechIdPredicate = new SampleTechIdPredicate();
-        this.spacePredicate = new SpaceIdentifierPredicate();
-        this.samplePredicate = new SampleOwnerIdentifierPredicate();
-    }
-
-    @Override
-    public final void init(IAuthorizationDataProvider provider)
-    {
-        sampleTechIdPredicate.init(provider);
-        spacePredicate.init(provider);
-        samplePredicate.init(provider);
-    }
-
     @Override
     public final String getCandidateDescription()
     {
         return "sample updates";
     }
 
+    // TODO 2009-07-27, IA: tests needed
     @Override
-    protected
-    Status doEvaluation(final PersonPE person, final List<RoleWithIdentifier> allowedRoles,
+    protected Status doEvaluation(final PersonPE person,
+            final List<RoleWithIdentifier> allowedRoles,
             final SampleUpdatesDTO updates)
-    {// TODO 2009-07-27, IA: tests needed
+    {
         assert sampleTechIdPredicate.initialized : "Predicate has not been initialized";
+        assert spacePredicate.initialized : "Predicate has not been initialized";
+        assert sampleOwnerPredicate.initialized : "Predicate has not been initialized";
         Status status;
-        status = sampleTechIdPredicate.doEvaluation(person, allowedRoles, updates.getSampleIdOrNull());
+        status =
+                sampleTechIdPredicate.doEvaluation(person, allowedRoles,
+                        updates.getSampleIdOrNull());
         if (status.equals(Status.OK) == false)
         {
             return status;
@@ -80,8 +63,9 @@ public class SampleUpdatesPredicate extends AbstractPredicate<SampleUpdatesDTO>
             if (status.equals(Status.OK) == false)
                 return status;
         }
-        status = samplePredicate.doEvaluation(person, allowedRoles, updates.getSampleIdentifier());
+        status =
+                sampleOwnerPredicate.doEvaluation(person, allowedRoles,
+                        updates.getSampleIdentifier());
         return status;
-
     }
 }