diff --git a/pom.xml b/pom.xml
index 7f0e8a41de6c17b5bab0fe3a5570ebee9d0f6d4e..83bee19edb843e98a1f8d5c0dd58fad52310ecc9 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1960,7 +1960,7 @@
 		<dependency>
 			<groupId>org.openolat.imscp</groupId>
 			<artifactId>manifest</artifactId>
-			<version>1.1-SNAPSHOT</version>
+			<version>1.3-SNAPSHOT</version>
 		</dependency>
 		<dependency>
 			<groupId>rome</groupId>
diff --git a/src/main/java/org/olat/ims/qti21/model/xml/ManifestBuilder.java b/src/main/java/org/olat/ims/qti21/model/xml/ManifestBuilder.java
new file mode 100644
index 0000000000000000000000000000000000000000..5b4d604d0c65e7de15e684a3d6524bc4af215f28
--- /dev/null
+++ b/src/main/java/org/olat/ims/qti21/model/xml/ManifestBuilder.java
@@ -0,0 +1,357 @@
+/**
+ * <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.ims.qti21.model.xml;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.List;
+import java.util.UUID;
+
+import javax.xml.bind.JAXBContext;
+import javax.xml.bind.JAXBElement;
+import javax.xml.bind.JAXBException;
+import javax.xml.bind.Marshaller;
+
+import org.olat.core.logging.OLog;
+import org.olat.core.logging.Tracing;
+import org.olat.ims.qti21.model.IdentifierGenerator;
+import org.olat.imscp.xml.manifest.FileType;
+import org.olat.imscp.xml.manifest.ManifestMetadataType;
+import org.olat.imscp.xml.manifest.ManifestType;
+import org.olat.imscp.xml.manifest.MetadataType;
+import org.olat.imscp.xml.manifest.ResourceType;
+import org.olat.imscp.xml.manifest.ResourcesType;
+import org.olat.imsmd.xml.manifest.LomType;
+import org.olat.imsmd.xml.manifest.TechnicalType;
+import org.olat.imsqti.xml.manifest.QTIMetadataType;
+import org.olat.oo.xml.manifest.OpenOLATMetadataType;
+
+/**
+ * manifest
+ * -> metadata
+ * -> organizations
+ * -> resources
+ * -> -> resource
+ * -> -> -> metadata
+ * -> -> -> file
+ * -> -> -> dependency
+ * Initial date: 22.02.2016<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class ManifestBuilder {
+	
+	private static final OLog log = Tracing.createLoggerFor(ManifestBuilder.class);
+	
+	public static final String SCHEMA_LOCATIONS = "http://www.imsglobal.org/xsd/imscp_v1p1 http://www.imsglobal.org/xsd/imscp_v1p2.xsd http://www.imsglobal.org/xsd/imsmd_v1p2 http://www.imsglobal.org/xsd/imsmd_v1p2p4.xsd http://www.imsglobal.org/xsd/imsqti_metadata_v2p1 http://www.imsglobal.org/xsd/qti/qtiv2p1/imsqti_metadata_v2p1.xsd";
+
+	public static final String ASSESSMENTTEST_MIMETYPE = "text/x-imsqti-test-xml";
+	public static final String ASSESSMENTITEM_MIMETYPE = "text/x-imsqti-item-xml";
+	
+	private static final org.olat.oo.xml.manifest.ObjectFactory ooObjectFactory = new org.olat.oo.xml.manifest.ObjectFactory();
+	private static final org.olat.imscp.xml.manifest.ObjectFactory cpObjectFactory = new org.olat.imscp.xml.manifest.ObjectFactory();
+	private static final org.olat.imsmd.xml.manifest.ObjectFactory mdObjectFactory = new org.olat.imsmd.xml.manifest.ObjectFactory();
+	private static final org.olat.imsqti.xml.manifest.ObjectFactory qtiObjectFactory = new org.olat.imsqti.xml.manifest.ObjectFactory();
+	
+	private static JAXBContext context;
+	static {
+		try {
+			context = JAXBContext.newInstance("org.olat.imscp.xml.manifest:org.olat.imsqti.xml.manifest:org.olat.imsmd.xml.manifest:org.olat.oo.xml.manifest");
+		} catch (JAXBException e) {
+			log.error("", e);
+		}
+	}
+
+	private ManifestType manifest;
+
+	public ManifestBuilder() {
+		manifest = cpObjectFactory.createManifestType();
+	}
+	
+	public ManifestBuilder(ManifestType manifest) {
+		this.manifest = manifest;
+	}
+	
+	/**
+	 * Create a manifest with some metadata specific to the
+	 * assessment test.
+	 * 
+	 * @return
+	 */
+	public static ManifestBuilder createAssessmentTestBuilder() {
+		ManifestBuilder builder = new ManifestBuilder();
+		//schema
+		ManifestMetadataType metadataType = createManifestMetadataType();
+        metadataType.setSchema("QTIv2.1 Package");
+        metadataType.setSchemaversion("1.0.0");
+        builder.manifest.setMetadata(metadataType);
+        //lom technical
+        LomType lom = createLom(true, true);
+        metadataType.getAny().add(mdObjectFactory.createLom(lom));
+        return builder;
+	}
+	
+	/**
+	 * Create a manifest with some metadata specific to the
+	 * assessment item.
+	 * 
+	 * @return
+	 */
+	public static ManifestBuilder createAssessmentItemBuilder() {
+		ManifestBuilder builder = new ManifestBuilder();
+		//schema
+		ManifestMetadataType metadataType = createManifestMetadataType();
+        builder.manifest.setMetadata(metadataType);
+        //lom technical
+        LomType lom = createLom(false, true);
+        metadataType.getAny().add(mdObjectFactory.createLom(lom));
+        return builder;
+	}
+	
+	private static ManifestMetadataType createManifestMetadataType() {
+		ManifestMetadataType metadataType = cpObjectFactory.createManifestMetadataType();
+        metadataType.setSchema("QTIv2.1 Package");
+        metadataType.setSchemaversion("1.0.0");
+        return metadataType;
+	}
+	
+	private static LomType createLom(boolean assessmentTest, boolean assessmentItem) {
+		LomType lom = mdObjectFactory.createLomType();
+		TechnicalType technical = mdObjectFactory.createTechnicalType();
+		if(assessmentTest) {
+			technical.getContent().add(createTechnicalFormat(ASSESSMENTTEST_MIMETYPE));
+		}
+		if(assessmentItem) {
+			technical.getContent().add(createTechnicalFormat(ASSESSMENTITEM_MIMETYPE));
+		}
+        return lom;
+	}
+	
+	private static JAXBElement<String> createTechnicalFormat(String format) {
+		return mdObjectFactory.createFormat(format);
+	}
+	
+	public String appendAssessmentTest() {
+		String testId = "test" + UUID.randomUUID().toString();
+        String testFilename = testId + ".xml";
+		appendAssessmentTest(testId, testFilename);
+        return testFilename;
+	}
+	
+	public String appendAssessmentTest(String testFilename) {
+		String testId = "test" + UUID.randomUUID().toString();
+		appendAssessmentTest(testId, testFilename);
+        return testFilename;
+	}
+	
+	private final void appendAssessmentTest(String testId, String testFilename) {
+		ResourceType testResourceType = cpObjectFactory.createResourceType();
+        testResourceType.setIdentifier(testId);
+        testResourceType.setType("imsqti_test_xmlv2p1");
+        testResourceType.setHref(testFilename);
+        getResourceList().add(testResourceType);
+        appendFile(testResourceType, testFilename);
+	}
+	
+	public String appendAssessmentItem() {
+		String itemId = "id" + UUID.randomUUID().toString();
+        String itemFileName = itemId + ".xml";
+		ResourceType itemResourceType = appendAssessmentItem(itemId, itemFileName);
+        appendFile(itemResourceType, itemFileName);
+		return itemFileName;
+	}
+	
+	public String appendAssessmentItem(String itemFileName) {
+		String itemId = IdentifierGenerator.newAsString("item");
+		ResourceType itemResourceType = appendAssessmentItem(itemId, itemFileName);
+        appendFile(itemResourceType, itemFileName);
+        return itemFileName;
+	}
+	
+	
+	public void setOpenOLATMetadata(ResourceType resource, String questionType) {
+		OpenOLATMetadataType qtiMetadata = getOpenOLATMetadata(resource, true);
+		qtiMetadata.setQuestionType(questionType);
+	}
+	
+	/**
+	 * Return the openolat metadata if it exists or, if specified, create
+	 * one and append it to the metadata of the resource.
+	 * 
+	 * @param resource The resource with the metadata
+	 * @param create True create the qtiMetadata
+	 * @return
+	 */
+	public OpenOLATMetadataType getOpenOLATMetadata(ResourceType resource, boolean create) {
+		MetadataType metadata = getMetadataTypeByResource(resource, create);
+		if(metadata == null) return null;
+
+		List<Object> anyMetadataList = metadata.getAny();
+		OpenOLATMetadataType ooMetadata = null;
+		for(Object anyMetadata:anyMetadataList) {
+			if(anyMetadata instanceof JAXBElement<?>
+				&& ((JAXBElement<?>)anyMetadata).getValue() instanceof OpenOLATMetadataType) {
+				ooMetadata = (OpenOLATMetadataType)((JAXBElement<?>)anyMetadata).getValue();
+			}
+		}
+		
+		if(ooMetadata == null && create) {
+			ooMetadata = ooObjectFactory.createOpenOLATMetadataType();
+			metadata.getAny().add(ooObjectFactory.createOoMetadata(ooMetadata));
+		}
+		return ooMetadata;
+	}
+	
+	public void setQtiMetadata(ResourceType resource, List<String> interactions) {
+		QTIMetadataType qtiMetadata = getQtiMetadata(resource, true);
+		
+		qtiMetadata.getInteractionType().clear();
+		for(String interaction:interactions) {
+			qtiMetadata.getInteractionType().add(interaction);
+		}
+	}
+	
+	/**
+	 * Return the qti metadata if it exists or if specified, create
+	 * one and append it to the metadata of the resource.
+	 * 
+	 * @param resource The resource with the metadata
+	 * @param create True create the qtiMetadata
+	 * @return
+	 */
+	public QTIMetadataType getQtiMetadata(ResourceType resource, boolean create) {
+		MetadataType metadata = getMetadataTypeByResource(resource, create);
+		if(metadata == null) return null;
+
+		List<Object> anyMetadataList = metadata.getAny();
+		QTIMetadataType qtiMetadata = null;
+		for(Object anyMetadata:anyMetadataList) {
+			if(anyMetadata instanceof JAXBElement<?>
+				&& ((JAXBElement<?>)anyMetadata).getValue() instanceof QTIMetadataType) {
+				qtiMetadata = (QTIMetadataType)((JAXBElement<?>)anyMetadata).getValue();
+			}
+		}
+		
+		if(qtiMetadata == null && create) {
+			qtiMetadata = qtiObjectFactory.createQTIMetadataType();
+			metadata.getAny().add(qtiObjectFactory.createQtiMetadata(qtiMetadata));
+		}
+		return qtiMetadata;
+	}
+	
+	private MetadataType getMetadataTypeByResource(ResourceType resource, boolean create) {
+		MetadataType metadata = resource.getMetadata();
+		if(metadata == null && create) {
+			metadata = cpObjectFactory.createMetadataType();
+			resource.setMetadata(metadata);
+		}
+		return metadata;
+	}
+	
+	public ResourceType getResourceTypeByIdentifier(String resourceId) {
+		List<ResourceType> resources = getResourceList();
+		for(ResourceType resource:resources) {
+			if(resourceId.equals(resource.getIdentifier())) {
+				return resource;
+			}
+		}
+		return null;
+	}
+	
+	public ResourceType getResourceTypeByHref(String href) {
+		List<ResourceType> resources = getResourceList();
+		for(ResourceType resource:resources) {
+			if(href.equals(resource.getHref())) {
+				return resource;
+			}
+		}
+		return null;
+	}
+	
+	private ResourceType appendAssessmentItem(String itemId, String itemFileName) {
+        ResourceType itemResourceType = cpObjectFactory.createResourceType();
+        itemResourceType.setIdentifier(itemId);
+        itemResourceType.setType("imsqti_item_xmlv2p1");
+        itemResourceType.setHref(itemFileName);
+        getResourceList().add(itemResourceType);
+        appendFile(itemResourceType, itemFileName);
+        return itemResourceType;
+	}
+	
+	private List<ResourceType> getResourceList() {
+		ResourcesType resources = manifest.getResources();
+		if(resources == null) {
+			resources = cpObjectFactory.createResourcesType();
+			manifest.setResources(resources);
+		}
+		return resources.getResource();
+	}
+	
+	private void appendFile(ResourceType resource, String href) {
+		FileType itemFileType = cpObjectFactory.createFileType();
+        itemFileType.setHref(href);
+        resource.getFile().add(itemFileType);
+	}
+	
+	public void build() {
+		//
+	}
+
+	public final void write(File file) {
+		build();
+		
+        try(OutputStream out = new FileOutputStream(file)) {
+			Marshaller marshaller = context.createMarshaller();
+			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+			marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, SCHEMA_LOCATIONS);
+			marshaller.marshal(cpObjectFactory.createManifest(manifest), out);
+		} catch (JAXBException | IOException e) {
+			log.error("", e);
+		}
+	}
+	
+	public final void write(OutputStream out) {
+		build();
+		
+        try {
+			Marshaller marshaller = context.createMarshaller();
+			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
+			marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, SCHEMA_LOCATIONS);
+			marshaller.marshal(manifest, out);
+		} catch (JAXBException e) {
+			log.error("", e);
+		}
+	}
+	
+	public static final ManifestBuilder read(File file) {
+		try(InputStream in = new FileInputStream(file )) {
+			ManifestType manifest = (ManifestType)((JAXBElement<?>)context
+					.createUnmarshaller().unmarshal(in)).getValue();
+			return new ManifestBuilder(manifest);
+		} catch (JAXBException | IOException e) {
+			log.error("", e);
+			return null;
+		}
+	}
+}
diff --git a/src/main/java/org/olat/ims/qti21/model/xml/ManifestPackage.java b/src/main/java/org/olat/ims/qti21/model/xml/ManifestPackage.java
deleted file mode 100644
index 48941a28b0372349ee6d6d3eb9503b6ce3c67afd..0000000000000000000000000000000000000000
--- a/src/main/java/org/olat/ims/qti21/model/xml/ManifestPackage.java
+++ /dev/null
@@ -1,167 +0,0 @@
-/**
- * <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.ims.qti21.model.xml;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.OutputStream;
-import java.util.UUID;
-
-import javax.xml.bind.JAXBContext;
-import javax.xml.bind.JAXBElement;
-import javax.xml.bind.JAXBException;
-import javax.xml.bind.Marshaller;
-import javax.xml.bind.Unmarshaller;
-
-import org.olat.core.logging.OLog;
-import org.olat.core.logging.Tracing;
-import org.olat.ims.qti21.model.IdentifierGenerator;
-import org.olat.imscp.xml.manifest.FileType;
-import org.olat.imscp.xml.manifest.ManifestMetadataType;
-import org.olat.imscp.xml.manifest.ManifestType;
-import org.olat.imscp.xml.manifest.ObjectFactory;
-import org.olat.imscp.xml.manifest.OrganizationsType;
-import org.olat.imscp.xml.manifest.ResourceType;
-import org.olat.imscp.xml.manifest.ResourcesType;
-
-/**
- * 
- * Initial date: 04.06.2015<br>
- * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
- *
- */
-public class ManifestPackage {
-	
-	private static final OLog log = Tracing.createLoggerFor(ManifestPackage.class);
-	private static final ObjectFactory objectFactory = new ObjectFactory();
-	
-	public static ManifestType createEmptyManifest() {
-		ManifestType manifestType = objectFactory.createManifestType();
-        ManifestMetadataType metadataType = objectFactory.createManifestMetadataType();
-        metadataType.setSchema("QTIv2.1 Package");
-        metadataType.setSchemaversion("1.0.0");
-        manifestType.setMetadata(metadataType);
-        
-        OrganizationsType organisationsType = objectFactory.createOrganizationsType();
-        manifestType.setOrganizations(organisationsType);
-
-        ResourcesType resourcesType = objectFactory.createResourcesType();
-        manifestType.setResources(resourcesType);
-        return manifestType;
-	}
-	
-	public static String appendAssessmentTest(ManifestType manifest) {
-		String testId = "test" + UUID.randomUUID().toString();
-        String testFileName = testId + ".xml";
-        ResourceType testResourceType = objectFactory.createResourceType();
-        testResourceType.setIdentifier(testId);
-        testResourceType.setType("imsqti_test_xmlv2p1");
-        testResourceType.setHref(testFileName);
-        manifest.getResources().getResource().add(testResourceType);
-
-        appendFile(testResourceType, testFileName);
-        return testFileName;
-	}
-	
-	public static void appendAssessmentTest(String testFileName, ManifestType manifest) {  
-		String testId = IdentifierGenerator.newAsString("test");
-		
-        ResourceType testResourceType = objectFactory.createResourceType();
-        testResourceType.setIdentifier(testId);
-        testResourceType.setType("imsqti_test_xmlv2p1");
-        testResourceType.setHref(testFileName);
-        manifest.getResources().getResource().add(testResourceType);
-
-        appendFile(testResourceType, testFileName);
-	}
-	
-	public static String appendAssessmentItem(ManifestType manifest) {
-		String itemId = "id" + UUID.randomUUID().toString();
-        String itemFileName = itemId + ".xml";
-        
-        ResourceType itemResourceType = objectFactory.createResourceType();
-        itemResourceType.setIdentifier(itemId);
-        itemResourceType.setType("imsqti_item_xmlv2p1");
-        itemResourceType.setHref(itemFileName);
-        manifest.getResources().getResource().add(itemResourceType);
-        
-        appendFile(itemResourceType, itemFileName);
-		return itemFileName;
-	}
-	
-	public static void appendAssessmentItem(String itemFileName, ManifestType manifest) {
-		String itemId = IdentifierGenerator.newAsString("item");
-
-        ResourceType itemResourceType = objectFactory.createResourceType();
-        itemResourceType.setIdentifier(itemId);
-        itemResourceType.setType("imsqti_item_xmlv2p1");
-        itemResourceType.setHref(itemFileName);
-        manifest.getResources().getResource().add(itemResourceType);
-        
-        appendFile(itemResourceType, itemFileName);
-	}
-
-	public static void appendFile(ResourceType resource, String href) {
-		FileType itemFileType = objectFactory.createFileType();
-        itemFileType.setHref(href);
-        resource.getFile().add(itemFileType);
-	}
-	
-	public static void write(ManifestType manifest, OutputStream out) {
-        try {
-			JAXBContext context = JAXBContext.newInstance("org.olat.imscp.xml.manifest");
-			Marshaller marshaller = context.createMarshaller();
-			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-			marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.imsglobal.org/xsd/imscp_v1p1 http://www.imsglobal.org/xsd/qti/qtiv2p1/qtiv2p1_imscpv1p2_v1p0.xsd");
-
-			marshaller.marshal(objectFactory.createManifest(manifest), out);
-		} catch (JAXBException e) {
-			log.error("", e);
-		}
-	}
-	
-	public static void write(ManifestType manifest, File manifestFile) {
-        try(OutputStream out = new FileOutputStream(manifestFile)) {
-			JAXBContext context = JAXBContext.newInstance("org.olat.imscp.xml.manifest");
-			Marshaller marshaller = context.createMarshaller();
-			marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-			marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.imsglobal.org/xsd/imscp_v1p1 http://www.imsglobal.org/xsd/qti/qtiv2p1/qtiv2p1_imscpv1p2_v1p0.xsd");
-
-			marshaller.marshal(objectFactory.createManifest(manifest), out);
-		} catch (JAXBException | IOException e) {
-			log.error("", e);
-		}
-	}
-	
-	public static ManifestType read(File manifestFile) {
-        try {
-			JAXBContext context = JAXBContext.newInstance("org.olat.imscp.xml.manifest");
-			Unmarshaller marshaller = context.createUnmarshaller();
-			//marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
-			//marshaller.setProperty(Marshaller.JAXB_SCHEMA_LOCATION, "http://www.imsglobal.org/xsd/imscp_v1p1 http://www.imsglobal.org/xsd/qti/qtiv2p1/qtiv2p1_imscpv1p2_v1p0.xsd");
-
-			return (ManifestType)((JAXBElement<?>)marshaller.unmarshal(manifestFile)).getValue();
-		} catch (JAXBException e) {
-			log.error("", e);
-			return null;
-		}
-	}
-}
diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI12To21Converter.java b/src/main/java/org/olat/ims/qti21/pool/QTI12To21Converter.java
index 34bfd976ac54b8fe0421191beb2c40ee14f9b5cf..ba7cb764237c7d1702017ddc83508b636bf81eed 100644
--- a/src/main/java/org/olat/ims/qti21/pool/QTI12To21Converter.java
+++ b/src/main/java/org/olat/ims/qti21/pool/QTI12To21Converter.java
@@ -50,7 +50,7 @@ import org.olat.ims.qti21.model.xml.AssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.AssessmentItemFactory;
 import org.olat.ims.qti21.model.xml.AssessmentTestBuilder;
 import org.olat.ims.qti21.model.xml.AssessmentTestFactory;
