diff --git a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
index dbf5c15c562ad920e5216c37a5afdbdef48a45c9..898c1763f9da179f820b897c174fdb8616192e0a 100644
--- a/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
+++ b/src/main/java/org/olat/course/nodes/iq/QTI21AssessmentRunController.java
@@ -558,7 +558,7 @@ public class QTI21AssessmentRunController extends BasicController implements Gen
 			FileResourceManager frm = FileResourceManager.getInstance();
 			File fUnzippedDirRoot = frm.unzipFileResource(session.getTestEntry().getOlatResource());
 			URI assessmentObjectUri = qtiService.createAssessmentTestUri(fUnzippedDirRoot);
-			File submissionDir = qtiService.getAssessmentResultFile(session);
+			File submissionDir = qtiService.getSubmissionDirectory(session);
 			String mapperUri = registerCacheableMapper(ureq, "QTI21CNResults::" + session.getTestEntry().getKey(),
 					new ResourcesMapper(assessmentObjectUri, submissionDir));
 
diff --git a/src/main/java/org/olat/ims/qti21/ui/ResourcesMapper.java b/src/main/java/org/olat/ims/qti21/ui/ResourcesMapper.java
index ca6b3dd307116a1bf765ef23ffa725547ae40df2..2a6a8a2c5eec27fcc380268c1146928637baf94f 100644
--- a/src/main/java/org/olat/ims/qti21/ui/ResourcesMapper.java
+++ b/src/main/java/org/olat/ims/qti21/ui/ResourcesMapper.java
@@ -44,6 +44,7 @@ import org.olat.core.util.StringHelper;
 public class ResourcesMapper implements Mapper {
 	
 	private static final Logger log = Tracing.createLoggerFor(ResourcesMapper.class);
+	private static final String SUBMISSION_SUBPATH = "submissions/";
 	
 	private final URI assessmentObjectUri;
 	private final File submissionDirectory;
@@ -92,14 +93,15 @@ public class ResourcesMapper implements Mapper {
 				} else {
 					resource = new ForbiddenMediaResource();
 				}
-			} else if(filename.endsWith("/raw/_noversion_/images/transparent.gif")) {
+			} else if(filename != null && filename.endsWith("/raw/_noversion_/images/transparent.gif")) {
 				String realPath = request.getServletContext().getRealPath("/static/images/transparent.gif");
 				resource = new FileMediaResource(new File(realPath), true);
 			} else {
 				String submissionName = null;
 				File storage = null;
-				if(filename.startsWith("submissions/")) {
-					String submission = filename.substring("submissions/".length());
+				if(filename != null && filename.contains(SUBMISSION_SUBPATH)) {
+					int submissionIndex = filename.indexOf(SUBMISSION_SUBPATH) + SUBMISSION_SUBPATH.length();
+					String submission = filename.substring(submissionIndex);
 					int candidateSessionIndex = submission.indexOf('/');
 					if(candidateSessionIndex > 0) {
 						submissionName = submission.substring(candidateSessionIndex + 1);
@@ -109,7 +111,7 @@ public class ResourcesMapper implements Mapper {
 							String sessionKey = submission.substring(0, candidateSessionIndex);
 							if(StringHelper.isLong(sessionKey)) {
 								try {
-									storage = submissionDirectoryMaps.get(new Long(sessionKey));
+									storage = submissionDirectoryMaps.get(Long.valueOf(sessionKey));
 								} catch (Exception e) {
 									log.error("", e);
 								}
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectVelocityRenderDecorator.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectVelocityRenderDecorator.java
index 8a1bb0809535a8b1cd25c604f637734db5c856ae..d95fc58e03929cb74e0f9e64a0f0612bac436005 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectVelocityRenderDecorator.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentObjectVelocityRenderDecorator.java
@@ -194,7 +194,7 @@ public class AssessmentObjectVelocityRenderDecorator extends VelocityRenderDecor
 	}
 	
 	public String convertSubmissionLinkFull(String uri) {
-		return AssessmentRenderFunctions.convertSubmissionLink(avc, resolvedAssessmentItem, uri);
+		return AssessmentRenderFunctions.convertSubmissionLink(avc, uri);
 	}
 	
 	public String getFormDispatchFieldId() {
diff --git a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentRenderFunctions.java b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentRenderFunctions.java
index 678f3ebafd3b82e0691fae6ad449c984629aa092..d54ef1081e39e8df7f3ee834401fd4a95686805e 100644
--- a/src/main/java/org/olat/ims/qti21/ui/components/AssessmentRenderFunctions.java
+++ b/src/main/java/org/olat/ims/qti21/ui/components/AssessmentRenderFunctions.java
@@ -661,10 +661,9 @@ public class AssessmentRenderFunctions {
 		return component.getMapperUri() + "/" + relativePath + "?href=" + relativePath;
 	}
 	
-	public static final String convertSubmissionLink(AssessmentObjectComponent component, ResolvedAssessmentItem resolvedAssessmentItem, String uri) {
+	public static final String convertSubmissionLink(AssessmentObjectComponent component, String uri) {
 		String filename = getLinkFilename(uri);
-		String relativePath = component.relativePathTo(resolvedAssessmentItem);
-		return component.getSubmissionMapperUri() + "/submissions/" + filename + "?href=" + relativePath + (uri == null ? "" : uri);
+		return component.getSubmissionMapperUri() + "/submissions/" + filename + "?href=" + (uri == null ? "" : uri);
 	}
 	
 	private static final String getLinkFilename(String uri) {
diff --git a/src/main/java/org/olat/modules/curriculum/CurriculumService.java b/src/main/java/org/olat/modules/curriculum/CurriculumService.java
index ff15ce66fba072e8e44564e7bd31d2c44342694e..29451c064d0f9620b40246db8266fcaf8c7b148b 100644
--- a/src/main/java/org/olat/modules/curriculum/CurriculumService.java
+++ b/src/main/java/org/olat/modules/curriculum/CurriculumService.java
@@ -331,7 +331,8 @@ public interface CurriculumService {
 	 * @param newParent The new parent or null if root
 	 * @param siblingBefore The sibling before the new position or null if at the first place
 	 */
-	public CurriculumElement moveCurriculumElement(CurriculumElement elementToMove, CurriculumElement newParent, CurriculumElement siblingBefore);
+	public CurriculumElement moveCurriculumElement(CurriculumElement elementToMove, CurriculumElement newParent,
+			CurriculumElement siblingBefore, Curriculum targetCurriculum);
 	
 	/**
 	 * Move a root curriculum element from a curriculum to an other. This operation
diff --git a/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java b/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java
index 5f492a5c111ebedd659db13c2b28122cf6f46719..b3d80fb3be460c8719f5010cba302630cb887263 100644
--- a/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java
+++ b/src/main/java/org/olat/modules/curriculum/manager/CurriculumElementDAO.java
@@ -215,21 +215,24 @@ public class CurriculumElementDAO {
 		return rootElement;
 	}	
 	
-	public CurriculumElement move(CurriculumElement elementToMove, CurriculumElement newParentElement, CurriculumElement siblingBefore) {
+	public CurriculumElement move(CurriculumElement elementToMove, CurriculumElement newParentElement,
+			CurriculumElement siblingBefore, Curriculum targetCurriculum) {
 		CurriculumElement parentElement = elementToMove.getParent();
 		CurriculumElementImpl element = (CurriculumElementImpl)elementToMove;
+		CurriculumImpl curriculum = loadCurriculumByKey(targetCurriculum.getKey());
+		
+		String keysPath = element.getMaterializedPathKeys();
+		List<CurriculumElement> descendants = getDescendants(element);
 		
 		if(parentElement == null && newParentElement == null) {
 			// reorder curriculum children
 			
-			CurriculumImpl curriculum = loadCurriculumByKey(element);
 			List<CurriculumElement> rootElements = curriculum.getRootElements();
 			reorderList(element, rootElements, siblingBefore);
 			dbInstance.getCurrentEntityManager().merge(curriculum);
 		} else if(parentElement == null) {
 			// move from curriculum as root to a curriculum element
 			
-			CurriculumImpl curriculum = loadCurriculumByKey(element);
 			List<CurriculumElement> rootElements = curriculum.getRootElements();
 			element.setCurriculumParent(null);
 			rootElements.remove(element);
@@ -249,7 +252,6 @@ public class CurriculumElementDAO {
 			element.setParent(null);
 			dbInstance.getCurrentEntityManager().merge(parentElement);	
 			
-			CurriculumImpl curriculum = loadCurriculumByKey(element);
 			element.setCurriculumParent(curriculum);
 			List<CurriculumElement> rootElements = curriculum.getRootElements();
 			reorderList(element, rootElements, siblingBefore);
@@ -276,12 +278,10 @@ public class CurriculumElementDAO {
 			dbInstance.getCurrentEntityManager().merge(newParentElement);
 		}
 
-		String keysPath = element.getMaterializedPathKeys();
-		List<CurriculumElement> descendants = getDescendants(element);
-
 		element.setLastModified(new Date());
 		String newKeysPath = getMaterializedPathKeys(newParentElement, element);
 		element.setMaterializedPathKeys(newKeysPath);
+		element.setCurriculum(curriculum);
 		element = dbInstance.getCurrentEntityManager().merge(element);
 
 		for(CurriculumElement descendant:descendants) {
@@ -291,6 +291,7 @@ public class CurriculumElementDAO {
 				String updatedPath = newKeysPath + end;
 				((CurriculumElementImpl)descendant).setMaterializedPathKeys(updatedPath);
 			}
+			((CurriculumElementImpl)descendant).setCurriculum(curriculum);
 			dbInstance.getCurrentEntityManager().merge(descendant);
 		}		
 		dbInstance.commit();
diff --git a/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java b/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java
index af7adb3108d3ac91cad6a006df9026abc27a0a4f..96a144001154811f3d8f1384a8cdd00f051c1341 100644
--- a/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java
+++ b/src/main/java/org/olat/modules/curriculum/manager/CurriculumServiceImpl.java
@@ -416,17 +416,22 @@ public class CurriculumServiceImpl implements CurriculumService, OrganisationDat
 	}
 	
 	@Override
-	public CurriculumElement moveCurriculumElement(CurriculumElement elementToMove, CurriculumElement newParent, CurriculumElement siblingBefore) {
-		CurriculumElement element = curriculumElementDao.move(elementToMove, newParent, siblingBefore);
+	public CurriculumElement moveCurriculumElement(CurriculumElement elementToMove, CurriculumElement newParent,
+			CurriculumElement siblingBefore, Curriculum targetCurriculum) {
+		Curriculum reloadedTargetCurriculum = curriculumDao.loadByKey(targetCurriculum.getKey());
+		CurriculumElement element = curriculumElementDao
+				.move(elementToMove, newParent, siblingBefore, reloadedTargetCurriculum);
 		
 		// propagate inheritance of the new parent
-		List<GroupMembership> memberships = groupDao.getMemberships(newParent.getGroup());
 		List<GroupMembership> membershipsToPropagate = new ArrayList<>();
 		Map<IdentityToRoleKey,GroupMembership> identityRoleToNewParentMembership = new HashMap<>();
-		for(GroupMembership membership:memberships) {
-			if(membership.getInheritanceMode() == GroupMembershipInheritance.inherited || membership.getInheritanceMode() == GroupMembershipInheritance.root) {
-				membershipsToPropagate.add(membership);
-				identityRoleToNewParentMembership.put(new IdentityToRoleKey(membership), membership);
+		if(newParent != null) {
+			List<GroupMembership> memberships = groupDao.getMemberships(newParent.getGroup());
+			for(GroupMembership membership:memberships) {
+				if(membership.getInheritanceMode() == GroupMembershipInheritance.inherited || membership.getInheritanceMode() == GroupMembershipInheritance.root) {
+					membershipsToPropagate.add(membership);
+					identityRoleToNewParentMembership.put(new IdentityToRoleKey(membership), membership);
+				}
 			}
 		}
 		
diff --git a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java
index 0d06e8682b514d7430c4d1bcbdb0d6dbb39e1fe3..b44bd84e51da308acfb8e6fbb2dde42b94ca5358 100644
--- a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java
+++ b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementsWebService.java
@@ -256,13 +256,14 @@ public class CurriculumElementsWebService {
 			elementToSave.setBeginDate(curriculumElement.getBeginDate());
 			elementToSave.setEndDate(curriculumElement.getEndDate());
 			elementToSave.setType(type);
-			if(parentElement != null && elementToSave.getParent() != null
-					&& !elementToSave.getParent().getKey().equals(parentElement.getKey())) {
+			if((parentElement != null && elementToSave.getParent() != null && !elementToSave.getParent().getKey().equals(parentElement.getKey()))) {
 				move = true;
 			} else if(parentElement == null && elementToSave.getParent() == null
 					&& (elementToSave.getCurriculum() != null && !elementToSave.getCurriculum().getKey().equals(curriculum.getKey()))) {
 				// this is a root curriculum element and it get a new curriculum as home
 				moveAsCurriculumRoot = true;
+			} else if(!elementToSave.getCurriculum().getKey().equals(curriculumElement.getCurriculumKey())) {
+				move = true;
 			}
 		}
 		
@@ -279,7 +280,7 @@ public class CurriculumElementsWebService {
 		}
 		CurriculumElement savedElement = curriculumService.updateCurriculumElement(elementToSave);
 		if(move) {
-			curriculumService.moveCurriculumElement(savedElement, parentElement, null);
+			curriculumService.moveCurriculumElement(savedElement, parentElement, null, curriculum);
 			dbInstance.commit();
 			savedElement = curriculumService.getCurriculumElement(savedElement);
 		} else if(moveAsCurriculumRoot) {
diff --git a/src/main/java/org/olat/modules/curriculum/ui/MoveCurriculumElementController.java b/src/main/java/org/olat/modules/curriculum/ui/MoveCurriculumElementController.java
index 0ed4f972ce71d09fda70776027eb3a78dde1ffc2..d9c08fd541730410599a1ff54d2f735c66a589e4 100644
--- a/src/main/java/org/olat/modules/curriculum/ui/MoveCurriculumElementController.java
+++ b/src/main/java/org/olat/modules/curriculum/ui/MoveCurriculumElementController.java
@@ -300,7 +300,7 @@ public class MoveCurriculumElementController extends FormBasicController {
 			}
 	
 			for(CurriculumElement elementToMove:curriculumElementsToMove) {
-				curriculumService.moveCurriculumElement(elementToMove, newParent, siblingBefore);
+				curriculumService.moveCurriculumElement(elementToMove, newParent, siblingBefore, curriculum);
 				dbInstance.commit();
 			}
 		}
diff --git a/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java b/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java
index d9bdf53ad8d1599aa49acd65042eb5e45ac61791..d192662e7df41274a35f8de3b55a1e5ac34f289e 100644
--- a/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java
+++ b/src/test/java/org/olat/modules/curriculum/manager/CurriculumElementDAOTest.java
@@ -412,7 +412,7 @@ public class CurriculumElementDAOTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		// move element1_1 under element2
-		curriculumElementDao.move(element1_1, element2, null);
+		curriculumElementDao.move(element1_1, element2, null, curriculum);
 		dbInstance.commit();
 		
 		// check parent line of element1_1_2
@@ -452,7 +452,7 @@ public class CurriculumElementDAOTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		// move element1_1 at third posistion
-		curriculumElementDao.move(element1_2, rootElement, element1_4);
+		curriculumElementDao.move(element1_2, rootElement, element1_4, curriculum);
 		dbInstance.commit();
 		
 		CurriculumElementImpl element = (CurriculumElementImpl)curriculumElementDao.loadByKey(rootElement.getKey());
@@ -482,7 +482,7 @@ public class CurriculumElementDAOTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		// move element1_5 at third position
-		curriculumElementDao.move(element1_5, rootElement, element1_2);
+		curriculumElementDao.move(element1_5, rootElement, element1_2, curriculum);
 		dbInstance.commit();
 		
 		CurriculumElementImpl element = (CurriculumElementImpl)curriculumElementDao.loadByKey(rootElement.getKey());
@@ -511,7 +511,7 @@ public class CurriculumElementDAOTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		// move element1_1 under element2
-		curriculumElementDao.move(element2, null, element4);
+		curriculumElementDao.move(element2, null, element4, curriculum);
 		dbInstance.commit();
 		
 		// check parent line of element1_1_2
@@ -547,7 +547,7 @@ public class CurriculumElementDAOTest extends OlatTestCase {
 		
 		// move element1_1 under element2
 		CurriculumElement reloadedElement1_1 = curriculumElementDao.loadByKey(element1_1.getKey());
-		curriculumElementDao.move(rootElement2, reloadedElement1_1, element1_1_1);
+		curriculumElementDao.move(rootElement2, reloadedElement1_1, element1_1_1, curriculum);
 		dbInstance.commit();
 		
 		// check children element1_1
@@ -584,7 +584,7 @@ public class CurriculumElementDAOTest extends OlatTestCase {
 		
 		// move element1_1 under element2
 		CurriculumElement reloadedElement1_1_3 = curriculumElementDao.loadByKey(element1_1_3.getKey());
-		curriculumElementDao.move(reloadedElement1_1_3, null, rootElement1);
+		curriculumElementDao.move(reloadedElement1_1_3, null, rootElement1, curriculum);
 		dbInstance.commit();
 		
 		// check children element1_1
@@ -706,6 +706,133 @@ public class CurriculumElementDAOTest extends OlatTestCase {
 		Assert.assertTrue(stayingElements.contains(stayingElement1_1));
 	}
 	
+	@Test
+	public void moveCurriculumElement_elementCurriculumToCurriculum() {
+		Curriculum curriculum = curriculumDao.createAndPersist("cur-start-", "Curriculum to start", "Curriculum", null);
+		Curriculum targetCurriculum = curriculumDao.createAndPersist("cur-new-home-", "Curriculum as new home", "Curriculum", null);
+
+		CurriculumElement stayingElement1 = curriculumElementDao.createCurriculumElement("Element-1", "1. Element", CurriculumElementStatus.active,
+				null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
+		CurriculumElement stayingElement1_1 = curriculumElementDao.createCurriculumElement("Element-1-1", "1.1. Element", CurriculumElementStatus.active,
+				null, null, stayingElement1, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
+		CurriculumElement element1_2 = curriculumElementDao.createCurriculumElement("Element-1-2", "1.2. Element", CurriculumElementStatus.active,
+				null, null, stayingElement1, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
+		CurriculumElement element1_2_1 = curriculumElementDao.createCurriculumElement("Element-1-2-1", "1.2.1. Element", CurriculumElementStatus.active,
+				null, null, element1_2, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
+		CurriculumElement element1_2_2 = curriculumElementDao.createCurriculumElement("Element-1-2-2", "1.2.2 Element", CurriculumElementStatus.active,
+				null, null, element1_2, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
+		
+		CurriculumElement stayingElement2 = curriculumElementDao.createCurriculumElement("T-Element-2", "2. Element", CurriculumElementStatus.active,
+				null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
+		CurriculumElement stayingElement2_1 = curriculumElementDao.createCurriculumElement("T-Element-2-1", "2.1. Element", CurriculumElementStatus.active,
+				null, null, stayingElement1, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
+		
+		CurriculumElement targetElement1 = curriculumElementDao.createCurriculumElement("Ta-Element-3", "3. Element", CurriculumElementStatus.active,
+				null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, targetCurriculum);
+		CurriculumElement targetElement1_1 = curriculumElementDao.createCurriculumElement("Ta-Element-3-1", "3.1. Element", CurriculumElementStatus.active,
+				null, null, targetElement1, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, targetCurriculum);
+		dbInstance.commitAndCloseSession();
+		
+		// move element1 under its new curriculum
+		curriculumElementDao.move(element1_2, targetElement1_1, null, targetCurriculum);
+		dbInstance.commitAndCloseSession();
+		
+		// check the source curriculum
+		CurriculumImpl reloadedCurriculum = (CurriculumImpl)curriculumDao.loadByKey(curriculum.getKey());
+		List<CurriculumElement> rootElements = reloadedCurriculum.getRootElements();
+		Assert.assertEquals(2, rootElements.size());
+		Assert.assertTrue(rootElements.contains(stayingElement1));
+		Assert.assertTrue(rootElements.contains(stayingElement2));
+		
+		// check the target curriculum
+		CurriculumImpl reloadedTargetCurriculum = (CurriculumImpl)curriculumDao.loadByKey(targetCurriculum.getKey());
+		List<CurriculumElement> targetRootElements = reloadedTargetCurriculum.getRootElements();
+		Assert.assertEquals(1, targetRootElements.size());
+		Assert.assertTrue(targetRootElements.contains(targetElement1));
+		
+		List<CurriculumElement> targetElements = curriculumElementDao.loadElements(reloadedTargetCurriculum, CurriculumElementStatus.values());
+		Assert.assertEquals(5, targetElements.size());
+		// current ones
+		Assert.assertTrue(targetElements.contains(targetElement1));
+		Assert.assertTrue(targetElements.contains(targetElement1_1));
+		// check curriculum references
+		Assert.assertEquals(targetCurriculum, targetElement1.getCurriculum());
+		Assert.assertEquals(targetCurriculum, targetElement1_1.getCurriculum());
+		// moved ones
+		Assert.assertTrue(targetElements.contains(element1_2));
+		Assert.assertTrue(targetElements.contains(element1_2_1));
+		Assert.assertTrue(targetElements.contains(element1_2_2));
+		// check curriculum reference
+		for(CurriculumElement targetElement:targetElements) {
+			Assert.assertEquals(targetCurriculum, targetElement.getCurriculum());
+		}
+		// check parent
+		CurriculumElement reloadedElement1_2 = curriculumElementDao.loadByKey(element1_2.getKey());
+		Assert.assertEquals(targetElement1_1, reloadedElement1_2.getParent());
+		
+		List<CurriculumElement> stayingElements = curriculumElementDao.loadElements(curriculum, CurriculumElementStatus.values());
+		Assert.assertEquals(4, stayingElements.size());
+		// current ones
+		Assert.assertTrue(stayingElements.contains(stayingElement1));
+		Assert.assertTrue(stayingElements.contains(stayingElement1_1));
+		Assert.assertTrue(stayingElements.contains(stayingElement2));
+		Assert.assertTrue(stayingElements.contains(stayingElement2_1));
+		// check curriculum references
+		Assert.assertEquals(curriculum, stayingElement1.getCurriculum());
+		Assert.assertEquals(curriculum, stayingElement1_1.getCurriculum());
+		Assert.assertEquals(curriculum, stayingElement2.getCurriculum());
+		Assert.assertEquals(curriculum, stayingElement2_1.getCurriculum());
+	}
+	
+	@Test
+	public void moveCurriculumElement_elementToRootOtherCurriculum() {
+		Curriculum curriculum = curriculumDao.createAndPersist("cur-for-el-7", "Curriculum for element", "Curriculum", null);
+		CurriculumElement rootElement1 = curriculumElementDao.createCurriculumElement("Element-10-1", "10.1 Element", CurriculumElementStatus.active,
+				null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
+		CurriculumElement element1_1 = curriculumElementDao.createCurriculumElement("Element-10-1-1", "10.1.1 Element", CurriculumElementStatus.active,
+				null, null, rootElement1, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
+		CurriculumElement element1_1_1 = curriculumElementDao.createCurriculumElement("Element-10-1-1-1", "10.1.1.1 Element", CurriculumElementStatus.active,
+				null, null, element1_1, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
+		CurriculumElement element1_1_2 = curriculumElementDao.createCurriculumElement("Element-10-1-1-2", "10.1.1.2 Element", CurriculumElementStatus.active,
+				null, null, element1_1, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
+		CurriculumElement element1_1_3 = curriculumElementDao.createCurriculumElement("Element-10-1-1-3", "10.1.1.3 Element", CurriculumElementStatus.active,
+				null, null, element1_1, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
+		CurriculumElement element1_1_3_1 = curriculumElementDao.createCurriculumElement("Element-10-1-1-3-1", "10.1.1.3.1 Element", CurriculumElementStatus.active,
+				null, null, element1_1_3, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, curriculum);
+
+		Curriculum targetCurriculum = curriculumDao.createAndPersist("cur-for-el-8", "Target curriculum for element", "Curriculum", null);
+		CurriculumElement rootElement2 = curriculumElementDao.createCurriculumElement("Element-10-2", "10.2 Element", CurriculumElementStatus.active,
+				null, null, null, null, CurriculumCalendars.disabled, CurriculumLectures.disabled, targetCurriculum);
+		dbInstance.commit();
+
+		// move element1_1_3 under the target curriculum
+		CurriculumElement reloadedElement1_1_3 = curriculumElementDao.loadByKey(element1_1_3.getKey());
+		curriculumElementDao.move(reloadedElement1_1_3, null, rootElement2, targetCurriculum);
+		dbInstance.commit();
+		
+		// check children element1_1
+		CurriculumElementImpl reloadElement1_1 = (CurriculumElementImpl)curriculumElementDao.loadByKey(element1_1.getKey());
+		List<CurriculumElement> element11children = reloadElement1_1.getChildren();
+		Assert.assertEquals(2, element11children.size());
+		Assert.assertEquals(element1_1_1, element11children.get(0));
+		Assert.assertEquals(element1_1_2, element11children.get(1));
+		
+		// check target curriculum
+		List<CurriculumElement> targetElements = curriculumElementDao.loadElements(targetCurriculum, CurriculumElementStatus.values());
+		Assert.assertEquals(3, targetElements.size());
+		// check elements
+		Assert.assertTrue(targetElements.contains(rootElement2));
+		Assert.assertTrue(targetElements.contains(element1_1_3));
+		Assert.assertTrue(targetElements.contains(element1_1_3_1));
+		
+		// check children curriculum
+		CurriculumImpl reloadedTargetCurriculum = (CurriculumImpl)curriculumDao.loadByKey(targetCurriculum.getKey());
+		List<CurriculumElement> rootElements = reloadedTargetCurriculum.getRootElements();
+		Assert.assertEquals(2, rootElements.size());
+		Assert.assertEquals(rootElement2, rootElements.get(0));
+		Assert.assertEquals(element1_1_3, rootElements.get(1));
+	}
+	
 	@Test
 	public void getMembersIdentity() {
 		Identity supervisor = JunitTestHelper.createAndPersistIdentityAsRndUser("cur-supervisor-1");