diff --git a/src/main/java/org/olat/ims/qti21/QTI21Service.java b/src/main/java/org/olat/ims/qti21/QTI21Service.java
index d0d60d7c5d6de22ebf15b7a913b4c3176acba68a..a3bbceb7aa32ace564d688d8723e3c62a7487121 100644
--- a/src/main/java/org/olat/ims/qti21/QTI21Service.java
+++ b/src/main/java/org/olat/ims/qti21/QTI21Service.java
@@ -80,6 +80,8 @@ public interface QTI21Service {
 	
 	public <E extends ResolvedAssessmentObject<?>> E loadAndResolveAssessmentObject(File resourceDirectory);
 	
+	public boolean updateAssesmentObject(File resourceFile, ResolvedAssessmentObject<?> resolvedAssessmentObject);
+	
 	
 	public UserTestSession createTestSession(Identity identity, AssessmentEntry assessmentEntry,
 			RepositoryEntry entry, String subIdent, RepositoryEntry testEntry,
diff --git a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
index b89578b77128b46ee0c417237f0db414921c9dc8..60ff6c6330e1e4fc6c60f12cc6d3cbb047c57456 100644
--- a/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
+++ b/src/main/java/org/olat/ims/qti21/manager/QTI21ServiceImpl.java
@@ -69,6 +69,7 @@ import org.w3c.dom.Document;
 import uk.ac.ed.ph.jqtiplus.JqtiExtensionManager;
 import uk.ac.ed.ph.jqtiplus.JqtiExtensionPackage;
 import uk.ac.ed.ph.jqtiplus.QtiConstants;
+import uk.ac.ed.ph.jqtiplus.node.AssessmentObject;
 import uk.ac.ed.ph.jqtiplus.node.AssessmentObjectType;
 import uk.ac.ed.ph.jqtiplus.node.QtiNode;
 import uk.ac.ed.ph.jqtiplus.node.result.AbstractResult;
@@ -78,7 +79,9 @@ import uk.ac.ed.ph.jqtiplus.node.result.OutcomeVariable;
 import uk.ac.ed.ph.jqtiplus.notification.NotificationRecorder;
 import uk.ac.ed.ph.jqtiplus.reading.AssessmentObjectXmlLoader;
 import uk.ac.ed.ph.jqtiplus.reading.QtiXmlReader;
+import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentItem;
 import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentObject;
+import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentTest;
 import uk.ac.ed.ph.jqtiplus.serialization.QtiSerializer;
 import uk.ac.ed.ph.jqtiplus.state.ItemSessionState;
 import uk.ac.ed.ph.jqtiplus.state.TestPlanNodeKey;
@@ -208,6 +211,30 @@ public class QTI21ServiceImpl implements QTI21Service, InitializingBean, Disposa
 		}
         return result;
 	}