-import org.olat.ims.qti21.model.xml.ManifestPackage;
+import org.olat.ims.qti21.model.xml.ManifestBuilder;
 import org.olat.ims.qti21.model.xml.ModalFeedbackBuilder;
 import org.olat.ims.qti21.model.xml.interactions.ChoiceAssessmentItemBuilder.ScoreEvaluation;
 import org.olat.ims.qti21.model.xml.interactions.EssayAssessmentItemBuilder;
@@ -58,7 +58,6 @@ import org.olat.ims.qti21.model.xml.interactions.FIBAssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.interactions.KPrimAssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.interactions.MultipleChoiceAssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.interactions.SingleChoiceAssessmentItemBuilder;
-import org.olat.imscp.xml.manifest.ManifestType;
 
 import uk.ac.ed.ph.jqtiplus.node.AssessmentObject;
 import uk.ac.ed.ph.jqtiplus.node.content.variable.RubricBlock;
@@ -92,11 +91,11 @@ public class QTI12To21Converter {
 	private final QtiSerializer qtiSerializer = new QtiSerializer(null);
 	private final AssessmentHtmlBuilder htmlBuilder = new AssessmentHtmlBuilder(qtiSerializer);
 	
-	private final ManifestType manifest;
+	private final ManifestBuilder manifest;
 	
 	public QTI12To21Converter(File unzippedDirRoot) {
 		this.unzippedDirRoot = unzippedDirRoot;
-		manifest = ManifestPackage.createEmptyManifest();
+		manifest = ManifestBuilder.createAssessmentTestBuilder();
 	}
 	
 	public AssessmentTest convert(QTIEditorPackage qtiEditorPackage)
@@ -111,7 +110,7 @@ public class QTI12To21Converter {
 		AssessmentTest assessmentTest = new AssessmentTest();
 		String assessmentTestIdentifier = IdentifierGenerator.newAssessmentTestFilename();
 		File testFile = new File(unzippedDirRoot, assessmentTestIdentifier + ".xml");
-		ManifestPackage.appendAssessmentTest(testFile.getName(), manifest);
+		manifest.appendAssessmentTest(testFile.getName());
 		
 		assessmentTest.setIdentifier(assessmentTestIdentifier);
 		assessmentTest.setTitle(assessment.getTitle());
@@ -153,7 +152,7 @@ public class QTI12To21Converter {
 
 		assessmentTest = assessmentTestBuilder.build();
 		persistAssessmentObject(testFile, assessmentTest);
-		ManifestPackage.write(manifest, new File(unzippedDirRoot, "imsmanifest.xml"));
+		manifest.write(new File(unzippedDirRoot, "imsmanifest.xml"));
 		return assessmentTest;
 	}
 	
@@ -211,7 +210,7 @@ public class QTI12To21Converter {
 				itemRef.setHref(new URI(itemFile.getName()));
 				assessmentSection.getSectionParts().add(itemRef);
 				persistAssessmentObject(itemFile, assessmentItem);
-				ManifestPackage.appendAssessmentItem(itemFile.getName(), manifest);
+				manifest.appendAssessmentItem(itemFile.getName());
 			}
 		}
 	}
diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI21ExportProcessor.java b/src/main/java/org/olat/ims/qti21/pool/QTI21ExportProcessor.java
index 21b95efb920c8b9626ab823d0ae065a907dfeb57..045a90bc45f44a640e17929a8724c20cb285da84 100644
--- a/src/main/java/org/olat/ims/qti21/pool/QTI21ExportProcessor.java
+++ b/src/main/java/org/olat/ims/qti21/pool/QTI21ExportProcessor.java
@@ -38,8 +38,7 @@ import org.olat.core.util.io.ShieldOutputStream;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.ims.qti21.QTI21Service;
 import org.olat.ims.qti21.model.xml.AssessmentTestFactory;
-import org.olat.ims.qti21.model.xml.ManifestPackage;
-import org.olat.imscp.xml.manifest.ManifestType;
+import org.olat.ims.qti21.model.xml.ManifestBuilder;
 import org.olat.modules.qpool.QuestionItemFull;
 import org.olat.modules.qpool.manager.QPoolFileStorage;
 
@@ -119,12 +118,12 @@ public class QTI21ExportProcessor {
 		try {
 			QtiSerializer qtiSerializer = qtiService.qtiSerializer();
 			//imsmanifest
-			ManifestType manifest = ManifestPackage.createEmptyManifest();
+			ManifestBuilder manifest = ManifestBuilder.createAssessmentTestBuilder();
 			
 			//assessment test
 			AssessmentTest assessmentTest = AssessmentTestFactory.createAssessmentTest("Assessment test from pool");
 			String assessmentTestFilename = assessmentTest.getIdentifier() + ".xml";
-			ManifestPackage.appendAssessmentTest(assessmentTestFilename, manifest);
+			manifest.appendAssessmentTest(assessmentTestFilename);
 
 			//make a section
 			AssessmentSection section = assessmentTest.getTestParts().get(0).getAssessmentSections().get(0);
@@ -141,7 +140,7 @@ public class QTI21ExportProcessor {
 				//collectResources(itemEl, container, materials);
 				FileUtils.bcopy(itemFile, new File(directory, rootFilename), "");
 				AssessmentTestFactory.appendAssessmentItem(section, itemFilename);
-				ManifestPackage.appendAssessmentItem(itemFilename, manifest);
+				manifest.appendAssessmentItem(itemFilename);
 			}
 
 			try(FileOutputStream out = new FileOutputStream(new File(directory, assessmentTestFilename))) {
@@ -149,12 +148,8 @@ public class QTI21ExportProcessor {
 			} catch(Exception e) {
 				log.error("", e);
 			}
-			
-	        try(FileOutputStream out = new FileOutputStream(new File(directory, "imsmanifest.xml"))) {
-	        	ManifestPackage.write(manifest, out);
-	        } catch(Exception e) {
-	        	log.error("", e);
-	        }
+
+	        manifest.write(new File(directory, "imsmanifest.xml"));
 		} catch (IOException | URISyntaxException e) {
 			log.error("", e);
 		}
@@ -164,12 +159,12 @@ public class QTI21ExportProcessor {
 		try {
 			QtiSerializer qtiSerializer = qtiService.qtiSerializer();
 			//imsmanifest
-			ManifestType manifest = ManifestPackage.createEmptyManifest();
+			ManifestBuilder manifest = ManifestBuilder.createAssessmentTestBuilder();
 			
 			//assessment test
 			AssessmentTest assessmentTest = AssessmentTestFactory.createAssessmentTest("Assessment test from pool");
 			String assessmentTestFilename = assessmentTest.getIdentifier() + ".xml";
-			ManifestPackage.appendAssessmentTest(assessmentTestFilename, manifest);
+			manifest.appendAssessmentTest(assessmentTestFilename);
 
 			//make a section
 			AssessmentSection section = assessmentTest.getTestParts().get(0).getAssessmentSections().get(0);
@@ -187,7 +182,7 @@ public class QTI21ExportProcessor {
 
 				ZipUtil.addFileToZip(itemFilename, itemFile, zout);
 				AssessmentTestFactory.appendAssessmentItem(section, itemFilename);
-				ManifestPackage.appendAssessmentItem(itemFilename, manifest);
+				manifest.appendAssessmentItem(itemFilename);
 			}
 
 			zout.putNextEntry(new ZipEntry(assessmentTestFilename));
@@ -195,7 +190,7 @@ public class QTI21ExportProcessor {
 			zout.closeEntry();
 
 			zout.putNextEntry(new ZipEntry("imsmanifest.xml"));
-			ManifestPackage.write(manifest, zout);
+			manifest.write(new ShieldOutputStream(zout));
 			zout.closeEntry();
 		} catch (IOException | URISyntaxException e) {
 			log.error("", e);
diff --git a/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java b/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java
index a8e6e79e3fbb26183d2cb4c5c37dd3305a1623af..f177c4cf5d12b4ac33514a82bcc611d14d464245 100644
--- a/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java
+++ b/src/main/java/org/olat/ims/qti21/pool/QTI21QPoolServiceProvider.java
@@ -52,13 +52,12 @@ import org.olat.ims.qti21.model.QTI21QuestionType;
 import org.olat.ims.qti21.model.QTI21QuestionTypeDetector;
 import org.olat.ims.qti21.model.xml.AssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.AssessmentItemMetadata;
-import org.olat.ims.qti21.model.xml.ManifestPackage;
+import org.olat.ims.qti21.model.xml.ManifestBuilder;
 import org.olat.ims.qti21.model.xml.interactions.EssayAssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.interactions.KPrimAssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.interactions.MultipleChoiceAssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.interactions.SingleChoiceAssessmentItemBuilder;
 import org.olat.ims.resources.IMSEntityResolver;
-import org.olat.imscp.xml.manifest.ManifestType;
 import org.olat.modules.qpool.ExportFormatOptions;
 import org.olat.modules.qpool.ExportFormatOptions.Outcome;
 import org.olat.modules.qpool.QItemFactory;
@@ -263,10 +262,9 @@ public class QTI21QPoolServiceProvider implements QPoolSPI {
 		qtiService.persistAssessmentObject(itemFile, assessmentItem);
 		
 		//create imsmanifest
-		ManifestType manifestType = ManifestPackage.createEmptyManifest();
-        ManifestPackage.appendAssessmentItem(itemFile.getName(), manifestType);	
-        ManifestPackage.write(manifestType, new File(itemFile.getParentFile(), "imsmanifest.xml"));
-		
+		ManifestBuilder manifest = ManifestBuilder.createAssessmentItemBuilder();
+		manifest.appendAssessmentItem(itemFile.getName());	
+		manifest.write(new File(itemFile.getParentFile(), "imsmanifest.xml"));
 		return qitem;
 	}
 	
diff --git a/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java b/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java
index 2edf3e81c914dc1dfb166e04efe938be4d3191b1..49756bf0ebb1b740eec77b0357a44105ce5c3216 100644
--- a/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java
+++ b/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java
@@ -70,14 +70,13 @@ import org.olat.ims.qti21.model.IdentifierGenerator;
 import org.olat.ims.qti21.model.QTI21QuestionType;
 import org.olat.ims.qti21.model.xml.AssessmentItemFactory;
 import org.olat.ims.qti21.model.xml.AssessmentTestFactory;
-import org.olat.ims.qti21.model.xml.ManifestPackage;
+import org.olat.ims.qti21.model.xml.ManifestBuilder;
 import org.olat.ims.qti21.model.xml.OnyxToQtiWorksHandler;
 import org.olat.ims.qti21.pool.QTI21QPoolServiceProvider;
 import org.olat.ims.qti21.ui.AssessmentTestDisplayController;
 import org.olat.ims.qti21.ui.InMemoryOutcomesListener;
 import org.olat.ims.qti21.ui.QTI21RuntimeController;
 import org.olat.ims.qti21.ui.editor.AssessmentTestComposerController;
-import org.olat.imscp.xml.manifest.ManifestType;
 import org.olat.modules.qpool.model.QItemList;
 import org.olat.repository.ErrorList;
 import org.olat.repository.RepositoryEntry;
@@ -157,20 +156,18 @@ public class QTI21AssessmentTestHandler extends FileHandler {
 	}
 	
 	public void createMinimalAssessmentTest(String displayName, File directory) {
-        ManifestType manifestType = ManifestPackage.createEmptyManifest();
-        
-        QTI21Service qti21Service = CoreSpringFactory.getImpl(QTI21Service.class);
+        ManifestBuilder manifestBuilder = ManifestBuilder.createAssessmentTestBuilder();
 
 		//single choice
 		File itemFile = new File(directory, IdentifierGenerator.newAsString(QTI21QuestionType.sc.getPrefix()));
 		AssessmentItem assessmentItem = AssessmentItemFactory.createSingleChoice();
-		QtiSerializer qtiSerializer = qti21Service.qtiSerializer();
-		ManifestPackage.appendAssessmentItem(itemFile.getName(), manifestType);	
+		QtiSerializer qtiSerializer = qtiService.qtiSerializer();
+		manifestBuilder.appendAssessmentItem(itemFile.getName());	
 		
 		//test
         File testFile = new File(directory, IdentifierGenerator.newAssessmentTestFilename());
 		AssessmentTest assessmentTest = AssessmentTestFactory.createAssessmentTest(displayName);
-        ManifestPackage.appendAssessmentTest(testFile.getName(), manifestType);
+		manifestBuilder.appendAssessmentTest(testFile.getName());
         
         // item -> test
         try {
@@ -192,11 +189,7 @@ public class QTI21AssessmentTestHandler extends FileHandler {
 			log.error("", e);
 		}
 
-        try(FileOutputStream out = new FileOutputStream(new File(directory, "imsmanifest.xml"))) {
-        	ManifestPackage.write(manifestType, out);
-        } catch(Exception e) {
-        	log.error("", e);
-        }
+        manifestBuilder.write(new File(directory, "imsmanifest.xml"));
 	}
 
 	@Override
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 20560c67740e3b742548362884f13dc64cab5dd0..c57a9ed077be94622a2d3042c2c79731bb5b4243 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
@@ -223,7 +223,7 @@ public class AssessmentItemEditorController extends BasicController {
 				AssessmentItemEvent aie = (AssessmentItemEvent)event;
 				if(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED.equals(aie.getCommand())) {
 					doBuildAndSaveAssessmentItem();
-					fireEvent(ureq, new AssessmentItemEvent(aie.getCommand(), aie.getAssessmentItem(), itemRef));
+					fireEvent(ureq, new AssessmentItemEvent(aie.getCommand(), aie.getAssessmentItem(), itemRef, aie.getQuestionType()));
 				}
 			}
 		}
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 0688483485fd1c580f0c8eaf3026b8b7803e8430..93539f6bda459a676630aa7fe3d4c1aec3ec3ba3 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
@@ -23,6 +23,7 @@ import java.io.File;
 import java.io.IOException;
 import java.net.URI;
 import java.net.URISyntaxException;
+import java.util.ArrayList;
 import java.util.List;
 
 import org.olat.core.commons.fullWebApp.LayoutMain3ColsController;
@@ -54,9 +55,10 @@ import org.olat.fileresource.FileResourceManager;
 import org.olat.ims.qti21.QTI21Constants;
 import org.olat.ims.qti21.QTI21Service;
 import org.olat.ims.qti21.model.IdentifierGenerator;
+import org.olat.ims.qti21.model.QTI21QuestionType;
 import org.olat.ims.qti21.model.xml.AssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.AssessmentTestFactory;
-import org.olat.ims.qti21.model.xml.ManifestPackage;
+import org.olat.ims.qti21.model.xml.ManifestBuilder;
 import org.olat.ims.qti21.model.xml.interactions.EssayAssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.interactions.KPrimAssessmentItemBuilder;
 import org.olat.ims.qti21.model.xml.interactions.MultipleChoiceAssessmentItemBuilder;
@@ -71,7 +73,7 @@ import org.olat.ims.qti21.ui.editor.events.AssessmentItemEvent;
 import org.olat.ims.qti21.ui.editor.events.AssessmentSectionEvent;
 import org.olat.ims.qti21.ui.editor.events.AssessmentTestEvent;
 import org.olat.ims.qti21.ui.editor.events.AssessmentTestPartEvent;
-import org.olat.imscp.xml.manifest.ManifestType;
+import org.olat.imscp.xml.manifest.ResourceType;
 import org.olat.modules.qpool.QuestionItemView;
 import org.olat.modules.qpool.ui.SelectItemController;
 import org.olat.modules.qpool.ui.events.QItemViewEvent;
@@ -80,6 +82,7 @@ import org.olat.repository.ui.RepositoryEntryRuntimeController.ToolbarAware;
 import org.springframework.beans.factory.annotation.Autowired;
 
 import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem;
+import uk.ac.ed.ph.jqtiplus.node.item.interaction.Interaction;
 import uk.ac.ed.ph.jqtiplus.node.test.AbstractPart;
 import uk.ac.ed.ph.jqtiplus.node.test.AssessmentItemRef;
 import uk.ac.ed.ph.jqtiplus.node.test.AssessmentSection;
@@ -116,7 +119,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 	
 	private final File unzippedDirRoot;
 	private final RepositoryEntry testEntry;
-	private ManifestType manifest;
+	private ManifestBuilder manifestBuilder;
 	private ResolvedAssessmentTest resolvedAssessmentTest;
 	
 	private final boolean survey = false;
@@ -149,7 +152,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 		FileResourceManager frm = FileResourceManager.getInstance();
 		unzippedDirRoot = frm.unzipFileResource(testEntry.getOlatResource());
 		updateTreeModel();
-		manifest = ManifestPackage.read(new File(unzippedDirRoot, "imsmanifest.xml"));
+		manifestBuilder = ManifestBuilder.read(new File(unzippedDirRoot, "imsmanifest.xml"));
 		
 		//default buttons
 		saveLink = LinkFactory.createToolLink("serialize", translate("serialize"), this, "o_icon_save");
@@ -245,6 +248,7 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 		} else if(event instanceof AssessmentItemEvent) {
 			AssessmentItemEvent aie = (AssessmentItemEvent)event;
 			if(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED.equals(aie.getCommand())) {
+				doUpdateManifest(aie.getAssessmentItemRef(), aie.getAssessmentItem(), aie.getQuestionType());
 				doUpdate(aie.getAssessmentItemRef().getIdentifier(), aie.getAssessmentItem().getTitle());
 			}
 		} else if(selectQItemCtrl == source) {
@@ -411,8 +415,8 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 		File testFile = new File(testUri);
 		qtiService.updateAssesmentObject(testFile, resolvedAssessmentTest);
 
-		ManifestPackage.appendAssessmentItem(itemFile.getName(), manifest);
-		ManifestPackage.write(manifest, new File(unzippedDirRoot, "imsmanifest.xml"));
+		manifestBuilder.appendAssessmentItem(itemFile.getName());
+		manifestBuilder.write(new File(unzippedDirRoot, "imsmanifest.xml"));
 		return itemId;
 	}
 	
@@ -500,8 +504,8 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 			File testFile = new File(testUri);
 			qtiService.updateAssesmentObject(testFile, resolvedAssessmentTest);
 
-			ManifestPackage.appendAssessmentItem(itemFile.getName(), manifest);
-			ManifestPackage.write(manifest, new File(unzippedDirRoot, "imsmanifest.xml"));
+			manifestBuilder.appendAssessmentItem(itemFile.getName());
+			manifestBuilder.write(new File(unzippedDirRoot, "imsmanifest.xml"));
 			
 			updateTreeModel();
 			
@@ -534,6 +538,27 @@ public class AssessmentTestComposerController extends MainLayoutBasicController
 		qtiService.updateAssesmentObject(testFile, resolvedAssessmentTest);
 	}
 	
+	private void doUpdateManifest(AssessmentItemRef ref, AssessmentItem item, QTI21QuestionType questionType) {
+		URI itemUri = resolvedAssessmentTest.getResolvedAssessmentItem(ref).getItemLookup().getSystemId();
+		File itemFile = new File(itemUri);
+		String relativePathToManifest = unzippedDirRoot.toPath().relativize(itemFile.toPath()).toString();
+		
+		ResourceType resource = manifestBuilder.getResourceTypeByHref(relativePathToManifest);
+		if(resource != null) {
+			List<Interaction> interactions = item.getItemBody().findInteractions();
+			List<String> interactionNames = new ArrayList<>(interactions.size());
+			for(Interaction interaction:interactions) {
+				String interactionName = interaction.getQtiClassName();
+				interactionNames.add(interactionName);
+			}
+			manifestBuilder.setQtiMetadata(resource, interactionNames);
+			if(questionType != null) {
+				manifestBuilder.setOpenOLATMetadata(resource, questionType.getPrefix());
+			}
+			manifestBuilder.write(new File(unzippedDirRoot, "imsmanifest.xml"));
+		}
+	}
+	
 	private void doUpdate(Identifier identifier, String newTitle) {
 		TreeNode node = menuTree.getTreeModel()
 				.getNodeById(identifier.toString());
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/ChoiceScoreController.java b/src/main/java/org/olat/ims/qti21/ui/editor/ChoiceScoreController.java
index c3bbc66c4c4186359d0e1f65983167700e02e4ab..de710eb064b17646f3ba4e45f5df9caaa3c23cf3 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/ChoiceScoreController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/ChoiceScoreController.java
@@ -168,7 +168,7 @@ public class ChoiceScoreController extends FormBasicController {
 			itemBuilder.clearMapping();
 		}
 
-		fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem()));
+		fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem(), null));
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/events/AssessmentItemEvent.java b/src/main/java/org/olat/ims/qti21/ui/editor/events/AssessmentItemEvent.java
index deb26732646c0543245633ea7dff78ad729d33f2..3999384c8dda2a66cc20ba0f0516510c90db13b5 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/events/AssessmentItemEvent.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/events/AssessmentItemEvent.java
@@ -20,6 +20,7 @@
 package org.olat.ims.qti21.ui.editor.events;
 
 import org.olat.core.gui.control.Event;
