diff --git a/src/main/java/org/olat/course/condition/Condition.java b/src/main/java/org/olat/course/condition/Condition.java
index 6808de4dd7b6e3c557d4ab9b45a878d82a9a0a9f..30f0c3f511ccdee9d801df67b2c8bfd3bb5ac644 100644
--- a/src/main/java/org/olat/course/condition/Condition.java
+++ b/src/main/java/org/olat/course/condition/Condition.java
@@ -38,7 +38,6 @@ import org.olat.core.util.StringHelper;
 public class Condition implements Serializable, Cloneable {
 	transient private String conditionId = null;
 	private String condition = null;
-	private String conditionUpgraded = null;
 	private boolean expertMode = false;
 
 	private String easyModeBeginDate;
@@ -95,11 +94,11 @@ public class Condition implements Serializable, Cloneable {
 	}
 
 	public String getConditionUpgraded() {
-		return conditionUpgraded;
+		return null;
 	}
 
 	public void setConditionUpgraded(String conditionUpgraded) {
-		this.conditionUpgraded = conditionUpgraded;
+		//only for compatibility reason, don't delete these methods
 	}
 
 	/**
diff --git a/src/main/java/org/olat/course/condition/interpreter/ConditionInterpreter.java b/src/main/java/org/olat/course/condition/interpreter/ConditionInterpreter.java
index 320750a2e6d15ab9d017e9863bba98a80907b84c..69fb769a1fbea6cd7a08121fb49235a1d5d47eea 100644
--- a/src/main/java/org/olat/course/condition/interpreter/ConditionInterpreter.java
+++ b/src/main/java/org/olat/course/condition/interpreter/ConditionInterpreter.java
@@ -272,9 +272,7 @@ public class ConditionInterpreter {
 	 * @return True if evaluation successfull.
 	 */
 	public boolean evaluateCondition(Condition c) {
-		if(c.isExpertMode() && StringHelper.containsNonWhitespace(c.getConditionUpgraded())) {
-			return evaluateCondition(c.getConditionUpgraded());
-		} else if (!c.isExpertMode() && (c.getAttributeConditions() == null || c.getAttributeConditions().isEmpty())) {
+		if (!c.isExpertMode() && (c.getAttributeConditions() == null || c.getAttributeConditions().isEmpty())) {
 			//experimental optimized evaluation of the easy conditions
 			//return evaluateEasyCondition(c);
 		}
diff --git a/src/main/java/org/olat/course/nodes/GenericCourseNode.java b/src/main/java/org/olat/course/nodes/GenericCourseNode.java
index 896afec2968790d2911f2d549db883768e74a305..c418b5dcb06f989ecca17fdb4a0fc306c6124900 100644
--- a/src/main/java/org/olat/course/nodes/GenericCourseNode.java
+++ b/src/main/java/org/olat/course/nodes/GenericCourseNode.java
@@ -439,7 +439,7 @@ public abstract class GenericCourseNode extends GenericNode implements CourseNod
 				String processExpression = convertExpressionNameToKey(expression, envMapper);
 				processExpression = convertExpressionKeyToKey(expression, envMapper);
 				if(!expression.equals(processExpression)) {
-					condition.setConditionUpgraded(processExpression);
+					condition.setConditionExpression(processExpression);
 				}
 			}
 		}
@@ -483,7 +483,7 @@ public abstract class GenericCourseNode extends GenericNode implements CourseNod
 		if(backwardsCompatible) {
 			condition.setEasyModeGroupAreaAccessIds(null);
 			condition.setEasyModeGroupAccessIds(null);
-			condition.setConditionUpgraded(null);
+			//condition.setConditionUpgraded(null);
 		}
 	}
 	
diff --git a/src/main/java/org/olat/course/repository/CreateNewCourseController.java b/src/main/java/org/olat/course/repository/CreateNewCourseController.java
index bddafe838a9832d3494ffb7198e1becec2f20502..509adbbc6e9f739ddbcdf525754207c3103acea5 100644
--- a/src/main/java/org/olat/course/repository/CreateNewCourseController.java
+++ b/src/main/java/org/olat/course/repository/CreateNewCourseController.java
@@ -25,6 +25,9 @@
 
 package org.olat.course.repository;
 
+import java.io.File;
+import java.util.UUID;
+
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.basesecurity.Constants;
@@ -34,10 +37,14 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.controller.BasicController;
+import org.olat.core.util.CodeHelper;
 import org.olat.core.util.Formatter;
 import org.olat.course.CourseFactory;
 import org.olat.course.CourseModule;
 import org.olat.course.ICourse;
+import org.olat.course.export.CourseEnvironmentMapper;
+import org.olat.course.groupsandrights.CourseGroupManager;
+import org.olat.course.groupsandrights.PersistingCourseGroupManager;
 import org.olat.course.nodes.CourseNode;
 import org.olat.course.tree.CourseEditorTreeNode;
 import org.olat.repository.RepositoryEntry;
