diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/RelationshipService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/RelationshipService.java
index b04ec072d8e15ebbf4a3203661fc97504059a4ef..387261109be492b75c7d7dd8a300779e7f13030c 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/RelationshipService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/RelationshipService.java
@@ -16,13 +16,10 @@
 
 package ch.systemsx.cisd.openbis.generic.server;
 
-import org.hibernate.Criteria;
-import org.hibernate.criterion.Restrictions;
-
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.business.bo.util.SampleUtils;
+import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.DAOFactory;
 import ch.systemsx.cisd.openbis.generic.shared.IRelationshipService;
-import ch.systemsx.cisd.openbis.generic.shared.basic.CodeConverter;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ExperimentPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.IAuthSession;
 import ch.systemsx.cisd.openbis.generic.shared.dto.ProjectPE;
@@ -39,15 +36,23 @@ public class RelationshipService implements IRelationshipService
     private static final String ERR_PROJECT_NOT_FOUND =
             "No project for experiment '%s' could be found in the database.";
 
-    private org.hibernate.SessionFactory sessionFactory;
+    private DAOFactory daoFactory;
 
     @Override
     public void reassignProject(IAuthSession session, ProjectIdentifier projectId,
             ExperimentIdentifier experimentId)
     {
+
+        ProjectPE previousProject =
+                findProject(new ProjectIdentifier(experimentId.getDatabaseInstanceCode(),
+                        experimentId.getSpaceCode(), experimentId.getProjectCode()));
+
         ProjectPE project = findProject(projectId);
-        ExperimentPE experiment = findExperiment(experimentId);
-        ProjectPE previousProject = experiment.getProject();
+
+        ExperimentPE experiment =
+                daoFactory.getExperimentDAO().tryFindByCodeAndProject(previousProject,
+                        experimentId.getExperimentCode());
+
         if (project.equals(previousProject))
         {
             return;
@@ -60,33 +65,21 @@ public class RelationshipService implements IRelationshipService
         experiment.setProject(project);
     }
 
-    private ProjectPE findProject(ProjectIdentifier id)
+    private ProjectPE findProject(ProjectIdentifier projectId)
     {
+        ProjectPE project =
+                daoFactory.getProjectDAO().tryFindProject(projectId.getDatabaseInstanceCode(),
+                        projectId.getSpaceCode(), projectId.getProjectCode());
 
-        final Criteria criteria =
-                this.sessionFactory.getCurrentSession().createCriteria(ProjectPE.class);
-        criteria.add(Restrictions.eq("code", CodeConverter.tryToDatabase(id.getProjectCode())));
-        final Criteria spaceCriteria = criteria.createCriteria("space");
-        spaceCriteria.add(Restrictions.eq("code", CodeConverter.tryToDatabase(id.getSpaceCode())));
-
-        ProjectPE project = (ProjectPE) criteria.uniqueResult();
         if (project == null)
         {
-            throw UserFailureException.fromTemplate(ERR_PROJECT_NOT_FOUND, id);
+            throw UserFailureException.fromTemplate(ERR_PROJECT_NOT_FOUND, projectId);
         }
         return project;
     }
 
-    private ExperimentPE findExperiment(ExperimentIdentifier id)
-    {
-        final Criteria criteria =
-                this.sessionFactory.getCurrentSession().createCriteria(ExperimentPE.class);
-        criteria.add(Restrictions.eq("code", CodeConverter.tryToDatabase(id.getExperimentCode())));
-        return (ExperimentPE) criteria.uniqueResult();
-    }
-
-    public void setSessionFactory(org.hibernate.SessionFactory sessionFactory)
+    public void setDaoFactory(DAOFactory daoFactory)
     {
-        this.sessionFactory = sessionFactory;
+        this.daoFactory = daoFactory;
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
index f4fddf977c2810ff09818b550d4c405e57f8f6d0..a9a21e73db7e4385e06f3ff0396ea54105aa0d9e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentBO.java
@@ -422,11 +422,14 @@ public final class ExperimentBO extends AbstractBusinessObject implements IExper
         }
         updateProperties(updates.getProperties());
 
-        if (updates.getProjectIdentifier().getProjectCode().equals(
-                experiment.getProject().getCode()) == false)
+        ProjectPE project = findProject(updates.getProjectIdentifier());
+        ProjectPE previousProject = experiment.getProject();
+        if (project.equals(previousProject) == false)
         {
             relationshipService.reassignProject(session, updates.getProjectIdentifier(),
-                    new ExperimentIdentifier(updates.getProjectIdentifier(), experiment
+                    new ExperimentIdentifier(new ProjectIdentifier(previousProject.getSpace()
+                            .getDatabaseInstance().getCode(), previousProject.getSpace().getCode(),
+                            previousProject.getCode()), experiment
                             .getCode()));
         }
 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTable.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTable.java
index d6c2125d0fa72f4249c0649e8dbbacc70ea30050..b609589d2db09172ba5ba328da0a318b8731cb35 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTable.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/ExperimentTable.java
@@ -249,9 +249,15 @@ public final class ExperimentTable extends AbstractBusinessObject implements IEx
 
         if (updates.isProjectUpdateRequested())
         {
+            ProjectPE previousProject = experiment.getProject();
+            ProjectIdentifier previousProjectId =
+                    new ProjectIdentifier(previousProject.getSpace().getDatabaseInstance()
+                            .getCode(), previousProject.getSpace().getCode(), previousProject
+                            .getCode());
+
             relationshipService
                     .reassignProject(session, updates.getProjectIdentifier(),
-                            new ExperimentIdentifier(updates.getProjectIdentifier(), experiment
+                            new ExperimentIdentifier(previousProjectId, experiment
                                     .getCode()));
         }
     }
diff --git a/openbis/source/java/genericApplicationContext.xml b/openbis/source/java/genericApplicationContext.xml
index 964d9af14118052a7efaa3d136c2c01f260915ec..7777c3cb1f06ebb14915b4a15487f4ad9a2e1ce4 100644
--- a/openbis/source/java/genericApplicationContext.xml
+++ b/openbis/source/java/genericApplicationContext.xml
@@ -25,7 +25,7 @@
     
     <bean id="relationship-service"
         class="ch.systemsx.cisd.openbis.generic.server.RelationshipService">
-        <property name="sessionFactory" ref="hibernate-session-factory" />
+        <property name="daoFactory" ref="dao-factory" />
     </bean>
 
     <bean id="sql-script-provider" class="ch.systemsx.cisd.dbmigration.DBMigrationEngine"