+import org.olat.ims.qti21.model.QTI21QuestionType;
 
 import uk.ac.ed.ph.jqtiplus.node.item.AssessmentItem;
 import uk.ac.ed.ph.jqtiplus.node.test.AssessmentItemRef;
@@ -38,16 +39,25 @@ public class AssessmentItemEvent extends Event {
 	
 	private AssessmentItem item;
 	private AssessmentItemRef itemRef;
-
+	
+	private QTI21QuestionType questionType;
+	
 	public AssessmentItemEvent(String cmd, AssessmentItem item) {
 		super(cmd);
 		this.item = item;
 	}
+
+	public AssessmentItemEvent(String cmd, AssessmentItem item, QTI21QuestionType questionType) {
+		super(cmd);
+		this.item = item;
+		this.questionType = questionType;
+	}
 	
-	public AssessmentItemEvent(String cmd, AssessmentItem item, AssessmentItemRef itemRef) {
+	public AssessmentItemEvent(String cmd, AssessmentItem item, AssessmentItemRef itemRef, QTI21QuestionType questionType) {
 		super(cmd);
 		this.item = item;
 		this.itemRef = itemRef;
+		this.questionType = questionType;
 	}
 
 	public AssessmentItem getAssessmentItem() {
@@ -57,4 +67,8 @@ public class AssessmentItemEvent extends Event {
 	public AssessmentItemRef getAssessmentItemRef() {
 		return itemRef;
 	}
+	
+	public QTI21QuestionType getQuestionType() {
+		return questionType;
+	}
 }
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/EssayEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/EssayEditorController.java
index 490dd22e47bc26c0c27bd9d475737691d8b77203..be4ed7900114ec0bcab263eef0e88ea0fc98f81e 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/EssayEditorController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/EssayEditorController.java
@@ -30,6 +30,7 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.ims.qti21.model.QTI21QuestionType;
 import org.olat.ims.qti21.model.xml.interactions.EssayAssessmentItemBuilder;
 import org.olat.ims.qti21.ui.editor.AssessmentTestEditorController;
 import org.olat.ims.qti21.ui.editor.events.AssessmentItemEvent;
@@ -155,6 +156,6 @@ public class EssayEditorController extends FormBasicController {
 		itemBuilder.setMinStrings(getValue(minWordsEl));
 		itemBuilder.setMaxStrings(getValue(maxWordsEl));
 		
-		fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem()));
+		fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem(), QTI21QuestionType.essay));
 	}
 }