@@ -144,7 +151,26 @@ public class CreateNewCourseController extends BasicController implements IAddCo
 		CourseFactory.saveCourse(course.getResourceableId());
 		CourseFactory.closeCourseEditSession(course.getResourceableId(), true);
 	}
-	
+
+	@Override
+	public void repositoryEntryCopied(RepositoryEntry sourceEntry, RepositoryEntry newEntry) {
+		ICourse sourceCourse = CourseFactory.loadCourse(sourceEntry.getOlatResource().getResourceableId());
+		CourseGroupManager sourceCgm = sourceCourse.getCourseEnvironment().getCourseGroupManager();
+		CourseEnvironmentMapper env = PersistingCourseGroupManager.getInstance(sourceCourse).getBusinessGroupEnvironment();
+		
+		File fExportDir = new File(System.getProperty("java.io.tmpdir"), UUID.randomUUID().toString());
+		fExportDir.mkdirs();
+		sourceCgm.exportCourseBusinessGroups(fExportDir, env, false);
+
+		course = CourseFactory.loadCourse(newEntry.getOlatResource().getResourceableId());
+		CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager();
+		// import groups
+		CourseEnvironmentMapper envMapper = cgm.importCourseBusinessGroups(fExportDir);
+		//upgrade to the current version of the course
+		course = CourseFactory.loadCourse(cgm.getCourseResource());
+		course.postImport(envMapper);
+	}
+
 	/**
 	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
 	 */
diff --git a/src/main/java/org/olat/course/repository/ImportCourseController.java b/src/main/java/org/olat/course/repository/ImportCourseController.java
index 02bd32174ed66bc87683f1fe2a338dead69e2887..da68f12b1b78fab792a769b4f73166af94e18823 100644
--- a/src/main/java/org/olat/course/repository/ImportCourseController.java
+++ b/src/main/java/org/olat/course/repository/ImportCourseController.java
@@ -35,7 +35,6 @@ import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.basesecurity.Constants;
 import org.olat.commons.file.filechooser.FileChooserController;
-import org.olat.core.commons.modules.bc.vfs.OlatRootFolderImpl;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.panel.Panel;
@@ -46,7 +45,6 @@ import org.olat.core.gui.control.controller.BasicController;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.Formatter;
 import org.olat.core.util.vfs.LocalFileImpl;
-import org.olat.core.util.vfs.LocalImpl;
 import org.olat.core.util.vfs.QuotaManager;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.core.util.vfs.filters.VFSItemFileTypeFilter;
@@ -161,6 +159,11 @@ public class ImportCourseController extends BasicController implements IAddContr
 		CourseFactory.saveCourse(course.getResourceableId());
 		CourseFactory.closeCourseEditSession(course.getResourceableId(),true);
 	}
+	
+	@Override
+	public void repositoryEntryCopied(RepositoryEntry sourceEntry, RepositoryEntry newEntry) {
+		//
+	}
 
 	/**
 	 * @see org.olat.repository.controllers.IAddController#transactionAborted()
diff --git a/src/main/java/org/olat/ims/cp/ui/CreateNewCPController.java b/src/main/java/org/olat/ims/cp/ui/CreateNewCPController.java
index 0344aafe893fc8b7a931a6fe253ec35eb75c0da7..cd936263650955ae9ca576f4b4a6edc28842f4c7 100644
--- a/src/main/java/org/olat/ims/cp/ui/CreateNewCPController.java
+++ b/src/main/java/org/olat/ims/cp/ui/CreateNewCPController.java
@@ -89,6 +89,11 @@ public class CreateNewCPController extends BasicController implements IAddContro
 		secMgr.createAndPersistPolicy(re.getOwnerGroup(), Constants.PERMISSION_ADMIN, re.getOlatResource());
 	}
 
+	@Override
+	public void repositoryEntryCopied(RepositoryEntry sourceEntry, RepositoryEntry newEntry) {
+		//
+	}
+
 	public void transactionAborted() {
 		// Don't do nothing!
 	}
diff --git a/src/main/java/org/olat/ims/qti/editor/AddNewQTIDocumentController.java b/src/main/java/org/olat/ims/qti/editor/AddNewQTIDocumentController.java
index 8dc6b76f7bfe4c7443c36ccf24a984d3acddf67e..dfc1d37ba289ae19234ff0eb04f5f8e2b9a0cac6 100644
--- a/src/main/java/org/olat/ims/qti/editor/AddNewQTIDocumentController.java
+++ b/src/main/java/org/olat/ims/qti/editor/AddNewQTIDocumentController.java
@@ -129,6 +129,11 @@ public class AddNewQTIDocumentController extends DefaultController implements IA
 		tmpPackage.cleanupTmpPackageDir();
 	}
 
+	@Override
+	public void repositoryEntryCopied(RepositoryEntry sourceEntry, RepositoryEntry newEntry) {
+		//
+	}
+
 	/**
 	 * @see org.olat.repository.controllers.IAddController#transactionAborted()
 	 */
