diff --git a/src/main/java/org/olat/modules/fo/export/FinishCallback.java b/src/main/java/org/olat/modules/fo/export/FinishCallback.java
index 09d75f079a32ea09d9ffc74ef302e0fc3b67bf6e..b99b7857e67ce95f1ec2f3bd66c96f1520e8037a 100644
--- a/src/main/java/org/olat/modules/fo/export/FinishCallback.java
+++ b/src/main/java/org/olat/modules/fo/export/FinishCallback.java
@@ -71,7 +71,9 @@ public class FinishCallback implements StepRunnerCallback {
 		CourseEnvironment courseEnv = course.getCourseEnvironment();
 		Forum chosenforum = node.loadOrCreateForum(courseEnv);
 		Message msg = (Message)runContext.get(SendMailStepForm.MESSAGE_TO_MOVE);
+		msg = forumManager.getMessageById(msg.getKey());
 		Message parentMessage = (Message)runContext.get(SendMailStepForm.PARENT_MESSAGE);	
+		parentMessage = forumManager.getMessageById(parentMessage.getKey());
 		if (msg.getParentKey() == null && msg.getThreadtop() == null) {
 			msg = forumManager.createOrAppendThreadInAnotherForum(msg, chosenforum, parentMessage);
 		} else {
diff --git a/src/main/java/org/olat/modules/fo/export/SendMailStepForm.java b/src/main/java/org/olat/modules/fo/export/SendMailStepForm.java
index 97455756d8c8e9082eeaf674b94d7d25fa10a654..5ce278c624b9152d048f3a806b0ce8d9f00cd983 100644
--- a/src/main/java/org/olat/modules/fo/export/SendMailStepForm.java
+++ b/src/main/java/org/olat/modules/fo/export/SendMailStepForm.java
@@ -57,9 +57,10 @@ public class SendMailStepForm extends StepFormBasicController {
 	protected static final String SENDER = "sender";
 	protected static final String MAIL_TEMPLATE = "mailTemplate";
 	protected static final String FORUM = "forum";
-	protected static final String START_COURSE = "startCourse";
+	public static final String START_COURSE = "startCourse";
 	protected static final String PARENT_MESSAGE = "parentMessage";
-	protected static final String MESSAGE_TO_MOVE = "messageToMove";
+	public static final String MESSAGE_TO_MOVE = "messageToMove";
+	public static final String START_THREADTOP = "startMessage";
 	protected static final String ICOURSE = "icourse";
 	protected static final String COURSE = "course";
 	protected static final String NEW_THREAD = "newThread";
diff --git a/src/main/java/org/olat/modules/fo/manager/ForumManager.java b/src/main/java/org/olat/modules/fo/manager/ForumManager.java
index 97dbcb93fc2caa41cae22434707acdb53dc30fcb..2892cd38c1c5feb5af3f0f442e441b8ab5f49b05 100644
--- a/src/main/java/org/olat/modules/fo/manager/ForumManager.java
+++ b/src/main/java/org/olat/modules/fo/manager/ForumManager.java
@@ -1069,20 +1069,20 @@ public class ForumManager {
 	/**
 	 * Move thread to another forum recursively.
 	 *
-	 * @param old the OLD parent message
-	 * @param parentMessage the NEW parent message
+	 * @param oldParent the OLD parent message
+	 * @param newParent the NEW parent message
 	 * @param topMsg the top message
 	 * @return the message
 	 */
-	private Message moveThreadToAnotherForumRecursively(Message old, Message parentMessage, Message topMsg) {
+	private Message moveThreadToAnotherForumRecursively(Message oldParent, Message newParent, Message topMsg) {
 		// 1) get direct children of the old top message
-		List<Message> children = getMessageChildren(old);
+		List<Message> children = getMessageChildren(oldParent);
 		Message message = null;
 		// 2) iterate all first level children
 		for (Message child : children) {
 			Message oldMessage = getMessageById(child.getKey());
 			topMsg = getMessageById(topMsg.getKey());
-			message = persistMessageInAnotherLocation(oldMessage, topMsg.getForum(), topMsg, parentMessage);
+			message = persistMessageInAnotherLocation(oldMessage, topMsg.getForum(), topMsg, newParent);
 			// 3) move the message container to a new destination
 			moveMessageContainer(oldMessage.getForum().getKey(), oldMessage.getKey(), 
 					message.getForum().getKey(), message.getKey());
@@ -1134,14 +1134,6 @@ public class ForumManager {
 	 * @return the message
 	 */
 	public Message moveMessageToAnotherForum(Message msg, Forum forum, Message topMsg) {
-		// one has to set a new parent for all children of the moved message
-		// first message of sublist has to get the parent from the moved message
-		List<Message> children = getMessageChildren(msg);
-		for (Message child : children) {
-			child.setParent(msg.getParent());
-			dbInstance.getCurrentEntityManager().merge(child);
-		}		
-		// now move the message to the chosen thread
 		Message targetThread = null;
 		if (topMsg != null) {
 			targetThread = topMsg.getThreadtop();
@@ -1150,12 +1142,16 @@ public class ForumManager {
 			}
 			targetThread = getMessageById(targetThread.getKey());
 		}
-		final Message oldMessage = getMessageById(msg.getKey());
-		Message message = persistMessageInAnotherLocation(oldMessage, forum, targetThread, topMsg);
-		
-		moveMessageContainer(oldMessage.getForum().getKey(), oldMessage.getKey(), message.getForum().getKey(), message.getKey());
-		deleteMessageRecursion(oldMessage.getForum().getKey(), oldMessage);
-		return message;
+		final Message oldParent = getMessageById(msg.getKey());
+		// one has to set a new parent for all children of the moved message
+		Message newParent = persistMessageInAnotherLocation(oldParent, forum, targetThread, topMsg);		
+		moveMessageContainer(oldParent.getForum().getKey(), oldParent.getKey(), newParent.getForum().getKey(), newParent.getKey());
+		targetThread = targetThread == null ? newParent : targetThread;
+		if (hasChildren(oldParent)) {
+			moveThreadToAnotherForumRecursively(oldParent, newParent, targetThread);
+		}
+		deleteMessageRecursion(oldParent.getForum().getKey(), oldParent);
+		return newParent;
 	}
 	
 	/**
diff --git a/src/main/java/org/olat/modules/fo/ui/MessageListController.java b/src/main/java/org/olat/modules/fo/ui/MessageListController.java
index d7c83cfd815c09b3c8da339a6a75aa481bd98f01..4ddd179269ae1e10b68b4db1d4e2699395d7e4bc 100644
--- a/src/main/java/org/olat/modules/fo/ui/MessageListController.java
+++ b/src/main/java/org/olat/modules/fo/ui/MessageListController.java
@@ -90,6 +90,7 @@ import org.olat.modules.fo.MessageRef;
 import org.olat.modules.fo.Status;
 import org.olat.modules.fo.archiver.formatters.ForumDownloadResource;
 import org.olat.modules.fo.export.FinishCallback;
+import org.olat.modules.fo.export.SendMailStepForm;
 import org.olat.modules.fo.export.Step_1_SelectCourse;
 import org.olat.modules.fo.manager.ForumManager;
 import org.olat.modules.fo.portfolio.ForumMediaHandler;
@@ -828,6 +829,17 @@ public class MessageListController extends BasicController implements GenericEve
 	protected void event(UserRequest ureq, Controller source, Event event) {
 		if (source == exportCtrl) {
 			if(event == Event.CANCELLED_EVENT || event == Event.DONE_EVENT || event == Event.CHANGED_EVENT) {
+				if (event == Event.CHANGED_EVENT) {
+					StepsRunContext runContext = exportCtrl.getRunContext();
+					Message originTopMessage = (Message)runContext.get(SendMailStepForm.START_THREADTOP);
+					originTopMessage = forumManager.loadMessage(originTopMessage.getKey());
+					if (originTopMessage != null) {
+						//refresh origin thread
+						fireEvent(ureq, new SelectMessageEvent(SelectMessageEvent.SELECT_THREAD, originTopMessage.getKey()));
+					} else {
+						fireEvent(ureq, Event.BACK_EVENT);
+					}					
+				}
 				getWindowControl().pop();
 				removeAsListenerAndDispose(exportCtrl);
 				exportCtrl = null;
@@ -1364,7 +1376,9 @@ public class MessageListController extends BasicController implements GenericEve
 					"o_sel_bulk_assessment_wizard");
 			StepsRunContext runContext = exportCtrl.getRunContext();
 			// can be threadtop message
-			runContext.put("messageToMove", message);
+			runContext.put(SendMailStepForm.MESSAGE_TO_MOVE, message);
+			// starting thread
+			runContext.put(SendMailStepForm.START_THREADTOP, message.getThreadtop() == null ? message : message.getThreadtop());
 			// get start course
 			PropertyManager propertyManager = PropertyManager.getInstance();
 			Long forumResourceableId = forum.getResourceableId();
@@ -1375,7 +1389,7 @@ public class MessageListController extends BasicController implements GenericEve
 				OLATResourceable olatResourceable = olatManager.findResourceable(resourcetypeId, resourcetypeName);
 				RepositoryEntry startCourse = repositoryManager.lookupRepositoryEntry(olatResourceable, false);
 				if (startCourse != null) {
-					runContext.put("startCourse", startCourse);
+					runContext.put(SendMailStepForm.START_COURSE, startCourse);
 				}
 			}
 			listenTo(exportCtrl);