diff --git a/src/main/java/org/olat/course/CourseFactory.java b/src/main/java/org/olat/course/CourseFactory.java
index 91ce41db3935075d7121d0b2ee2be3dc0ccc6f1d..1ecc6c05430b76b29370a62144daeb32b83b716f 100644
--- a/src/main/java/org/olat/course/CourseFactory.java
+++ b/src/main/java/org/olat/course/CourseFactory.java
@@ -522,22 +522,23 @@ public class CourseFactory extends BasicManager {
 	 * @param fTargetZIP
 	 * @return true if successfully exported, false otherwise.
 	 */
-	public static void exportCourseToZIP(OLATResourceable sourceRes, File fTargetZIP, boolean backwardsCompatible) {
+	public static void exportCourseToZIP(OLATResourceable sourceRes, File fTargetZIP, boolean runtimeDatas, boolean backwardsCompatible) {
 		PersistingCourseImpl sourceCourse = (PersistingCourseImpl) loadCourse(sourceRes);
 
 		// add files to ZIP
 		File fExportDir = new File(WebappHelper.getTmpDir(), CodeHelper.getUniqueID());
 		fExportDir.mkdirs();
+		log.info("Export folder: " + fExportDir);
 		synchronized (sourceCourse) { //o_clusterNOK - cannot be solved with doInSync since could take too long (leads to error: "Lock wait timeout exceeded")
 			OLATResource courseResource = sourceCourse.getCourseEnvironment().getCourseGroupManager().getCourseResource();
-			sourceCourse.exportToFilesystem(courseResource, fExportDir, backwardsCompatible);
-			Codepoint.codepoint(CourseFactory.class, "longExportCourseToZIP");
+			sourceCourse.exportToFilesystem(courseResource, fExportDir, runtimeDatas, backwardsCompatible);
 			Set<String> fileSet = new HashSet<String>();
 			String[] files = fExportDir.list();
 			for (int i = 0; i < files.length; i++) {
 				fileSet.add(files[i]);
 			}
 			ZipUtil.zip(fileSet, fExportDir, fTargetZIP, false);
+			log.info("Delete export folder: " + fExportDir);
 			FileUtils.deleteDirsAndFiles(fExportDir, true, true);
 		}
 	}
@@ -1176,9 +1177,9 @@ public class CourseFactory extends BasicManager {
 		int numOfChildren = node.getChildCount();
 		for (int i = 0; i < numOfChildren; i++) {
 			INode child = node.getChildAt(i);
-			if (child instanceof TreeNode) {
+			if (child instanceof TreeNode && publishTreeModel.isVisible(child)) {
 				nodeToPublish.add(child.getIdent());
-				visitPublishModel((TreeNode) child, publishTreeModel, nodeToPublish);
+				visitPublishModel((TreeNode)child, publishTreeModel, nodeToPublish);
 			}
 		}
 	}
diff --git a/src/main/java/org/olat/course/ICourse.java b/src/main/java/org/olat/course/ICourse.java
index 2be794bc4e101f0258726f2f385bdec4b3b313bb..bb0e53b718dcd2dacae0ada27cd3157b5ba0cbce 100644
--- a/src/main/java/org/olat/course/ICourse.java
+++ b/src/main/java/org/olat/course/ICourse.java
@@ -63,9 +63,14 @@ public interface ICourse extends OLATResourceable {
 		
 	/**
 	 * Export course to file system.
-	 * @param exportDirecotry The directory to export files to.
+	 * @param originalCourseResource The original resource
+	 * @param exportDirectory The directory to export files to.
+	 * @param runtimeDatas Export with runtime datas (true add archives of the groups...)
+	 * @param backwardsCompatible Export in a format compatible with older OpenOLAT version
+	 * @param foldersToCleanup Can add there folders which need to be clean up after the export
 	 */
-	public void exportToFilesystem(OLATResource originalCourseResource, File exportDirecotry, boolean backwardsCompatible);
+	public void exportToFilesystem(OLATResource originalCourseResource, File exportDirectory,
+			boolean runtimeDatas, boolean backwardsCompatible);
 	
 	public void postImport(CourseEnvironmentMapper envMapper);
 	
diff --git a/src/main/java/org/olat/course/PersistingCourseImpl.java b/src/main/java/org/olat/course/PersistingCourseImpl.java
index 3a6cf370e7a2f7ddf547e5d346735508222cc0bb..253946a3aad90dd2b38212cb93574a5c7f0494a1 100644
--- a/src/main/java/org/olat/course/PersistingCourseImpl.java
+++ b/src/main/java/org/olat/course/PersistingCourseImpl.java
@@ -243,7 +243,9 @@ public class PersistingCourseImpl implements ICourse, OLATResourceable, Serializ
 	 * See OLAT-5368: Course Export can take longer than say 2min.
 	 * <p>
 	 */
-	public void exportToFilesystem(OLATResource originalCourseResource, File exportDirectory, boolean backwardsCompatible) {
+	@Override
+	public void exportToFilesystem(OLATResource originalCourseResource, File exportDirectory,
+			boolean runtimeDatas, boolean backwardsCompatible) {
 		long s = System.currentTimeMillis();
 		log.info("exportToFilesystem: exporting course "+this+" to "+exportDirectory+"...");
 		File fCourseBase = getCourseBaseContainer().getBasefile();
@@ -260,7 +262,7 @@ public class PersistingCourseImpl implements ICourse, OLATResourceable, Serializ
 			//prevents duplicate names
 			envMapper.avoidDuplicateNames();
 		}
-		PersistingCourseGroupManager.getInstance(this).exportCourseBusinessGroups(fExportedDataDir, envMapper, backwardsCompatible);
+		PersistingCourseGroupManager.getInstance(this).exportCourseBusinessGroups(fExportedDataDir, envMapper, runtimeDatas, backwardsCompatible);
 		if(backwardsCompatible) {
 			XStream xstream = CourseXStreamAliases.getReadCourseXStream();
 
diff --git a/src/main/java/org/olat/course/condition/AreaSelectionController.java b/src/main/java/org/olat/course/condition/AreaSelectionController.java
index 62af84a49923a7a9376ffdc8c99b6c9bb48648e4..8c52828e3c22035ec2909bc65b3fe03b970c6a8b 100644
--- a/src/main/java/org/olat/course/condition/AreaSelectionController.java
+++ b/src/main/java/org/olat/course/condition/AreaSelectionController.java
@@ -62,15 +62,16 @@ public class AreaSelectionController extends FormBasicController {
 	private final CourseGroupManager courseGrpMngr;
 	private NewAreaController areaCreateCntrllr;
 	private CloseableModalController cmc;
-	
+	private final boolean createEnable;
 
 	private String[] areaNames;
 	private String[] areaKeys;
 
 	public AreaSelectionController(UserRequest ureq, WindowControl wControl, String title,
-			CourseGroupManager courseGrpMngr, List<Long> selectionKeys) {
+			boolean allowCreate, CourseGroupManager courseGrpMngr, List<Long> selectionKeys) {
 		super(ureq, wControl, "group_or_area_selection");
 		this.courseGrpMngr = courseGrpMngr;
+		this.createEnable = allowCreate;
 
 		loadNamesAndKeys();
 		initForm(ureq);
@@ -128,14 +129,17 @@ public class AreaSelectionController extends FormBasicController {
 
 	@Override
 	protected void initForm(FormItemContainer boundTo, Controller listener, UserRequest ureq) {
-		// easy creation only possible if a default group context available
-		createNew = new FormLinkImpl("create");
-		//is a button
-		createNew.setCustomEnabledLinkCSS("b_button");
-		createNew.setCustomDisabledLinkCSS("b_button b_disabled");
-		// create new group/area on the right side
-		boundTo.add(createNew);
+		if(createEnable) {
+			// easy creation only possible if a default group context available
+			createNew = new FormLinkImpl("create");
+			//is a button
+			createNew.setCustomEnabledLinkCSS("b_button");
+			createNew.setCustomDisabledLinkCSS("b_button b_disabled");
+			// create new group/area on the right side
+			boundTo.add(createNew);
+		}
 
+		
 		entrySelector = uifactory.addCheckboxesVertical("entries",  null, boundTo, areaKeys, areaNames, null, 1);
 		// submitCancel after checkboxes
 		//
diff --git a/src/main/java/org/olat/course/condition/ConditionConfigEasyController.java b/src/main/java/org/olat/course/condition/ConditionConfigEasyController.java
index b4a55a1167f1c14494389605a2230222d6be5788..51d35da8fb0ddf8031e47bc2427661c733551556 100644
--- a/src/main/java/org/olat/course/condition/ConditionConfigEasyController.java
+++ b/src/main/java/org/olat/course/condition/ConditionConfigEasyController.java
@@ -331,7 +331,7 @@ public class ConditionConfigEasyController extends FormBasicController implement
 			removeAsListenerAndDispose(groupChooseC);
 			
 			List<Long> groupKeys = getKeys(easyGroupList);
-			groupChooseC = new GroupSelectionController(ureq, getWindowControl(), "group",
+			groupChooseC = new GroupSelectionController(ureq, getWindowControl(), "group", true,
 					courseEditorEnv.getCourseGroupManager(), groupKeys);
 			listenTo(groupChooseC);
 
@@ -355,7 +355,7 @@ public class ConditionConfigEasyController extends FormBasicController implement
 			removeAsListenerAndDispose(cmc);
 			removeAsListenerAndDispose(areaChooseC);
 			
-			areaChooseC = new AreaSelectionController(ureq, getWindowControl(), "area",
+			areaChooseC = new AreaSelectionController(ureq, getWindowControl(), "area", true,
 					courseEditorEnv.getCourseGroupManager(), getKeys(easyAreaList));
 			listenTo(areaChooseC);
 			
diff --git a/src/main/java/org/olat/course/condition/GroupSelectionController.java b/src/main/java/org/olat/course/condition/GroupSelectionController.java
index d157d6a1215462be4f6f36c3ca5836c12a289357..70ade8464da93d5c97d649cb022065073a51609c 100644
--- a/src/main/java/org/olat/course/condition/GroupSelectionController.java
+++ b/src/main/java/org/olat/course/condition/GroupSelectionController.java
@@ -69,12 +69,12 @@ public class GroupSelectionController extends FormBasicController {
 	private boolean createEnable;
 
 	public GroupSelectionController(UserRequest ureq, WindowControl wControl, String title,
-			CourseGroupManager courseGrpMngr, List<Long> selectionKeys) {
+			boolean allowCreate, CourseGroupManager courseGrpMngr, List<Long> selectionKeys) {
 		super(ureq, wControl, "group_or_area_selection");
 		this.courseGrpMngr = courseGrpMngr;
 
 		RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(courseGrpMngr.getCourseResource(), false);
-		createEnable = !RepositoryEntryManagedFlag.isManaged(re, RepositoryEntryManagedFlag.groups);
+		createEnable = allowCreate && !RepositoryEntryManagedFlag.isManaged(re, RepositoryEntryManagedFlag.groups);
 		// unique names from list to array
 		loadNamesAndKeys();
 		initForm(ureq);
diff --git a/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java b/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java
index ac6a05bc51f2906a9d68fc28a49271fc9c069303..99041d1780e76769898ea34c9792adba8601ebf8 100644
--- a/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java
+++ b/src/main/java/org/olat/course/groupsandrights/CourseGroupManager.java
@@ -191,7 +191,8 @@ public interface CourseGroupManager {
 	 * 
 	 * @param fExportDirectory
 	 */
-	public void exportCourseBusinessGroups(File fExportDirectory, CourseEnvironmentMapper env, boolean backwardsCompatible);
+	public void exportCourseBusinessGroups(File fExportDirectory, CourseEnvironmentMapper env,
+			boolean runtimeDatas, boolean backwardsCompatible);
 
 	/**
 	 * Import course internal groups fa previous export.
diff --git a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java
index 16f84d6ccbdff68292417b550fb80d9a0ca8562f..b7396c45ee2ca47f67c8a2b50db4857989b9fdb3 100644
--- a/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java
+++ b/src/main/java/org/olat/course/groupsandrights/PersistingCourseGroupManager.java
@@ -320,7 +320,8 @@ public class PersistingCourseGroupManager extends BasicManager implements Course
 	 * @see org.olat.course.groupsandrights.CourseGroupManager#exportCourseBusinessGroups(java.io.File)
 	 */
 	@Override
-	public void exportCourseBusinessGroups(File fExportDirectory, CourseEnvironmentMapper courseEnv, boolean backwardsCompatible) {
+	public void exportCourseBusinessGroups(File fExportDirectory, CourseEnvironmentMapper courseEnv,
+			boolean runtimeDatas, boolean backwardsCompatible) {
 		File fExportFile = new File(fExportDirectory, LEARNINGGROUPEXPORT_XML);
 		List<BGArea> areas = getAllAreas();
 		List<BusinessGroup> groups = getAllBusinessGroups();
@@ -328,7 +329,7 @@ public class PersistingCourseGroupManager extends BasicManager implements Course
 		BusinessGroupEnvironment bgEnv = new BusinessGroupEnvironment();
 		bgEnv.getGroups().addAll(courseEnv.getGroups());
 		bgEnv.getAreas().addAll(courseEnv.getAreas());
-		businessGroupService.exportGroups(groups, areas, fExportFile, bgEnv, backwardsCompatible);
+		businessGroupService.exportGroups(groups, areas, fExportFile, bgEnv, runtimeDatas, backwardsCompatible);
 	}
 	
 	/**
diff --git a/src/main/java/org/olat/course/nodes/co/COConfigForm.java b/src/main/java/org/olat/course/nodes/co/COConfigForm.java
index ed595657dee871547fb1143b33dd86d50beff4ac..50a2e368a4a730b851371e28c0c5477592056709 100644
--- a/src/main/java/org/olat/course/nodes/co/COConfigForm.java
+++ b/src/main/java/org/olat/course/nodes/co/COConfigForm.java
@@ -577,7 +577,7 @@ public class COConfigForm extends FormBasicController {
 			removeAsListenerAndDispose(cmc);
 			removeAsListenerAndDispose(groupChooseC);
 			
-			groupChooseC = new GroupSelectionController(ureq, getWindowControl(), "group",
+			groupChooseC = new GroupSelectionController(ureq, getWindowControl(), "group", true,
 					cev.getCourseGroupManager(), getKeys(easyGroupList));
 			listenTo(groupChooseC);
 
@@ -603,7 +603,7 @@ public class COConfigForm extends FormBasicController {
 			removeAsListenerAndDispose(cmc);
 			removeAsListenerAndDispose(areaChooseC);
 			
-			areaChooseC = new AreaSelectionController (ureq, getWindowControl(), "area",
+			areaChooseC = new AreaSelectionController (ureq, getWindowControl(), "area", true,
 					cev.getCourseGroupManager(), getKeys(easyAreaList));
 			listenTo(areaChooseC);
 
diff --git a/src/main/java/org/olat/course/nodes/en/ENEditGroupAreaFormController.java b/src/main/java/org/olat/course/nodes/en/ENEditGroupAreaFormController.java
index 7edb815089249b265c525a04b5d2e4a6e132fdab..08d1b5e70d9d58473f896fc97315701e238be3dd 100644
--- a/src/main/java/org/olat/course/nodes/en/ENEditGroupAreaFormController.java
+++ b/src/main/java/org/olat/course/nodes/en/ENEditGroupAreaFormController.java
@@ -395,7 +395,7 @@ class ENEditGroupAreaFormController extends FormBasicController implements Gener
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if (source == chooseGroupsLink) {
 			removeAsListenerAndDispose(groupChooseC);
-			groupChooseC = new GroupSelectionController(ureq, getWindowControl(), "group",
+			groupChooseC = new GroupSelectionController(ureq, getWindowControl(), "group", true,
 					cev.getCourseGroupManager(), getKeys(easyGroupList));
 			listenTo(groupChooseC);
 
@@ -428,7 +428,7 @@ class ENEditGroupAreaFormController extends FormBasicController implements Gener
 			removeAsListenerAndDispose(areaChooseC);
 
 			// already areas -> choose areas
-			areaChooseC = new AreaSelectionController (ureq, getWindowControl() , "area",
+			areaChooseC = new AreaSelectionController (ureq, getWindowControl() , "area", true,
 					cev.getCourseGroupManager(), getKeys(easyAreaList));
 			listenTo(areaChooseC);
 
diff --git a/src/main/java/org/olat/course/repository/CreateNewCourseController.java b/src/main/java/org/olat/course/repository/CreateNewCourseController.java
index 012ce472cf88f5051dda738dc1841d384cf62e90..8c4c80fa9df1e581aa7e57fc082c14439b944d39 100644
--- a/src/main/java/org/olat/course/repository/CreateNewCourseController.java
+++ b/src/main/java/org/olat/course/repository/CreateNewCourseController.java
@@ -166,7 +166,7 @@ public class CreateNewCourseController extends BasicController implements IAddCo
 		
 		File fExportDir = new File(WebappHelper.getTmpDir(), UUID.randomUUID().toString());
 		fExportDir.mkdirs();
-		sourceCgm.exportCourseBusinessGroups(fExportDir, env, false);
+		sourceCgm.exportCourseBusinessGroups(fExportDir, env, false, false);
 
 		course = CourseFactory.loadCourse(newEntry.getOlatResource().getResourceableId());
 		CourseGroupManager cgm = course.getCourseEnvironment().getCourseGroupManager();
diff --git a/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java b/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java
index 028e3d8d6cb3e9d34dd9eb7fb82fa1cc556d0b2d..d7f6f756cec0cc6273df26be9223573b9559d097 100644
--- a/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java
+++ b/src/main/java/org/olat/course/run/preview/PreviewCourseGroupManager.java
@@ -276,7 +276,8 @@ final class PreviewCourseGroupManager extends BasicManager implements CourseGrou
 	}
 
 	@Override
-	public void exportCourseBusinessGroups(File fExportDirectory, CourseEnvironmentMapper env, boolean backwardsCompatible) {
+	public void exportCourseBusinessGroups(File fExportDirectory, CourseEnvironmentMapper env,
+			boolean runtimeDatas, boolean backwardsCompatible) {
 		throw new AssertException("unsupported");
 	}
 
diff --git a/src/main/java/org/olat/course/run/preview/PreviewSettingsForm.java b/src/main/java/org/olat/course/run/preview/PreviewSettingsForm.java
index 555c59aed5388ecfe72abaf06f10a61ca520a1c5..b04b357351bd13925afc4020892ad1558ed600f3 100644
--- a/src/main/java/org/olat/course/run/preview/PreviewSettingsForm.java
+++ b/src/main/java/org/olat/course/run/preview/PreviewSettingsForm.java
@@ -201,7 +201,7 @@ public class PreviewSettingsForm extends FormBasicController {
 			removeAsListenerAndDispose(cmc);
 			removeAsListenerAndDispose (groupChooser);
 			
-			groupChooser = new GroupSelectionController(ureq, getWindowControl(), "group", courseGroupManager, getKeys(group));
+			groupChooser = new GroupSelectionController(ureq, getWindowControl(), "group", false, courseGroupManager, getKeys(group));
 			listenTo(groupChooser);	
 			cmc = new CloseableModalController(getWindowControl(), translate("close"), groupChooser.getInitialComponent());
 			listenTo(cmc);
@@ -210,7 +210,7 @@ public class PreviewSettingsForm extends FormBasicController {
 			removeAsListenerAndDispose(cmc);
 			removeAsListenerAndDispose (areaChooser);
 			
-			areaChooser = new AreaSelectionController(ureq, getWindowControl(), "area", courseGroupManager, getKeys(area));
+			areaChooser = new AreaSelectionController(ureq, getWindowControl(), "area", false, courseGroupManager, getKeys(area));
 			listenTo(areaChooser);
 			cmc = new CloseableModalController(getWindowControl(), translate("close"), areaChooser.getInitialComponent());
 			listenTo(cmc);
@@ -221,15 +221,33 @@ public class PreviewSettingsForm extends FormBasicController {
 	@Override
 	protected void event(UserRequest ureq, Controller source, Event event) {
 		if (source == groupChooser) {
+			if(Event.DONE_EVENT == event) {
+				group.setValue(StringHelper.formatAsCSVString(groupChooser.getSelectedNames()));
+				group.setUserObject(groupChooser.getSelectedKeys());
+			}
 			cmc.deactivate();
-			group.setValue(StringHelper.formatAsCSVString(groupChooser.getSelectedNames()));
-			group.setUserObject(groupChooser.getSelectedKeys());
+			cleanUp();
 		} else if (source == areaChooser) {
+			if(Event.DONE_EVENT == event) {
+				area.setValue(StringHelper.formatAsCSVString(areaChooser.getSelectedNames()));
+				area.setUserObject(areaChooser.getSelectedKeys());
+			}
 			cmc.deactivate();
-			area.setValue(StringHelper.formatAsCSVString(areaChooser.getSelectedNames()));
-			area.setUserObject(areaChooser.getSelectedKeys());
+			cleanUp();
+		} else if(source == cmc) {
+			cleanUp();
 		}
 	}
+	
+	private void cleanUp() {
+		removeAsListenerAndDispose(cmc);
+		removeAsListenerAndDispose(groupChooser);
+		removeAsListenerAndDispose(areaChooser);
+		cmc = null;
+		groupChooser = null;
+		areaChooser = null;
+	}
+	
 	@Override
 	protected void doDispose() {
 		//
diff --git a/src/main/java/org/olat/group/BusinessGroupService.java b/src/main/java/org/olat/group/BusinessGroupService.java
index 3575fb9e7ef1c2ac536fbdfc8c4d536d129139f4..1ebd023389fb05ef212ab753a63acfe309728c66 100644
--- a/src/main/java/org/olat/group/BusinessGroupService.java
+++ b/src/main/java/org/olat/group/BusinessGroupService.java
@@ -548,7 +548,8 @@ public interface BusinessGroupService {
 	 * @param groups
 	 * @param fExportFile
 	 */
-	public void exportGroups(List<BusinessGroup> groups, List<BGArea> areas, File fExportFile, BusinessGroupEnvironment env, boolean backwardsCompatible);
+	public void exportGroups(List<BusinessGroup> groups, List<BGArea> areas, File fExportFile, BusinessGroupEnvironment env,
+			boolean runtimeDatas, boolean backwardsCompatible);
 
 	/**
 	 * Import previously exported group definitions.
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupImportExport.java b/src/main/java/org/olat/group/manager/BusinessGroupImportExport.java
index 39d53ff3ab725a1f76bb661f8e3dec6924fd87b0..d8edbc957648ab2db7ee7f7e8a13e148f9899992 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupImportExport.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupImportExport.java
@@ -75,7 +75,8 @@ public class BusinessGroupImportExport {
 	private BusinessGroupModule groupModule;
 	
 	
-	public void exportGroups(List<BusinessGroup> groups, List<BGArea> areas, File fExportFile, BusinessGroupEnvironment env, boolean backwardsCompatible) {
+	public void exportGroups(List<BusinessGroup> groups, List<BGArea> areas, File fExportFile,
+			BusinessGroupEnvironment env, boolean runtimeDatas, boolean backwardsCompatible) {
 		if (groups == null || groups.isEmpty()) {
 			return; // nothing to do... says Florian.
 		}
@@ -106,22 +107,14 @@ public class BusinessGroupImportExport {
 			if(backwardsCompatible && env != null) {
 				groupName = env.getGroupName(group.getKey());
 			}
-			Group newGroup = exportGroup(fExportFile, group, groupName, backwardsCompatible);
+			Group newGroup = exportGroup(fExportFile, group, groupName, runtimeDatas, backwardsCompatible);
 			root.getGroups().getGroups().add(newGroup);
 		}
 		saveGroupConfiguration(fExportFile, root);
 	}
 	
-	public void exportGroup(BusinessGroup group, File fExportFile, boolean backwardsCompatible) {
-		OLATGroupExport root = new OLATGroupExport();
-		Group newGroup = exportGroup(fExportFile, group, null, backwardsCompatible);
-		root.setGroups(new GroupCollection());
-		root.getGroups().setGroups(new ArrayList<Group>());
-		root.getGroups().getGroups().add(newGroup);
-		saveGroupConfiguration(fExportFile, root);
-	}
-	
-	private Group exportGroup(File fExportFile, BusinessGroup group, String groupName, boolean backwardsCompatible) {
+	private Group exportGroup(File fExportFile, BusinessGroup group, String groupName,
+			boolean runtimeDatas, boolean backwardsCompatible) {
 		Group newGroup = new Group();
 		newGroup.key = backwardsCompatible ? null : group.getKey();
 		newGroup.name = StringHelper.containsNonWhitespace(groupName) ? groupName : group.getName();
@@ -169,7 +162,9 @@ public class BusinessGroupImportExport {
 		}
 
 		log.debug("fExportFile.getParent()=" + fExportFile.getParent());
-		ct.archive(fExportFile.getParent());
+		if(runtimeDatas) {
+			ct.archive(fExportFile.getParent());
+		}
 		// export membership
 		List<BGArea> bgAreas = areaManager.findBGAreasOfBusinessGroup(group);
 		newGroup.areaRelations = new ArrayList<String>();
diff --git a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
index cbf66ec9ac8824bfaf15e59a21bc1b1e4542b6e1..16c05a2852bfe8a4ab2ab340536e65304674db32 100644
--- a/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
+++ b/src/main/java/org/olat/group/manager/BusinessGroupServiceImpl.java
@@ -1715,8 +1715,8 @@ public class BusinessGroupServiceImpl implements BusinessGroupService, UserDataD
 	
 	@Override
 	public void exportGroups(List<BusinessGroup> groups, List<BGArea> areas, File fExportFile,
-			BusinessGroupEnvironment env, boolean backwardsCompatible) {
-		businessGroupImportExport.exportGroups(groups, areas, fExportFile, env, backwardsCompatible);
+			BusinessGroupEnvironment env, boolean runtimeDatas, boolean backwardsCompatible) {
+		businessGroupImportExport.exportGroups(groups, areas, fExportFile, env, runtimeDatas, backwardsCompatible);
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java b/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java
index 37dbeda54c494bec9ddd11947af93452cbb85977..f80f8e911ed935061cd8bb8c00c6dce16be8f3d4 100644
--- a/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java
+++ b/src/main/java/org/olat/modules/qpool/manager/QuestionItemDAO.java
@@ -336,9 +336,8 @@ public class QuestionItemDAO {
 	
 	public int countFavoritItems(SearchQuestionItemParams params) {
 		StringBuilder sb = new StringBuilder();
-		sb.append("select count(item) from questionitem item")
-		  .append(" where item.markCreatorKey=:identityKey")
-		  .append(" )");
+		sb.append("select count(item) from qitemview item")
+		  .append(" where item.markCreatorKey=:identityKey");
 		if(StringHelper.containsNonWhitespace(params.getFormat())) {
 			sb.append(" and item.format=:format");
 		}
diff --git a/src/main/java/org/olat/repository/handlers/CourseHandler.java b/src/main/java/org/olat/repository/handlers/CourseHandler.java
index c2f8ea6b615d7696a6b78e40eed661fb73975d1b..259f368201e51a1341171dc153f33a9b4340ce32 100644
--- a/src/main/java/org/olat/repository/handlers/CourseHandler.java
+++ b/src/main/java/org/olat/repository/handlers/CourseHandler.java
@@ -156,7 +156,7 @@ public class CourseHandler implements RepositoryHandler {
 		RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(res, true);
 		String exportFileName = StringHelper.transformDisplayNameToFileSystemName(re.getDisplayname()) + ".zip";
 		File fExportZIP = new File(WebappHelper.getTmpDir(), exportFileName);
-		CourseFactory.exportCourseToZIP(res, fExportZIP, backwardsCompatible);
+		CourseFactory.exportCourseToZIP(res, fExportZIP, false, backwardsCompatible);
 		return new CleanupAfterDeliveryFileMediaResource(fExportZIP);
 	}
 
@@ -273,7 +273,7 @@ public class CourseHandler implements RepositoryHandler {
 		// Archive course run structure (like course export)
 		String courseExportFileName = "course_export.zip";
 		File courseExportZIP = new File(tmpExportDir, courseExportFileName);
-		CourseFactory.exportCourseToZIP(entry.getOlatResource(), courseExportZIP, false);
+		CourseFactory.exportCourseToZIP(entry.getOlatResource(), courseExportZIP, true, false);
 		// Zip runtime data and course run structure data into one zip-file
 		String completeArchiveFileName = "del_course_" + entry.getOlatResource().getResourceableId() + ".zip";
 		String completeArchivePath = archivFilePath + File.separator + completeArchiveFileName;
diff --git a/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java b/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java
index 2e6597629d0db15feacfbdfb05f4069d2cbe22c9..b29de9a9c4e1dec7e9f1c4898f54c858fe1a13f3 100644
--- a/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/AbstractCourseNodeWebService.java
@@ -33,6 +33,7 @@ import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
+import org.olat.core.gui.components.tree.TreeNode;
 import org.olat.core.id.Identity;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
@@ -205,6 +206,7 @@ public abstract class AbstractCourseNodeWebService {
 
 		ICourse course = editSession.getCourse();
 		
+		TreeNode updateEditorNode = course.getEditorTreeModel().getNodeById(nodeId);
 		CourseNode updatedNode = course.getEditorTreeModel().getCourseNode(nodeId);
 		if(StringHelper.containsNonWhitespace(shortTitle)) {
 			updatedNode.setShortTitle(shortTitle);
@@ -230,7 +232,7 @@ public abstract class AbstractCourseNodeWebService {
 			ModuleConfiguration moduleConfig = updatedNode.getModuleConfiguration();
 			delegateConfig.configure(course, updatedNode, moduleConfig);
 		}
-		course.getEditorTreeModel().nodeConfigChanged(updatedNode);		
+		course.getEditorTreeModel().nodeConfigChanged(updateEditorNode);		
 		CourseEditorTreeNode editorNode = course.getEditorTreeModel().getCourseEditorNodeContaining(updatedNode);
 		CourseNodeVO vo = get(updatedNode);
 		vo.setParentId(editorNode.getParent() == null ? null: editorNode.getParent().getIdent());
diff --git a/src/test/java/org/olat/restapi/CoursePublishTest.java b/src/test/java/org/olat/restapi/CoursePublishTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..1900aab04ddf717048536e19c54cfb0832d69b00
--- /dev/null
+++ b/src/test/java/org/olat/restapi/CoursePublishTest.java
@@ -0,0 +1,128 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.restapi;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.UUID;
+
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriBuilder;
+
+import junit.framework.Assert;
+
+import org.apache.http.HttpEntity;
+import org.apache.http.HttpResponse;
+import org.apache.http.client.methods.HttpGet;
+import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.mime.HttpMultipartMode;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.util.EntityUtils;
+import org.junit.Test;
+import org.olat.core.commons.persistence.DB;
+import org.olat.course.CourseFactory;
+import org.olat.course.ICourse;
+import org.olat.course.nodes.CourseNode;
+import org.olat.repository.RepositoryEntry;
+import org.olat.restapi.support.vo.CourseVO;
+import org.olat.test.OlatJerseyTestCase;
+import org.springframework.beans.factory.annotation.Autowired;
+
+/**
+ * Test the publish process via REST API
+ * 
+ * Initial date: 06.11.2013<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class CoursePublishTest extends OlatJerseyTestCase {	
+	
+	@Autowired
+	private DB dbInstance;
+	
+	@Test
+	public void testGetCourse() throws IOException, URISyntaxException {
+		RestConnection conn = new RestConnection();
+		assertTrue(conn.login("administrator", "openolat"));
+		
+		//deploy a test course
+		URL courseWithForumsUrl = CoursePublishTest.class.getResource("myCourseWS.zip");
+		Assert.assertNotNull(courseWithForumsUrl);
+		File courseWithForums = new File(courseWithForumsUrl.toURI());
+		String softKey = UUID.randomUUID().toString().replace("-", "").substring(0, 30);
+		RepositoryEntry re = CourseFactory.deployCourseFromZIP(courseWithForums, "administrator", softKey, 4);	
+		Assert.assertNotNull(re);
+		ICourse course = CourseFactory.loadCourse(re.getOlatResource().getResourceableId());
+		CourseNode rootNode = course.getRunStructure().getRootNode();
+		Assert.assertEquals(2, rootNode.getChildCount());
+		
+		dbInstance.commitAndCloseSession();
+		
+		//get the course 
+		URI uri = conn.getContextURI().path("repo").path("courses").path(course.getResourceableId().toString()).build();
+		HttpGet method = conn.createGet(uri, MediaType.APPLICATION_JSON, true);
+		HttpResponse response = conn.execute(method);
+		assertEquals(200, response.getStatusLine().getStatusCode());
+		CourseVO courseVo = conn.parse(response, CourseVO.class);
+		Assert.assertNotNull(courseVo);
+		
+		//update the root node
+		URI rootUri = getElementsUri(courseVo).path("structure").path(courseVo.getEditorRootNodeId()).build();
+		HttpPost updateMethod = conn.createPost(rootUri, MediaType.APPLICATION_JSON);
+		HttpEntity entity = MultipartEntityBuilder.create()
+				.setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
+				.addTextBody("shortTitle", "Change it short")
+				.addTextBody("longTitle", "Change it long")
+				.build();
+		updateMethod.setEntity(entity);
+		HttpResponse updateRootResponse = conn.execute(updateMethod);
+		int updateRootCode = updateRootResponse.getStatusLine().getStatusCode();
+		assertTrue(updateRootCode == 200 || updateRootCode == 201);
+		EntityUtils.consume(updateRootResponse.getEntity());
+	
+		//publish
+		URI publishUri = getCoursesUri().path(courseVo.getKey().toString()).path("publish").build();
+		HttpPost publishMethod = conn.createPost(publishUri, MediaType.APPLICATION_JSON);
+		HttpResponse publishResponse = conn.execute(publishMethod);
+		int publishCode = publishResponse.getStatusLine().getStatusCode();
+		assertTrue(publishCode == 200 || publishCode == 201);
+		EntityUtils.consume(publishResponse.getEntity());
+		
+		//reload the course
+		ICourse reloadedCourse = CourseFactory.loadCourse(re.getOlatResource().getResourceableId());
+		CourseNode reloadRootNode = reloadedCourse.getRunStructure().getRootNode();
+		Assert.assertEquals(2, reloadRootNode.getChildCount());
+	}
+	
+	private UriBuilder getCoursesUri() {
+		return UriBuilder.fromUri(getContextURI()).path("repo").path("courses");
+	}
+	
+	private UriBuilder getElementsUri(CourseVO course) {
+		return getCoursesUri().path(course.getKey().toString()).path("elements");
+	}
+	
+}
\ No newline at end of file
diff --git a/src/test/java/org/olat/test/AllTestsJunit4.java b/src/test/java/org/olat/test/AllTestsJunit4.java
index 9f17185aae7bbfc21811a6915629727208b62e09..351e1bd695ef5177f97c9f52aac8b577e2f77205 100644
--- a/src/test/java/org/olat/test/AllTestsJunit4.java
+++ b/src/test/java/org/olat/test/AllTestsJunit4.java
@@ -177,6 +177,7 @@ import org.junit.runners.Suite;
 	org.olat.restapi.CoursesForumsTest.class,
 	org.olat.restapi.CoursesResourcesFoldersTest.class,
 	org.olat.restapi.CoursesTest.class,
+	org.olat.restapi.CoursePublishTest.class,
 	org.olat.restapi.CoursesInfosTest.class,
 	org.olat.restapi.CourseTest.class,
 	org.olat.restapi.FolderTest.class,