diff --git a/src/main/java/org/olat/modules/glossary/CreateNewGlossaryController.java b/src/main/java/org/olat/modules/glossary/CreateNewGlossaryController.java
index ed95d27c6e1b3e22c265cac057663517cc67c07f..686cc39e3d67a13d6170a5b02ab67f42f9f2cae4 100644
--- a/src/main/java/org/olat/modules/glossary/CreateNewGlossaryController.java
+++ b/src/main/java/org/olat/modules/glossary/CreateNewGlossaryController.java
@@ -105,6 +105,11 @@ public class CreateNewGlossaryController extends DefaultController implements IA
 		return;
 	} // nothing to do here.
 
+	@Override
+	public void repositoryEntryCopied(RepositoryEntry sourceEntry, RepositoryEntry newEntry) {
+		//
+	}
+
 	/**
 	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
 	 */
diff --git a/src/main/java/org/olat/modules/sharedfolder/CreateNewSharedFolderController.java b/src/main/java/org/olat/modules/sharedfolder/CreateNewSharedFolderController.java
index 7246a6da5e89692923268f0be4251122e78d6bb1..0c76ad279d3620582a197130814a4f4379efb342 100644
--- a/src/main/java/org/olat/modules/sharedfolder/CreateNewSharedFolderController.java
+++ b/src/main/java/org/olat/modules/sharedfolder/CreateNewSharedFolderController.java
@@ -100,6 +100,11 @@ public class CreateNewSharedFolderController extends DefaultController implement
 		return;
 	} // nothing to do here.
 
+	@Override
+	public void repositoryEntryCopied(RepositoryEntry sourceEntry, RepositoryEntry newEntry) {
+		//
+	}
+
 	/**
 	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
 	 */
diff --git a/src/main/java/org/olat/modules/webFeed/ui/blog/CreateBlogController.java b/src/main/java/org/olat/modules/webFeed/ui/blog/CreateBlogController.java
index 6670ebb34b04a4edccd3fde101bc40301fdf3522..b4b1a0dab844ba01f3752d3cecbfd9e40bbc2c7a 100644
--- a/src/main/java/org/olat/modules/webFeed/ui/blog/CreateBlogController.java
+++ b/src/main/java/org/olat/modules/webFeed/ui/blog/CreateBlogController.java
@@ -93,10 +93,15 @@ public class CreateBlogController extends DefaultController implements IAddContr
 	/**
 	 * @see org.olat.repository.controllers.IAddController#repositoryEntryCreated(org.olat.repository.RepositoryEntry)
 	 */
-	@SuppressWarnings("unused")
+	@Override
 	public void repositoryEntryCreated(RepositoryEntry re) {
 	// Nothing to do here, but thanks for asking.
 	}
+	
+	@Override
+	public void repositoryEntryCopied(RepositoryEntry sourceEntry, RepositoryEntry newEntry) {
+		//
+	}
 
 	/**
 	 * @see org.olat.repository.controllers.IAddController#transactionAborted()
diff --git a/src/main/java/org/olat/modules/webFeed/ui/podcast/CreatePodcastController.java b/src/main/java/org/olat/modules/webFeed/ui/podcast/CreatePodcastController.java
index 0d34690fe22633abfd4830d30fd56af88b790613..f281c26373155b30ff7cd828c6881d5174e5871b 100644
--- a/src/main/java/org/olat/modules/webFeed/ui/podcast/CreatePodcastController.java
+++ b/src/main/java/org/olat/modules/webFeed/ui/podcast/CreatePodcastController.java
@@ -93,10 +93,15 @@ public class CreatePodcastController extends DefaultController implements IAddCo
 	/**
 	 * @see org.olat.repository.controllers.IAddController#repositoryEntryCreated(org.olat.repository.RepositoryEntry)
 	 */
-	@SuppressWarnings("unused")
+	@Override
 	public void repositoryEntryCreated(RepositoryEntry re) {
 	// Nothing to do here, but thanks for asking.
 	}
+	
+	@Override
+	public void repositoryEntryCopied(RepositoryEntry sourceEntry, RepositoryEntry newEntry) {
+		//
+	}
 
 	/**
 	 * @see org.olat.repository.controllers.IAddController#transactionAborted()
diff --git a/src/main/java/org/olat/portfolio/ui/CreateStructureMapTemplateController.java b/src/main/java/org/olat/portfolio/ui/CreateStructureMapTemplateController.java
index 4e71be748134b408425eb4c03dc47e141ed5be9f..987a8606eef1c19657d32106d2379d55d68b5bec 100644
--- a/src/main/java/org/olat/portfolio/ui/CreateStructureMapTemplateController.java
+++ b/src/main/java/org/olat/portfolio/ui/CreateStructureMapTemplateController.java
@@ -85,7 +85,6 @@ public class CreateStructureMapTemplateController extends BasicController implem
 	 *      org.olat.core.gui.control.Event)
 	 */
 	@Override