+	
+	@Override
+	public boolean updateAssesmentObject(File resourceFile, ResolvedAssessmentObject<?> resolvedAssessmentObject) {
+		AssessmentObject assessmentObject;
+		if(resolvedAssessmentObject instanceof ResolvedAssessmentItem) {
+			assessmentObject = ((ResolvedAssessmentItem)resolvedAssessmentObject)
+					.getItemLookup().getRootNodeHolder().getRootNode();
+		} else if(resolvedAssessmentObject instanceof ResolvedAssessmentTest) {
+			assessmentObject = ((ResolvedAssessmentTest)resolvedAssessmentObject)
+					.getTestLookup().getRootNodeHolder().getRootNode();
+		} else {
+			return false;
+		}
+
+		try(FileOutputStream out = new FileOutputStream(resourceFile)) {
+			qtiSerializer().serializeJqtiObject(assessmentObject, out);
+			//TODO qti
+			assessmentTestsAndItemsCache.remove(resourceFile);
+			return true;
+		} catch(Exception e) {
+			log.error("", e);
+			return false;
+		}
+	}
 
 	@Override
 	public URI createAssessmentObjectUri(File resourceDirectory) {
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java
index 94f5da88fa156f8153d75780d2e8d00051080391..4db2bab27e4e5d804b288b8a4e6ad98fb863f3b1 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentItemEditorController.java
@@ -20,7 +20,6 @@
 package org.olat.ims.qti21.ui.editor;
 
 import java.io.File;
-import java.io.FileOutputStream;
 import java.net.URI;
 import java.util.List;
 
@@ -34,6 +33,7 @@ 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.ims.qti21.QTI21Constants;
+import org.olat.ims.qti21.QTI21Service;
 import org.olat.ims.qti21.ui.AssessmentItemDisplayController;
 import org.olat.modules.assessment.AssessmentEntry;
 import org.olat.modules.assessment.AssessmentService;
@@ -45,7 +45,6 @@ import uk.ac.ed.ph.jqtiplus.node.item.interaction.ChoiceInteraction;
 import uk.ac.ed.ph.jqtiplus.node.item.interaction.Interaction;
 import uk.ac.ed.ph.jqtiplus.node.test.AssessmentItemRef;
 import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentItem;
-import uk.ac.ed.ph.jqtiplus.serialization.QtiSerializer;
 
 /**
  * 
@@ -64,7 +63,7 @@ public class AssessmentItemEditorController extends BasicController {
 	private AssessmentItemDisplayController displayCtrl;
 	
 	@Autowired
-	private QtiSerializer qtiSerializer;
+	private QTI21Service qtiService;
 	@Autowired
 	private AssessmentService assessmentService;
 	
@@ -150,13 +149,6 @@ public class AssessmentItemEditorController extends BasicController {
 	private void doSaveAssessmentItem() {
 		URI itemUri = resolvedAssessmentItem.getItemLookup().getSystemId();
 		File itemFile = new File(itemUri);
-		AssessmentItem assessmentItem = resolvedAssessmentItem.getItemLookup().getRootNodeHolder().getRootNode();
-		
-		try(FileOutputStream out = new FileOutputStream(itemFile)) {
-			qtiSerializer.serializeJqtiObject(assessmentItem, out);	
-		} catch(Exception e) {
-			logError("", e);
-			showError("serialize.error");
-		}
+		qtiService.updateAssesmentObject(itemFile, resolvedAssessmentItem);
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java
index a8566ecc121df807b1dc26951dfa3758a46fce81..464539964f351e3429a7a93d90862a539a5cfd5d 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/AssessmentTestComposerController.java
@@ -20,7 +20,6 @@
 package org.olat.ims.qti21.ui.editor;
 
 import java.io.File;
-import java.io.FileOutputStream;
 import java.net.URI;
 
 import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
@@ -55,7 +54,6 @@ import uk.ac.ed.ph.jqtiplus.node.test.AssessmentTest;
 import uk.ac.ed.ph.jqtiplus.node.test.TestPart;
 import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentItem;
 import uk.ac.ed.ph.jqtiplus.resolution.ResolvedAssessmentTest;
-import uk.ac.ed.ph.jqtiplus.serialization.QtiSerializer;
 
 /**
  * Assessment test editor and composer.
@@ -84,8 +82,6 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 	
 	@Autowired
 	private QTI21Service qtiService;
-	@Autowired
-	private QtiSerializer qtiSerializer;
 	
 	public AssessmentTestComposerController(UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbar,
 			RepositoryEntry testEntry) {
@@ -178,14 +174,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 	private void doSaveAssessmentTest() {
 		URI testURI = resolvedAssessmentTest.getTestLookup().getSystemId();
 		File testFile = new File(testURI);
-		AssessmentTest assessmentTest = resolvedAssessmentTest.getTestLookup().getRootNodeHolder().getRootNode();
-
-		try(FileOutputStream out = new FileOutputStream(testFile)) {
-			qtiSerializer.serializeJqtiObject(assessmentTest, out);	
-		} catch(Exception e) {
-			logError("", e);
-			showError("serialize.error");
-		}
+		qtiService.updateAssesmentObject(testFile, resolvedAssessmentTest);
 	}
 	
 	private void doUpdate(AssessmentSection section) {
@@ -198,8 +187,6 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 				menuTree.setDirty(true);
 			}
 		}
-		
-		
 	}
 	
 	private void partEditorFactory(UserRequest ureq, TreeNode selectedNode) {