\ No newline at end of file
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/KPrimEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/KPrimEditorController.java
index 3886d091098c5eada33050746781071ac1365dd7..d0329b8cd8f1a7a426f78d73e27da702b841aa59 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/KPrimEditorController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/KPrimEditorController.java
@@ -38,6 +38,7 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.util.Util;
 import org.olat.ims.qti21.QTI21Constants;
+import org.olat.ims.qti21.model.QTI21QuestionType;
 import org.olat.ims.qti21.model.xml.interactions.KPrimAssessmentItemBuilder;
 import org.olat.ims.qti21.ui.editor.AssessmentTestEditorController;
 import org.olat.ims.qti21.ui.editor.events.AssessmentItemEvent;
@@ -188,7 +189,7 @@ public class KPrimEditorController extends FormBasicController {
 			choiceWrapper.setWrong(itemBuilder.isWrong(choiceIdentifier));
 		}
 
-		fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem()));
+		fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem(), QTI21QuestionType.kprim));
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/MultipleChoiceEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/MultipleChoiceEditorController.java
index 42d125fb34891cab2562dfc31666bc910bb3ab9a..25599278e68081e8d91f3c2dd61eb1cc19e838c2 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/MultipleChoiceEditorController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/MultipleChoiceEditorController.java
@@ -39,6 +39,7 @@ import org.olat.core.gui.control.WindowControl;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.ims.qti21.model.IdentifierGenerator;
+import org.olat.ims.qti21.model.QTI21QuestionType;
 import org.olat.ims.qti21.model.xml.AssessmentItemFactory;
 import org.olat.ims.qti21.model.xml.interactions.MultipleChoiceAssessmentItemBuilder;
 import org.olat.ims.qti21.ui.editor.AssessmentTestEditorController;