-	@SuppressWarnings("unused")
 	protected void event(UserRequest ureq, Component source, Event event) {
 		// Nothing to catch
 	}
@@ -111,6 +110,11 @@ public class CreateStructureMapTemplateController extends BasicController implem
 			ePFMgr.createAndPersistPortfolioPage(mapTemp, title, description);
 		}
 	}
+	
+	@Override
+	public void repositoryEntryCopied(RepositoryEntry sourceEntry, RepositoryEntry newEntry) {
+		//
+	}
 
 	/**
 	 * @see org.olat.repository.controllers.IAddController#transactionAborted()
diff --git a/src/main/java/org/olat/repository/controllers/AddFileResourceController.java b/src/main/java/org/olat/repository/controllers/AddFileResourceController.java
index ecbef0f64008228c52497ddf99485cb5bcdb3d40..a091c8aefc36f81fc25443b834e31b44ded4cf8b 100644
--- a/src/main/java/org/olat/repository/controllers/AddFileResourceController.java
+++ b/src/main/java/org/olat/repository/controllers/AddFileResourceController.java
@@ -261,7 +261,12 @@ public class AddFileResourceController extends BasicController implements IAddCo
 		// nothing to do here.
 		return;
 	}
-	
+
+	@Override
+	public void repositoryEntryCopied(RepositoryEntry sourceEntry, RepositoryEntry newEntry) {
+		// nothing to do here.
+	}
+
 	/**
 	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
 	 */
diff --git a/src/main/java/org/olat/repository/controllers/IAddController.java b/src/main/java/org/olat/repository/controllers/IAddController.java
index 543fd8829bb4ab17e999c9f854300c0c3d12e932..8163b3eccfa4a731c0171ad9429d9be1f42c01db 100644
--- a/src/main/java/org/olat/repository/controllers/IAddController.java
+++ b/src/main/java/org/olat/repository/controllers/IAddController.java
@@ -61,6 +61,13 @@ public interface IAddController extends Disposable {
 	 */
 	public void repositoryEntryCreated(RepositoryEntry re);
 	
+	/**
+	 * Called only if the repository entry is copied
+	 * @param sourceEntry The source of the copy, the original
+	 * @param newEntry The new repository entry
+	 */
+	public void repositoryEntryCopied(RepositoryEntry sourceEntry, RepositoryEntry newEntry);
+	
 	/**
 	 * Called if the repository aborts the transaction. Do any cleanup work.
 	 */
diff --git a/src/main/java/org/olat/repository/controllers/RepositoryCopyController.java b/src/main/java/org/olat/repository/controllers/RepositoryCopyController.java
index 53b0dc4bc87262dac9115a1676eb91585c0a8027..d21ea17b6058c826685a56d3ded2a7e50979ac9c 100644
--- a/src/main/java/org/olat/repository/controllers/RepositoryCopyController.java
+++ b/src/main/java/org/olat/repository/controllers/RepositoryCopyController.java
@@ -145,6 +145,7 @@ public class RepositoryCopyController extends BasicController {
 			RepositoryHandler typeToCopy = RepositoryHandlerFactory.getInstance().getRepositoryHandler(sourceEntry);			
 			IAddController addController = typeToCopy.createAddController(null, null, ureq, getWindowControl());
 			addController.repositoryEntryCreated(newEntry);
+			addController.repositoryEntryCopied(sourceEntry, newEntry);
 			// dispose immediately (cleanup temp files), not really used 
 			// as a controller, should be in a business logic frontend manager instead!
 			addController.dispose();
diff --git a/src/main/java/org/olat/repository/handlers/WikiCreateController.java b/src/main/java/org/olat/repository/handlers/WikiCreateController.java
index 9aeeab130779382006723d9c135994e2d5dcb1b4..8217e54ef558646401c430bcebb1cd487d495bf9 100644
--- a/src/main/java/org/olat/repository/handlers/WikiCreateController.java
+++ b/src/main/java/org/olat/repository/handlers/WikiCreateController.java
@@ -101,6 +101,11 @@ public class WikiCreateController extends DefaultController implements IAddContr
 	public void repositoryEntryCreated(RepositoryEntry re) {
 	//
 	}
+	
+	@Override
+	public void repositoryEntryCopied(RepositoryEntry sourceEntry, RepositoryEntry newEntry) {
+		//
+	}
 
 	/**
 	 * @see org.olat.repository.controllers.IAddController#transactionAborted()