diff --git a/src/main/java/org/olat/course/export/CourseEnvironmentMapper.java b/src/main/java/org/olat/course/export/CourseEnvironmentMapper.java
index 833d47181dcc63b44505016eadf2e31c5d3f6a0c..7fdf81460c7ce3fbbd2cce23a0dac8e071061d6d 100644
--- a/src/main/java/org/olat/course/export/CourseEnvironmentMapper.java
+++ b/src/main/java/org/olat/course/export/CourseEnvironmentMapper.java
@@ -21,8 +21,10 @@ package org.olat.course.export;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
 
@@ -40,6 +42,7 @@ public class CourseEnvironmentMapper {
 
 	private final List<BGAreaReference> areas = new ArrayList<BGAreaReference>();
 	private final List<BusinessGroupReference> groups = new ArrayList<BusinessGroupReference>();
+	private final Map<String,Map<String,String>> mapUniqueKeys = new HashMap<>();
 	
 	private Identity author;
 	
@@ -54,6 +57,24 @@ public class CourseEnvironmentMapper {
 	public void setAuthor(Identity author) {
 		this.author = author;
 	}
+	
+	public void addUniqueKeyPair(String ident, String sourceKey, String targetKey) {
+		Map<String,String> map;
+		if(mapUniqueKeys.containsKey(ident)) {
+			map = mapUniqueKeys.get(ident);
+		} else {
+			map = new HashMap<>();
+			mapUniqueKeys.put(ident, map);
+		}
+		map.put(sourceKey, targetKey);
+	}
+	
+	public String getTargetUniqueKey(String ident, String sourceKey) {
+		if(mapUniqueKeys.containsKey(ident)) {
+			return mapUniqueKeys.get(ident).get(sourceKey);
+		}
+		return null;
+	}
 
 	public List<BGAreaReference> getAreas() {
 		return areas;
diff --git a/src/main/java/org/olat/course/nodes/CheckListCourseNode.java b/src/main/java/org/olat/course/nodes/CheckListCourseNode.java
index a2818e861d31532527349491646f11ed7481040b..6300d765dac62a9af0b516822840775a0cfc29f0 100644
--- a/src/main/java/org/olat/course/nodes/CheckListCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/CheckListCourseNode.java
@@ -60,6 +60,7 @@ import org.olat.course.editor.CourseEditorEnv;
 import org.olat.course.editor.NodeEditController;
 import org.olat.course.editor.PublishEvents;
 import org.olat.course.editor.StatusDescription;
+import org.olat.course.export.CourseEnvironmentMapper;
 import org.olat.course.nodes.cl.CheckboxManager;
 import org.olat.course.nodes.cl.model.Checkbox;
 import org.olat.course.nodes.cl.model.CheckboxList;
@@ -477,7 +478,7 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements
 			Set<String> usedNames = new HashSet<String>();
 			
 			for(Checkbox checkbox:list.getList()) {
-				VFSContainer dir = checkboxManager.getFileContainer(course.getCourseEnvironment(), this, checkbox);
+				VFSContainer dir = checkboxManager.getFileContainer(course.getCourseEnvironment(), this);
 				if(dir != null) {
 					VFSItem item = dir.resolve(checkbox.getFilename());
 					if(item instanceof VFSLeaf) {
@@ -504,7 +505,7 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements
 		CheckboxList list = (CheckboxList)config.get(CONFIG_KEY_CHECKBOX);
 		if(list != null && list.getList() != null) {
 			for(Checkbox checkbox:list.getList()) {
-				File dir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this, checkbox);
+				File dir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this);
 				if(dir.exists()) {
 					File fFileExportDir = new File(fExportDirectory, "checklistfiles/" + getIdent() + "/" + checkbox.getCheckboxId());
 					fFileExportDir.mkdirs();
@@ -526,7 +527,7 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements
 				String newCheckboxId = UUID.randomUUID().toString();
 				checkbox.setCheckboxId(newCheckboxId);
 				if(fFileImportDir.exists()) {
-					File dir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this, checkbox);
+					File dir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this);
 					dir.mkdirs();
 					FileUtils.copyDirContentsToDir(fFileImportDir, dir, false, "import file of checkbox");
 				}
@@ -614,6 +615,56 @@ public class CheckListCourseNode extends AbstractAccessableCourseNode implements
 		
 		userCourseEnv.getScoreAccounting().scoreInfoChanged(this, sceval);
 	}
+	
+	@Override
+	public CourseNode createInstanceForCopy(boolean isNewTitle, ICourse course, Identity author) {
+		CheckListCourseNode cNode = (CheckListCourseNode)super.createInstanceForCopy(isNewTitle, course, author);
+		CheckboxManager checkboxManager = CoreSpringFactory.getImpl(CheckboxManager.class);
+		CheckboxList list = (CheckboxList)cNode.getModuleConfiguration().get(CONFIG_KEY_CHECKBOX);
+		for(Checkbox checkbox:list.getList()) {
+			checkbox.setCheckboxId(UUID.randomUUID().toString());
+		}
+		// the ident of the course node is the same
+		File sourceDir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this);
+		if(sourceDir.exists()) {
+			File targetDir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), cNode);
+			if(!targetDir.exists()) {
+				targetDir.mkdirs();
+				FileUtils.copyDirContentsToDir(sourceDir, targetDir, false, "copy files of checkbox");
+			}
+		}
+		
+		return cNode;
+	}
+
+	@Override
+	public void postCopy(CourseEnvironmentMapper envMapper, Processing processType, ICourse course, ICourse sourceCourse) {
+		ModuleConfiguration config = getModuleConfiguration();
+		CheckboxManager checkboxManager = CoreSpringFactory.getImpl(CheckboxManager.class);
+		CheckboxList list = (CheckboxList)config.get(CONFIG_KEY_CHECKBOX);
+		for(Checkbox checkbox:list.getList()) {
+			String sourceId = checkbox.getCheckboxId();
+			String targetId = envMapper.getTargetUniqueKey(getIdent(), sourceId);
+			if(targetId == null) {
+				targetId = UUID.randomUUID().toString();
+				envMapper.addUniqueKeyPair(getIdent(), sourceId, targetId);
+			}
+			checkbox.setCheckboxId(targetId);
+		}
+		
+		// the ident of the course node is the same
+		File sourceDir = checkboxManager.getFileDirectory(sourceCourse.getCourseEnvironment(), this);
+		if(sourceDir.exists()) {
+			File targetDir = checkboxManager.getFileDirectory(course.getCourseEnvironment(), this);
+			if(!targetDir.exists()) {
+				targetDir.mkdirs();
+				FileUtils.copyDirContentsToDir(sourceDir, targetDir, false, "copy files of checkbox");
+			}
+		}
+
+		checkboxManager.syncCheckbox(list, course, getIdent());
+		super.postCopy(envMapper, processType, course, sourceCourse);
+	}
 
 	@Override
 	public void updateOnPublish(Locale locale, ICourse course, Identity publisher, PublishEvents publishEvents) {
diff --git a/src/main/java/org/olat/course/nodes/cl/CheckboxManager.java b/src/main/java/org/olat/course/nodes/cl/CheckboxManager.java
index f968ac3b7bce80c351ef367f0a5beaa31b727610..a0a444f399bde8498e2962390ede137289fefecd 100644
--- a/src/main/java/org/olat/course/nodes/cl/CheckboxManager.java
+++ b/src/main/java/org/olat/course/nodes/cl/CheckboxManager.java
@@ -28,7 +28,6 @@ import org.olat.core.util.vfs.VFSContainer;
 import org.olat.course.nodes.CheckListCourseNode;
 import org.olat.course.nodes.cl.model.AssessmentBatch;
 import org.olat.course.nodes.cl.model.AssessmentData;
-import org.olat.course.nodes.cl.model.Checkbox;
 import org.olat.course.nodes.cl.model.CheckboxList;
 import org.olat.course.nodes.cl.model.DBCheck;
 import org.olat.course.nodes.cl.model.DBCheckbox;
@@ -96,7 +95,7 @@ public interface CheckboxManager {
 	 */
 	public List<AssessmentData> getAssessmentDatas(OLATResourceable ores, String resSubPath, RepositoryEntry re, List<BusinessGroup> groups);
 	
-	public VFSContainer getFileContainer(CourseEnvironment courseEnv, CheckListCourseNode cNode, Checkbox checkbox);
+	public VFSContainer getFileContainer(CourseEnvironment courseEnv, CheckListCourseNode cNode);
 	
-	public File getFileDirectory(CourseEnvironment courseEnv, CheckListCourseNode cNode, Checkbox checkbox);
+	public File getFileDirectory(CourseEnvironment courseEnv, CheckListCourseNode cNode);
 }
diff --git a/src/main/java/org/olat/course/nodes/cl/manager/CheckboxManagerImpl.java b/src/main/java/org/olat/course/nodes/cl/manager/CheckboxManagerImpl.java
index 956335a8f3d32022f00181ae866260980c09fd08..dee62ad9eefb4a56d01bc0d4ccb2b718d641a66a 100644
--- a/src/main/java/org/olat/course/nodes/cl/manager/CheckboxManagerImpl.java
+++ b/src/main/java/org/olat/course/nodes/cl/manager/CheckboxManagerImpl.java
@@ -510,14 +510,14 @@ public class CheckboxManagerImpl implements CheckboxManager {
 	}
 
 	@Override
-	public VFSContainer getFileContainer(CourseEnvironment courseEnv, CheckListCourseNode cNode, Checkbox checkbox) {
+	public VFSContainer getFileContainer(CourseEnvironment courseEnv, CheckListCourseNode cNode) {
 		String path = courseEnv.getCourseBaseContainer().getRelPath() + "/" + CheckListCourseNode.FOLDER_NAME + "/" + cNode.getIdent();
 		OlatRootFolderImpl rootFolder = new OlatRootFolderImpl(path, null);
 		return rootFolder; 
 	}
 
 	@Override
-	public File getFileDirectory(CourseEnvironment courseEnv, CheckListCourseNode cNode, Checkbox checkbox) {
+	public File getFileDirectory(CourseEnvironment courseEnv, CheckListCourseNode cNode) {
 		String path = courseEnv.getCourseBaseContainer().getRelPath() + "/" + CheckListCourseNode.FOLDER_NAME + "/" + cNode.getIdent();
 		File rootFolder = new File(FolderConfig.getCanonicalRoot(), path);
 		return rootFolder; 
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckListBoxListEditController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckListBoxListEditController.java
index 7919956d24a3c567f633fe7e9d80a4a12a2d910c..9657a5c2dcace4fd5fcac388671279a2e68a913e 100644
--- a/src/main/java/org/olat/course/nodes/cl/ui/CheckListBoxListEditController.java
+++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckListBoxListEditController.java
@@ -148,7 +148,7 @@ public class CheckListBoxListEditController extends FormBasicController {
 		if(list != null && list.getList() != null) {
 			for(Checkbox checkbox:list.getList()) {
 				DownloadLink download = null;
-				VFSContainer container = checkboxManager.getFileContainer(courseEnv, courseNode, checkbox);
+				VFSContainer container = checkboxManager.getFileContainer(courseEnv, courseNode);
 				if(container != null) {
 					VFSItem item = container.resolve(checkbox.getFilename());
 					if(item instanceof VFSLeaf) {
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckListRunController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckListRunController.java
index fc6d9850aa82a1a5bd756eb4ed8121a9efdd3796..084d373955aed935b4f3741001fcccb4acb8371e 100644
--- a/src/main/java/org/olat/course/nodes/cl/ui/CheckListRunController.java
+++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckListRunController.java
@@ -204,7 +204,7 @@ public class CheckListRunController extends FormBasicController implements Contr
 
 		DownloadLink downloadLink = null;
 		if(StringHelper.containsNonWhitespace(checkbox.getFilename())) {
-			VFSContainer container = checkboxManager.getFileContainer(userCourseEnv.getCourseEnvironment(), courseNode, checkbox);
+			VFSContainer container = checkboxManager.getFileContainer(userCourseEnv.getCourseEnvironment(), courseNode);
 			VFSItem item = container.resolve(checkbox.getFilename());
 			if(item instanceof VFSLeaf) {
 				String name = "file_" + checkbox.getCheckboxId();
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/CheckboxEditController.java b/src/main/java/org/olat/course/nodes/cl/ui/CheckboxEditController.java
index 05b2cadd6fa9861a070b14cf181fa5506aed2b3e..598f08e17d3a60b2fbd4ef45d314f65fbf6257d4 100644
--- a/src/main/java/org/olat/course/nodes/cl/ui/CheckboxEditController.java
+++ b/src/main/java/org/olat/course/nodes/cl/ui/CheckboxEditController.java
@@ -305,7 +305,7 @@ public class CheckboxEditController extends FormBasicController {
 		} else {
 			ICourse course = CourseFactory.loadCourse(courseOres);
 			CourseEnvironment courseEnv = course.getCourseEnvironment();
-			container = checkboxManager.getFileContainer(courseEnv, courseNode, checkbox);
+			container = checkboxManager.getFileContainer(courseEnv, courseNode);
 		}
 		return container;
 	}
diff --git a/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListStepRunnerCallback.java b/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListStepRunnerCallback.java
index 2bb5d07d2ae260944ebc7f2a283528a08a264ba0..fcf870967d313246b0ebe3928f066fe887d6359d 100644
--- a/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListStepRunnerCallback.java
+++ b/src/main/java/org/olat/course/nodes/cl/ui/wizard/CheckListStepRunnerCallback.java
@@ -103,7 +103,7 @@ public class CheckListStepRunnerCallback implements StepRunnerCallback {
 					VFSContainer tmpContainer = new LocalFolderImpl(path);
 					VFSItem item = tmpContainer.resolve(templateBox.getFilename());
 					if(item instanceof VFSLeaf) {
-						VFSContainer container = checkboxManager.getFileContainer(courseEnv, checkNode, checkbox);
+						VFSContainer container = checkboxManager.getFileContainer(courseEnv, checkNode);
 						VFSManager.copyContent(tmpContainer, container);
 						tmpContainer.deleteSilently();
 					}