@@ -217,7 +218,7 @@ public class MultipleChoiceEditorController extends FormBasicController {
 		}
 		itemBuilder.setSimpleChoices(choiceList);
 
-		fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem()));
+		fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem(), QTI21QuestionType.sc));
 	}
 	
 	@Override
diff --git a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/SingleChoiceEditorController.java b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/SingleChoiceEditorController.java
index c48fdf8e328e9d4210bccb06035211e7df9550c2..380acc26509e7a75964d179601528cd30007d272 100644
--- a/src/main/java/org/olat/ims/qti21/ui/editor/interactions/SingleChoiceEditorController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/editor/interactions/SingleChoiceEditorController.java
@@ -38,6 +38,7 @@ import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
+import org.olat.ims.qti21.model.QTI21QuestionType;
 import org.olat.ims.qti21.model.xml.AssessmentItemFactory;
 import org.olat.ims.qti21.model.xml.interactions.SingleChoiceAssessmentItemBuilder;
 import org.olat.ims.qti21.ui.editor.AssessmentTestEditorController;
@@ -212,7 +213,7 @@ public class SingleChoiceEditorController extends FormBasicController {
 		}
 		itemBuilder.setSimpleChoices(choiceList);
 
-		fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem()));
+		fireEvent(ureq, new AssessmentItemEvent(AssessmentItemEvent.ASSESSMENT_ITEM_CHANGED, itemBuilder.getAssessmentItem(), QTI21QuestionType.sc));
 	}
 	
 	@Override
diff --git a/src/test/java/org/olat/gatling/BigAssessmentTestPackageBuilder.java b/src/test/java/org/olat/gatling/BigAssessmentTestPackageBuilder.java
index 092258ff59ed339737334c69d53ca1a5f2796d29..03ac97bcecfec9c1c63edc371b2ddc2255a76756 100644
--- a/src/test/java/org/olat/gatling/BigAssessmentTestPackageBuilder.java
+++ b/src/test/java/org/olat/gatling/BigAssessmentTestPackageBuilder.java
@@ -34,8 +34,7 @@ import org.olat.ims.qti21.model.IdentifierGenerator;
 import org.olat.ims.qti21.model.QTI21QuestionType;
 import org.olat.ims.qti21.model.xml.AssessmentItemFactory;
 import org.olat.ims.qti21.model.xml.AssessmentTestFactory;
-import org.olat.ims.qti21.model.xml.ManifestPackage;
-import org.olat.imscp.xml.manifest.ManifestType;
+import org.olat.ims.qti21.model.xml.ManifestBuilder;
 
 import uk.ac.ed.ph.jqtiplus.JqtiExtensionManager;
 import uk.ac.ed.ph.jqtiplus.node.content.variable.RubricBlock;
@@ -77,14 +76,14 @@ public class BigAssessmentTestPackageBuilder {
 		String date = format.format(new Date());
 		File directory = new File("/HotCoffee/qti/" + date + "/");
 		directory.mkdirs();
-		ManifestType manifestType = ManifestPackage.createEmptyManifest();
+		ManifestBuilder manifest = ManifestBuilder.createAssessmentTestBuilder();
 		System.out.println(directory);
         
 
 		//test
         File testFile = new File(directory, IdentifierGenerator.newAssessmentTestFilename());
 		AssessmentTest assessmentTest = AssessmentTestFactory.createAssessmentTest("Big test " + date);
-        ManifestPackage.appendAssessmentTest(testFile.getName(), manifestType);
+		manifest.appendAssessmentTest(testFile.getName());
 
 		TestPart part = assessmentTest.getTestParts().get(0);
 		part.getAssessmentSections().clear();
@@ -124,7 +123,7 @@ public class BigAssessmentTestPackageBuilder {
 				assessmentItem.setTitle((i+1) + "." + (j+1) + ". Question SC");
 				
 				AssessmentTestFactory.appendAssessmentItem(section, itemFile.getName());
-				ManifestPackage.appendAssessmentItem(itemFile.getName(), manifestType);	
+				manifest.appendAssessmentItem(itemFile.getName());	
 				
 				try(FileOutputStream out = new FileOutputStream(itemFile)) {
 					qtiSerializer.serializeJqtiObject(assessmentItem, out);	
@@ -140,11 +139,7 @@ public class BigAssessmentTestPackageBuilder {
 			log.error("", e);
 		}
 		
-		try(FileOutputStream out = new FileOutputStream(new File(directory, "imsmanifest.xml"))) {
-        	ManifestPackage.write(manifestType, out);
-        } catch(Exception e) {
-        	log.error("", e);
-        }
+		manifest.write(new File(directory, "imsmanifest.xml"));
 	}
 	
 
diff --git a/src/test/java/org/olat/ims/qti21/model/xml/ManifestPackageTest.java b/src/test/java/org/olat/ims/qti21/model/xml/ManifestPackageTest.java
index fc846744221ff75e2df067d67373a4d77f51d028..387b0c574e88976c5dcf4273a9602622ff1da98e 100644
--- a/src/test/java/org/olat/ims/qti21/model/xml/ManifestPackageTest.java
+++ b/src/test/java/org/olat/ims/qti21/model/xml/ManifestPackageTest.java
@@ -26,7 +26,6 @@ import java.util.List;
 
 import org.junit.Assert;
 import org.junit.Test;
-import org.olat.imscp.xml.manifest.ManifestType;
 
 import uk.ac.ed.ph.jqtiplus.utils.contentpackaging.ContentPackageResource;
 import uk.ac.ed.ph.jqtiplus.utils.contentpackaging.ImsManifestException;
@@ -44,9 +43,9 @@ public class ManifestPackageTest {
 	
 	@Test
 	public void makeManifest() throws XmlResourceNotFoundException, ImsManifestException, IOException {
-		ManifestType manifestType = ManifestPackage.createEmptyManifest();
-        String testFilename = ManifestPackage.appendAssessmentTest(manifestType);
-        String itemFilename = ManifestPackage.appendAssessmentItem(manifestType);	
+		ManifestBuilder manifest = ManifestBuilder.createAssessmentTestBuilder();
+        String testFilename = manifest.appendAssessmentTest();
+        String itemFilename = manifest.appendAssessmentItem();	
         Assert.assertNotNull(testFilename);
         Assert.assertNotNull(itemFilename);
         
@@ -57,7 +56,7 @@ public class ManifestPackageTest {
         
         File manifestFile = new File(tmpDir, "imsmanifest.xml");
         FileOutputStream out = new FileOutputStream(manifestFile);
-        ManifestPackage.write(manifestType, out);
+        manifest.write(out);
         out.flush();
         out.close(); 
         
@@ -68,8 +67,8 @@ public class ManifestPackageTest {
         Assert.assertEquals(1, items.size());
         Assert.assertEquals(1, tests.size());
         
-        ManifestType reloadManifestType = ManifestPackage.read(manifestFile);
-        Assert.assertNotNull(reloadManifestType);
+        ManifestBuilder reloadManifest = ManifestBuilder.read(manifestFile);
+        Assert.assertNotNull(reloadManifest);
         
 	}
 }