diff --git a/src/main/java/org/olat/ims/qti/QTI12EditorController.java b/src/main/java/org/olat/ims/qti/QTI12EditorController.java
index 77d5850802ea54a433f56792f868f85ad658f35a..79c74fef617ae94a066d0807a11ccbeef6a243c6 100644
--- a/src/main/java/org/olat/ims/qti/QTI12EditorController.java
+++ b/src/main/java/org/olat/ims/qti/QTI12EditorController.java
@@ -57,6 +57,8 @@ public class QTI12EditorController extends BasicController implements QPoolItemE
 	
 	private final QuestionItem qitem;
 	
+	@Autowired
+	private QTIModule qtiModule;
 	@Autowired
 	private QPoolService qpoolService;
 	private Item item;
@@ -78,7 +80,8 @@ public class QTI12EditorController extends BasicController implements QPoolItemE
 				String mapperUrl = registerMapper(ureq, new VFSContainerMapper(directory));
 				QTIDocument doc = new QTIDocument();
 				QTIEditorPackage qtiPackage = new QTI12ItemEditorPackage(item, doc, mapperUrl, leaf, directory, this);
-				editorsCtrl = new ItemNodeTabbedFormController(item, qtiPackage, ureq, getWindowControl(), false);
+				editorsCtrl = new ItemNodeTabbedFormController(item, qtiPackage, ureq, getWindowControl(),
+						false, qtiModule.isEditResourcesEnabled());
 				editorsCtrl.addTabs(mainPanel);
 				listenTo(editorsCtrl);
 			}
diff --git a/src/main/java/org/olat/ims/qti/QTIModule.java b/src/main/java/org/olat/ims/qti/QTIModule.java
index 99f7edf75669e47f77515882fdd9ddcf94da9a21..efa248150a9d5dc205df1781e875db7c5469dc21 100644
--- a/src/main/java/org/olat/ims/qti/QTIModule.java
+++ b/src/main/java/org/olat/ims/qti/QTIModule.java
@@ -26,7 +26,6 @@
 package org.olat.ims.qti;
 
 import org.olat.core.configuration.AbstractSpringModule;
-import org.olat.core.util.StringHelper;
 import org.olat.core.util.coordinate.CoordinatorManager;
 import org.olat.ims.qti.repository.handlers.QTISurveyHandler;
 import org.olat.ims.qti.repository.handlers.QTITestHandler;
@@ -42,14 +41,13 @@ import org.springframework.stereotype.Service;
  */
 @Service
 public class QTIModule extends AbstractSpringModule {
-	
-	private static final String CREATE_RESOURCES_ENABLED = "qti12.create.resources.enabled";
-	private static final String CREATE_SURVEY_RESOURCES_ENABLED = "qti12.create.survey.resources.enabled";
 
 	@Value("${qti12.create.resources.enabled:false}")
 	private boolean createResourcesEnabled;
 	@Value("${qti12.survey.create.resources.enabled:false}")
 	private boolean createSurveyResourcesEnabled;
+	@Value("${qti12.edit.resources.enabled:false}")
+	private boolean createEditResourcesEnabled;
 
 	@Autowired
 	public QTIModule(CoordinatorManager coordinatorManager) {
@@ -65,32 +63,18 @@ public class QTIModule extends AbstractSpringModule {
 
 	@Override
 	protected void initFromChangedProperties() {
-		String createResourceEnabledObj = getStringPropertyValue(CREATE_RESOURCES_ENABLED, true);
-		if(StringHelper.containsNonWhitespace(createResourceEnabledObj)) {
-			createResourcesEnabled = "true".equals(createResourceEnabledObj);
-		}
-		
-		String createSurveyResourceObj = getStringPropertyValue(CREATE_SURVEY_RESOURCES_ENABLED, true);
-		if(StringHelper.containsNonWhitespace(createSurveyResourceObj)) {
-			createSurveyResourcesEnabled = "true".equals(createSurveyResourceObj);
-		}
+		//
 	}
 
 	public boolean isCreateResourcesEnabled() {
 		return createResourcesEnabled;
 	}
-
-	public void setCreateResourcesEnabled(boolean enabled) {
-		createResourcesEnabled = enabled;
-		setStringProperty(CREATE_RESOURCES_ENABLED, enabled ? "true" : "false", true);
-	}
 	
 	public boolean isCreateSurveyResourcesEnabled() {
 		return createSurveyResourcesEnabled;
 	}
-
-	public void setCreateSurveyResourcesEnabled(boolean enabled) {
-		createSurveyResourcesEnabled = enabled;
-		setStringProperty(CREATE_SURVEY_RESOURCES_ENABLED, enabled ? "true" : "false", true);
+	
+	public boolean isEditResourcesEnabled() {
+		return createEditResourcesEnabled;
 	}
 }
diff --git a/src/main/java/org/olat/ims/qti/editor/AssessmentController.java b/src/main/java/org/olat/ims/qti/editor/AssessmentController.java
index 558688950125e28cd06d51961dd619b3b7de45c4..005e6563b797a7f39b2d6dd1a5a6ae25f986b9cb 100644
--- a/src/main/java/org/olat/ims/qti/editor/AssessmentController.java
+++ b/src/main/java/org/olat/ims/qti/editor/AssessmentController.java
@@ -52,7 +52,8 @@ public class AssessmentController extends TabbableDefaultController implements C
 	private Assessment assessment;
 	private QTIEditorPackage qtiPackage;
 	private boolean surveyMode = false;
-	private boolean restrictedEdit;
+	private final boolean restrictedEdit;
+	private final boolean  blockedEdit;
 
 	/**
 	 * @param assessment
@@ -61,10 +62,11 @@ public class AssessmentController extends TabbableDefaultController implements C
 	 * @param wControl
 	 */
 	public AssessmentController(Assessment assessment, QTIEditorPackage qtiPackage, UserRequest ureq, WindowControl wControl,
-			boolean restrictedEdit) {
+			boolean restrictedEdit, boolean blockedEdit) {
 		super(ureq, wControl);
 
 		this.restrictedEdit = restrictedEdit;
+		this.blockedEdit = blockedEdit;
 		this.assessment = assessment;
 		this.qtiPackage = qtiPackage;
 				
@@ -90,6 +92,7 @@ public class AssessmentController extends TabbableDefaultController implements C
 		main.contextPut("mediaBaseURL", qtiPackage.getMediaBaseURL());
 		main.contextPut("control", QTIEditHelper.getControl(assessment));
 		main.contextPut("isRestrictedEdit", restrictedEdit ? Boolean.TRUE : Boolean.FALSE);
+		main.contextPut("isBlockedEdit", Boolean.valueOf(blockedEdit));
 		surveyMode = qtiPackage.getQTIDocument().isSurvey();
 		main.contextPut("isSurveyMode", surveyMode ? "true" : "false");
 
@@ -138,7 +141,7 @@ public class AssessmentController extends TabbableDefaultController implements C
 					assessment.setObjectives(newObjectives);
 				}
 				//
-				if (!surveyMode && !restrictedEdit) {
+				if (!surveyMode && !restrictedEdit && !blockedEdit) {
 					//ordering
 					assessment.getSelection_ordering().setOrderType(ureq.getParameter("order_type"));
 					assessment.getSelection_ordering().setSelectionNumber(ureq.getParameter("selection_number"));
diff --git a/src/main/java/org/olat/ims/qti/editor/ChoiceItemController.java b/src/main/java/org/olat/ims/qti/editor/ChoiceItemController.java
index e4eb761f73d5818314229e950d85032db950cc77..683d5f81194b5112bcac2511b7e1089fb6386801 100644
--- a/src/main/java/org/olat/ims/qti/editor/ChoiceItemController.java
+++ b/src/main/java/org/olat/ims/qti/editor/ChoiceItemController.java
@@ -60,7 +60,8 @@ public class ChoiceItemController extends BasicController implements ControllerE
 	private Item item;
 	private QTIEditorPackage qtiPackage;
 	private DialogBoxController delYesNoCtrl;
-	private boolean restrictedEdit;
+	private final boolean restrictedEdit;
+	private final boolean blockedEdit;
 	private Material editQuestion;
 	private Response editResponse;
 	private CloseableModalController dialogCtr;
@@ -73,10 +74,12 @@ public class ChoiceItemController extends BasicController implements ControllerE
 	 * @param wControl
 	 */
 	public ChoiceItemController(UserRequest ureq, WindowControl wControl,
-			Item item, QTIEditorPackage qtiPackage, Translator trnsltr, boolean restrictedEdit) {
+			Item item, QTIEditorPackage qtiPackage, Translator trnsltr,
+			boolean restrictedEdit, boolean blockedEdit) {
 		super(ureq, wControl, trnsltr);
 
 		this.restrictedEdit = restrictedEdit;
+		this.blockedEdit = blockedEdit;
 		this.item = item;
 		this.qtiPackage = qtiPackage;
 		
@@ -90,6 +93,7 @@ public class ChoiceItemController extends BasicController implements ControllerE
 		main.contextPut("question", item.getQuestion());
 		main.contextPut("isSurveyMode", qtiPackage.getQTIDocument().isSurvey() ? "true" : "false");
 		main.contextPut("isRestrictedEdit", restrictedEdit ? Boolean.TRUE : Boolean.FALSE);
+		main.contextPut("isBlockedEdit", Boolean.valueOf(blockedEdit));
 		
 		String mediaBaseUrl = qtiPackage.getMediaBaseURL();
 		if(mediaBaseUrl != null && !mediaBaseUrl.startsWith("http")) {
@@ -100,10 +104,6 @@ public class ChoiceItemController extends BasicController implements ControllerE
 		putInitialPanel(main);
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.components.Component, org.olat.core.gui.control.Event)
-	 */
 	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
 		if (source == main) {
@@ -129,14 +129,14 @@ public class ChoiceItemController extends BasicController implements ControllerE
 				}
 			} else if (cmd.equals("editq")) {
 				editQuestion = item.getQuestion().getQuestion();
-				displayMaterialFormController(ureq, editQuestion, restrictedEdit,
+				displayMaterialFormController(ureq, editQuestion,
 						translate("fieldset.legend.question"));
 			} else if (cmd.equals("editr")) {
 				List<Response> elements = item.getQuestion().getResponses();
 				if(posid >= 0 && posid < elements.size()) {
 					editResponse = elements.get(posid);
 					Material responseMat = editResponse.getContent();
-					displayMaterialFormController(ureq, responseMat, restrictedEdit,
+					displayMaterialFormController(ureq, responseMat,
 							translate("fieldset.legend.answers"));
 				}
 			} else if (cmd.equals("addchoice")) {
@@ -154,7 +154,7 @@ public class ChoiceItemController extends BasicController implements ControllerE
 				delYesNoCtrl.setUserObject(new Integer(posid));
 				delYesNoCtrl.activate();
 			} else if (cmd.equals("ssc")) { // submit sc
-				if(!restrictedEdit) {
+				if(!restrictedEdit && !blockedEdit) {
 					ChoiceQuestion question = (ChoiceQuestion) item.getQuestion();
 					List<Response> q_choices = question.getResponses();
 					String correctChoice = ureq.getParameter("correctChoice");
@@ -182,7 +182,7 @@ public class ChoiceItemController extends BasicController implements ControllerE
 					question.setSingleCorrectScore(sc);
 				}
 			} else if (cmd.equals("smc")) { // submit mc
-				if(!restrictedEdit) {
+				if(!restrictedEdit && !blockedEdit) {
 					ChoiceQuestion question = (ChoiceQuestion) item.getQuestion();
 					List<Response> choices = question.getResponses();
 					boolean hasZeroPointChoice = false;
@@ -212,7 +212,7 @@ public class ChoiceItemController extends BasicController implements ControllerE
 					}
 				}
 			} else if (cmd.equals("skprim")) { // submit kprim
-				if(!restrictedEdit) {
+				if(!restrictedEdit && !blockedEdit) {
 					float maxValue = 0;
 					try {
 						maxValue = Float.parseFloat(ureq.getParameter("max_value"));
@@ -238,10 +238,6 @@ public class ChoiceItemController extends BasicController implements ControllerE
 		}
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
-	 */
 	@Override
 	public void event(UserRequest ureq, Controller controller, Event event) {
 		if (controller == matFormCtr) {
@@ -300,8 +296,8 @@ public class ChoiceItemController extends BasicController implements ControllerE
 	 * @param mat
 	 * @param isRestrictedEditMode
 	 */
-	private void displayMaterialFormController(UserRequest ureq, Material mat, boolean isRestrictedEditMode, String title) {
-		matFormCtr = new MaterialFormController(ureq, getWindowControl(), mat, qtiPackage, isRestrictedEditMode);
+	private void displayMaterialFormController(UserRequest ureq, Material mat, String title) {
+		matFormCtr = new MaterialFormController(ureq, getWindowControl(), mat, qtiPackage, restrictedEdit, blockedEdit);
 		matFormCtr.addControllerListener(this);
 		dialogCtr = new CloseableModalController(getWindowControl(), "close",
 				matFormCtr.getInitialComponent(), true, title);
@@ -309,9 +305,6 @@ public class ChoiceItemController extends BasicController implements ControllerE
 		dialogCtr.activate();
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
-	 */
 	@Override
 	protected void doDispose() {
 		item = null;
diff --git a/src/main/java/org/olat/ims/qti/editor/EssayItemController.java b/src/main/java/org/olat/ims/qti/editor/EssayItemController.java
index 5a94d73ecafa32285c62a577898a6685adf523dd..29b4ae0d255c4e71e2cfe6cade8c06d53c221667 100644
--- a/src/main/java/org/olat/ims/qti/editor/EssayItemController.java
+++ b/src/main/java/org/olat/ims/qti/editor/EssayItemController.java
@@ -53,7 +53,8 @@ public class EssayItemController extends BasicController implements ControllerEv
 	private Item item;
 	private EssayQuestion essayQuestion;
 	private QTIEditorPackage qtiPackage;
-	private boolean restrictedEdit;
+	private final boolean restrictedEdit;
+	private final boolean blockedEdit;
 	private CloseableModalController dialogCtr;
 	private MaterialFormController matFormCtr;
 
@@ -63,11 +64,13 @@ public class EssayItemController extends BasicController implements ControllerEv
 	 * @param trnsltr
 	 * @param wControl
 	 */
-	public EssayItemController(UserRequest ureq, WindowControl wControl, Item item, QTIEditorPackage qtiPackage, Translator trnsltr,  boolean restrictedEdit) {
+	public EssayItemController(UserRequest ureq, WindowControl wControl, Item item, QTIEditorPackage qtiPackage, Translator trnsltr,
+			boolean restrictedEdit, boolean blockedEdit) {
 		super(ureq, wControl);
 		setTranslator(trnsltr);
 
 		this.restrictedEdit = restrictedEdit;
+		this.blockedEdit = blockedEdit;
 		this.item = item;
 		this.qtiPackage = qtiPackage;
 		this.trnsltr = trnsltr;
@@ -81,21 +84,17 @@ public class EssayItemController extends BasicController implements ControllerEv
 		}
 		main.contextPut("mediaBaseURL", mediaBaseUrl);
 		main.contextPut("isRestrictedEdit", restrictedEdit ? Boolean.TRUE : Boolean.FALSE);
+		main.contextPut("isBlockedEdit", Boolean.valueOf(blockedEdit));
 		main.contextPut("isSurveyMode", qtiPackage.getQTIDocument().isSurvey() ? "true" : "false");
 		putInitialPanel(main);
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.components.Component, org.olat.core.gui.control.Event)
-	 */
 	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
 		if (source == main) {
 			String cmd = event.getCommand();
 			if (cmd.equals("editq")) {
-				displayMaterialFormController(ureq, item.getQuestion().getQuestion(), restrictedEdit);
-
+				displayMaterialFormController(ureq, item.getQuestion().getQuestion());
 			} else if (cmd.equals("sessay")) { // submit essay
 				main.setDirty(true);
 				
@@ -155,10 +154,6 @@ public class EssayItemController extends BasicController implements ControllerEv
 		}
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
-	 */
 	@Override
 	public void event(UserRequest ureq, Controller controller, Event event) {
 		if (controller == matFormCtr) {
@@ -199,18 +194,15 @@ public class EssayItemController extends BasicController implements ControllerEv
 	 * @param ureq
 	 * @param mat
 	 */
-	private void displayMaterialFormController(UserRequest ureq, Material mat, boolean isRestrictedEditMode) {
-		matFormCtr = new MaterialFormController(ureq, getWindowControl(), mat, qtiPackage, isRestrictedEditMode);
+	private void displayMaterialFormController(UserRequest ureq, Material mat) {
+		matFormCtr = new MaterialFormController(ureq, getWindowControl(), mat, qtiPackage, restrictedEdit, blockedEdit);
 		matFormCtr.addControllerListener(this);
 		dialogCtr = new CloseableModalController(getWindowControl(), "close",
 				matFormCtr.getInitialComponent(), true, trnsltr.translate("fieldset.legend.question"));
 		matFormCtr.addControllerListener(dialogCtr);
 		dialogCtr.activate();
 	}
-	
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
-	 */
+
 	@Override
 	protected void doDispose() {
 		item = null;
diff --git a/src/main/java/org/olat/ims/qti/editor/FIBItemController.java b/src/main/java/org/olat/ims/qti/editor/FIBItemController.java
index 7595021d4eebd1b9b52793736040e54249c05daa..9049696e5d4bcc5fc8fc3fef726316bacefc1a55 100644
--- a/src/main/java/org/olat/ims/qti/editor/FIBItemController.java
+++ b/src/main/java/org/olat/ims/qti/editor/FIBItemController.java
@@ -63,6 +63,7 @@ public class FIBItemController extends BasicController implements ControllerEven
 	private boolean surveyMode = false;
 	private DialogBoxController delYesNoCtrl;
 	private boolean restrictedEdit;
+	private boolean blockedEdit;
 	private Material editQuestion;
 	private Response editResponse;
 	private CloseableModalController dialogCtr;
@@ -75,10 +76,11 @@ public class FIBItemController extends BasicController implements ControllerEven
 	 * @param wControl
 	 */
 	public FIBItemController(UserRequest ureq, WindowControl wControl,
-			Item item, QTIEditorPackage qtiPackage, Translator trnsltr,  boolean restrictedEdit) {
+			Item item, QTIEditorPackage qtiPackage, Translator trnsltr,  boolean restrictedEdit, boolean blockedEdit) {
 		super(ureq, wControl, trnsltr);
 
 		this.restrictedEdit = restrictedEdit;
+		this.blockedEdit = blockedEdit;
 		this.item = item;
 		this.qtiPackage = qtiPackage;
 		main = createVelocityContainer("fibitem", "tab_fibItem");
@@ -86,6 +88,7 @@ public class FIBItemController extends BasicController implements ControllerEven
 		surveyMode = qtiPackage.getQTIDocument().isSurvey();
 		main.contextPut("isSurveyMode", surveyMode ? "true" : "false");
 		main.contextPut("isRestrictedEdit", restrictedEdit ? Boolean.TRUE : Boolean.FALSE);
+		main.contextPut("isBlockedEdit", Boolean.valueOf(blockedEdit));
 		
 		String mediaBaseUrl = qtiPackage.getMediaBaseURL();
 		if(mediaBaseUrl != null && !mediaBaseUrl.startsWith("http")) {
@@ -126,14 +129,14 @@ public class FIBItemController extends BasicController implements ControllerEven
 				}
 			} else if (cmd.equals("editq")) {
 				editQuestion = item.getQuestion().getQuestion();
-				displayMaterialFormController(ureq, editQuestion, restrictedEdit);
+				displayMaterialFormController(ureq, editQuestion);
 
 			} else if (cmd.equals("editr")) {
 				List<Response> elements = item.getQuestion().getResponses();
 				if (posid >= 0 && posid < elements.size()) {
 					editResponse = elements.get(posid);
 					Material responseMat = elements.get(posid).getContent();
-					displayMaterialFormController(ureq, responseMat, restrictedEdit);
+					displayMaterialFormController(ureq, responseMat);
 				} else {
 					logError("posid doesn't match responses length: " + posid + "/" + elements.size(), null);
 				}
@@ -298,18 +301,15 @@ public class FIBItemController extends BasicController implements ControllerEven
 	 * @param mat
 	 * @param isRestrictedEditMode
 	 */
-	private void displayMaterialFormController(UserRequest ureq, Material mat, boolean isRestrictedEditMode) {
-		matFormCtr = new MaterialFormController(ureq, getWindowControl(), mat, qtiPackage, isRestrictedEditMode);
+	private void displayMaterialFormController(UserRequest ureq, Material mat) {
+		matFormCtr = new MaterialFormController(ureq, getWindowControl(), mat, qtiPackage, restrictedEdit, blockedEdit);
 		matFormCtr.addControllerListener(this);
 		dialogCtr = new CloseableModalController(getWindowControl(), "close",
 				matFormCtr.getInitialComponent(), true, translate("questionform_answer"));
 		matFormCtr.addControllerListener(dialogCtr);
 		dialogCtr.activate();
 	}	
-	
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
-	 */
+
 	@Override
 	protected void doDispose() {
 		main = null;
diff --git a/src/main/java/org/olat/ims/qti/editor/FeedbackFormController.java b/src/main/java/org/olat/ims/qti/editor/FeedbackFormController.java
index 53fd079abe654087546c6c1ae6a85cfe099d2c7b..8e468f629080e0e75a1c018db9002729b9128288 100644
--- a/src/main/java/org/olat/ims/qti/editor/FeedbackFormController.java
+++ b/src/main/java/org/olat/ims/qti/editor/FeedbackFormController.java
@@ -62,20 +62,21 @@ public class FeedbackFormController extends FormBasicController {
 	private final Item item;
 	private final QTIEditorPackage qtiPackage;
 	private final boolean isRestrictedEditMode;
+	private final boolean isBlockedEditMode;
 	private CloseableModalController dialogCtr;
 	private MaterialFormController materialCtr;
 	private SingleSelection feedbackSwitch;
 	private Control control;
-	private HashMap<Material, RichTextElement> textElements = new HashMap<Material, RichTextElement>();
-	private HashMap<Material, String> identities = new HashMap<Material, String>();
-	private HashMap<RichTextElement, Material> materialsByText = new HashMap<RichTextElement, Material>();
-	private HashMap<FormLink, Material> materialsByLink = new HashMap<FormLink, Material>();
+	private HashMap<Material, RichTextElement> textElements = new HashMap<>();
+	private HashMap<Material, String> identities = new HashMap<>();
+	private HashMap<RichTextElement, Material> materialsByText = new HashMap<>();
+	private HashMap<FormLink, Material> materialsByLink = new HashMap<>();
 	private FormLayoutContainer overallFeedbackLayout, responseLevelHintsLayout;
 	private String mediaBaseUrl;
 	private Material masteryMat, failureMat;
 
 	public FeedbackFormController(UserRequest ureq, WindowControl wControl, QTIEditorPackage qtiPackage, Item item,
-			boolean isRestrictedEditMode) {
+			boolean isRestrictedEditMode, boolean isBlockedEditMode) {
 		super(ureq, wControl, FormBasicController.LAYOUT_VERTICAL);
 		this.qtiPackage = qtiPackage;
 		this.item = item;
@@ -83,20 +84,16 @@ public class FeedbackFormController extends FormBasicController {
 
 		control = QTIEditHelper.getControl(item);
 		this.isRestrictedEditMode = isRestrictedEditMode;
+		this.isBlockedEditMode = isBlockedEditMode;
 		initForm(ureq);
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#doDispose()
-	 */
+	@Override
 	protected void doDispose() {
 	// nothing so far
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
-	 */
+	@Override
 	protected void event(UserRequest ureq, Controller source, Event event) {
 		if (source == materialCtr) {
 			if (event instanceof QTIObjectBeforeChangeEvent) {
@@ -140,23 +137,17 @@ public class FeedbackFormController extends FormBasicController {
 		}
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#formOK(org.olat.core.gui.UserRequest)
-	 */
+	@Override
 	protected void formOK(UserRequest ureq) {
 	// there's no submit button in this form
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#formInnerEvent(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.components.form.flexible.FormItem,
-	 *      org.olat.core.gui.components.form.flexible.impl.FormEvent)
-	 */
+	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if (source instanceof RichTextElement) {
-			displayMaterialFormController(ureq, materialsByText.get(source), isRestrictedEditMode);
+			displayMaterialFormController(ureq, materialsByText.get(source));
 		} else if (source instanceof FormLink) {
-			displayMaterialFormController(ureq, materialsByLink.get(source), isRestrictedEditMode);
+			displayMaterialFormController(ureq, materialsByLink.get(source));
 		} else if (source == feedbackSwitch) {
 			// feedbackSwitch takes values in {0 = on/yes, 1 = off/no}
 			// control.feedback takes values in {0 = undef, 1 = on, 2 = off}
@@ -200,6 +191,7 @@ public class FeedbackFormController extends FormBasicController {
 
 		feedbackSwitch = uifactory.addRadiosHorizontal("feedbackswitch", switchLayout, yesNoKeys, yesNoValues);
 		feedbackSwitch.addActionListener(FormEvent.ONCLICK);
+		feedbackSwitch.setEnabled(!isBlockedEditMode);
 		if (control.isFeedback()) {
 			feedbackSwitch.select(yesNoKeys[0], true);
 		} else {
@@ -246,7 +238,7 @@ public class FeedbackFormController extends FormBasicController {
 		registerFeedbackElement(failureMat, failureFeedback, failureLink);
 
 		// Feedback for each response when single or multiple choice question
-		List<Material> responses = new ArrayList<Material>();
+		List<Material> responses = new ArrayList<>();
 		boolean hasResponseLevelHints = false;
 		if (item.getQuestion().getType() <= Question.TYPE_MC) {
 			int i = 1;
@@ -261,6 +253,7 @@ public class FeedbackFormController extends FormBasicController {
 						getWindowControl());
 				responseHintText.getEditorConfiguration().setFigCaption(false);
 				FormLink link = uifactory.addFormLink("link_" + i, responseLevelHintsLayout, Link.NONTRANSLATED + Link.LINK_CUSTOM_CSS);
+				link.setEnabled(!isBlockedEditMode);
 				link.getComponent().setCustomDisplayText(" ");
 				link.getComponent().setIconLeftCSS("o_icon o_icon_edit o_icon-lg");
 				registerFeedbackElement(responseFeedbackMat, responseHintText, link);
@@ -292,6 +285,7 @@ public class FeedbackFormController extends FormBasicController {
 		textElement.getEditorConfiguration().setInvalidElements(RichTextConfiguration.INVALID_ELEMENTS_FORM_FULL_VALUE_UNSAVE_WITH_SCRIPT);
 		textElement.getEditorConfiguration().setExtendedValidElements("script[src,type,defer]");
 		
+		link.setVisible(!isBlockedEditMode);
 		materialsByText.put(textElement, mat);
 		materialsByLink.put(link, mat);
 	}
@@ -303,8 +297,8 @@ public class FeedbackFormController extends FormBasicController {
 	 * @param mat
 	 * @param isRestrictedEditMode
 	 */
-	private void displayMaterialFormController(UserRequest ureq, Material mat, boolean isRestrictedEditMode) {
-		materialCtr = new MaterialFormController(ureq, getWindowControl(), mat, qtiPackage, isRestrictedEditMode);
+	private void displayMaterialFormController(UserRequest ureq, Material mat) {
+		materialCtr = new MaterialFormController(ureq, getWindowControl(), mat, qtiPackage, isRestrictedEditMode, isBlockedEditMode);
 		listenTo(materialCtr);
 		dialogCtr = new CloseableModalController(getWindowControl(), "close", materialCtr.getInitialComponent());
 		listenTo(dialogCtr);
diff --git a/src/main/java/org/olat/ims/qti/editor/ItemMetadataFormController.java b/src/main/java/org/olat/ims/qti/editor/ItemMetadataFormController.java
index ccbc306efee3bcf9efdd83d4f675a6f1a38e7ac2..3a12b2feeaa789dd09f0a9039ede6fe73cea6258 100644
--- a/src/main/java/org/olat/ims/qti/editor/ItemMetadataFormController.java
+++ b/src/main/java/org/olat/ims/qti/editor/ItemMetadataFormController.java
@@ -54,34 +54,31 @@ import org.olat.ims.qti.editor.beecom.objects.Question;
 public class ItemMetadataFormController extends FormBasicController {
 
 	private Item item;
-	private boolean isSurvey, isRestrictedEditMode;
+	private boolean isSurvey, isRestrictedEditMode, isBlockedEdit;
 	private TextElement title;
 	private RichTextElement desc, hint, solution;
 	private SingleSelection layout, limitAttempts, limitTime, shuffle, showHints, showSolution;
 	private IntegerElement attempts, timeMin, timeSec;
 	private final QTIEditorPackage qti;
 
-	public ItemMetadataFormController(UserRequest ureq, WindowControl control, Item item, QTIEditorPackage qti, boolean restrictedEdit) {
+	public ItemMetadataFormController(UserRequest ureq, WindowControl control, Item item, QTIEditorPackage qti,
+			boolean restrictedEdit, boolean blockeEdit) {
 		super(ureq, control);
 		this.item = item;
 		this.qti = qti;
 		this.isSurvey = qti.getQTIDocument().isSurvey();
 		this.isRestrictedEditMode = restrictedEdit;
+		this.isBlockedEdit = blockeEdit;
 		initForm(ureq);
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#doDispose()
-	 */
+	@Override
 	protected void doDispose() {
 	// still to come
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#formInnerEvent(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.components.form.flexible.FormItem,
-	 *      org.olat.core.gui.components.form.flexible.impl.FormEvent)
-	 */
+
+	@Override
 	protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) {
 		if (source == limitAttempts) {
 			toggle(attempts);
@@ -141,7 +138,7 @@ public class ItemMetadataFormController extends FormBasicController {
 		if (layout != null && q instanceof ChoiceQuestion) {
 			((ChoiceQuestion) q).setFlowLabelClass("h".equals(layout.getSelectedKey()) ? ChoiceQuestion.BLOCK : ChoiceQuestion.LIST);
 		}
-		if (!isSurvey && !isRestrictedEditMode) {
+		if (!isSurvey && !isRestrictedEditMode && !isBlockedEdit) {
 			q.setShuffle(shuffle.getSelected() == 0);
 			Control itemControl = item.getItemcontrols().get(0);
 			itemControl.setFeedback(itemControl.getFeedback() == Control.CTRL_UNDEF ? Control.CTRL_NO : itemControl.getFeedback());
@@ -187,6 +184,7 @@ public class ItemMetadataFormController extends FormBasicController {
 		title = uifactory.addTextElement("title", "form.imd.title", -1, item.getTitle(), formLayout);
 		title.setMandatory(true);
 		title.setNotEmptyCheck("form.imd.error.empty.title");
+		title.setEnabled(!isBlockedEdit);
 
 		// Question Type
 		String typeName = getType();
@@ -196,6 +194,7 @@ public class ItemMetadataFormController extends FormBasicController {
 		desc = uifactory.addRichTextElementForStringData("desc", "form.imd.descr", item.getObjectives(), 8, -1, true, null, null,
 				formLayout, ureq.getUserSession(), getWindowControl());
 		desc.getEditorConfiguration().setFigCaption(false);
+		desc.setEnabled(!isBlockedEdit);
 		RichTextConfiguration richTextConfig = desc.getEditorConfiguration();
 		// set upload dir to the media dir
 		richTextConfig.setFileBrowserUploadRelPath("media");
@@ -217,10 +216,10 @@ public class ItemMetadataFormController extends FormBasicController {
 
 			// Attempts
 			limitAttempts = uifactory.addRadiosHorizontal("form.imd.limittries", formLayout, yesnoKeys, yesnoValues);
-			limitAttempts.setEnabled(!isRestrictedEditMode);
+			limitAttempts.setEnabled(!isRestrictedEditMode && !isBlockedEdit);
 			limitAttempts.addActionListener(FormEvent.ONCLICK); // Radios/Checkboxes need onclick because of IE bug OLAT-5753
 			attempts = uifactory.addIntegerElement("form.imd.tries", 0, formLayout);
-			attempts.setEnabled(!isRestrictedEditMode);
+			attempts.setEnabled(!isRestrictedEditMode && !isBlockedEdit);
 			attempts.setDisplaySize(3);
 			if (item.getMaxattempts() > 0) {
 				limitAttempts.select("y", true);
@@ -233,12 +232,12 @@ public class ItemMetadataFormController extends FormBasicController {
 			// Time Limit
 			limitTime = uifactory.addRadiosHorizontal("form.imd.limittime", formLayout, yesnoKeys, yesnoValues);
 			limitTime.addActionListener(FormEvent.ONCLICK); // Radios/Checkboxes need onclick because of IE bug OLAT-5753
-			limitTime.setEnabled(!isRestrictedEditMode);
+			limitTime.setEnabled(!isRestrictedEditMode && !isBlockedEdit);
 			timeMin = uifactory.addIntegerElement("form.imd.time.min", 0, formLayout);
-			timeMin.setEnabled(!isRestrictedEditMode);
+			timeMin.setEnabled(!isRestrictedEditMode && !isBlockedEdit);
 			timeMin.setDisplaySize(3);
 			timeSec = uifactory.addIntegerElement("form.imd.time.sek", 0, formLayout);
-			timeSec.setEnabled(!isRestrictedEditMode);
+			timeSec.setEnabled(!isRestrictedEditMode && !isBlockedEdit);
 			timeSec.setDisplaySize(3);
 			if (item.getDuration() != null && item.getDuration().isSet()) {
 				limitTime.select("y", true);
@@ -252,7 +251,7 @@ public class ItemMetadataFormController extends FormBasicController {
 
 			// Shuffle Answers
 			shuffle = uifactory.addRadiosHorizontal("shuffle", "form.imd.shuffle", formLayout, yesnoKeys, yesnoValues);
-			shuffle.setEnabled(!isRestrictedEditMode);
+			shuffle.setEnabled(!isRestrictedEditMode && !isBlockedEdit);
 			shuffle.setVisible(t != Question.TYPE_ESSAY && t != Question.TYPE_FIB);
 			if (item.getQuestion().isShuffle()) {
 				shuffle.select("y", true);
@@ -263,13 +262,13 @@ public class ItemMetadataFormController extends FormBasicController {
 			// Hints
 			Control itemControl = item.getItemcontrols().get(0);
 			showHints = uifactory.addRadiosHorizontal("showHints", "form.imd.solutionhints.show", formLayout, yesnoKeys, yesnoValues);
-			showHints.setEnabled(!isRestrictedEditMode);
+			showHints.setEnabled(!isRestrictedEditMode && !isBlockedEdit);
 			showHints.addActionListener(FormEvent.ONCLICK); // Radios/Checkboxes need onclick because of IE bug OLAT-5753
 			showHints.setVisible(t != Question.TYPE_ESSAY);
 
 			hint = uifactory.addRichTextElementForStringData("hint", "form.imd.solutionhints", item.getQuestion().getHintText(), 8, -1,
 					true, qti.getBaseDir(), null, formLayout, ureq.getUserSession(), getWindowControl());
-			hint.setEnabled(!isRestrictedEditMode);
+			hint.setEnabled(!isRestrictedEditMode && !isBlockedEdit);
 			hint.getEditorConfiguration().setFigCaption(false);
 			// set upload dir to the media dir
 			hint.getEditorConfiguration().setFileBrowserUploadRelPath("media");
@@ -282,14 +281,14 @@ public class ItemMetadataFormController extends FormBasicController {
 
 			// Solution
 			showSolution = uifactory.addRadiosHorizontal("showSolution", "form.imd.correctsolution.show", formLayout, yesnoKeys, yesnoValues);
-			showSolution.setEnabled(!isRestrictedEditMode);
+			showSolution.setEnabled(!isRestrictedEditMode && !isBlockedEdit);
 			showSolution.addActionListener(FormEvent.ONCLICK); // Radios/Checkboxes need onclick because of IE bug OLAT-5753
 			
 			boolean essay = (q.getType() == Question.TYPE_ESSAY);
 			String solLabel = essay ? "form.imd.correctsolution.word" : "form.imd.correctsolution";
 			solution = uifactory.addRichTextElementForStringData("solution", solLabel, item.getQuestion().getSolutionText(), 8,
 					-1, true, qti.getBaseDir(), null, formLayout, ureq.getUserSession(), getWindowControl());
-			solution.setEnabled(!isRestrictedEditMode);
+			solution.setEnabled(!isRestrictedEditMode && !isBlockedEdit);
 			solution.getEditorConfiguration().setFigCaption(false);
 			// set upload dir to the media dir
 			solution.getEditorConfiguration().setFileBrowserUploadRelPath("media");
@@ -303,7 +302,9 @@ public class ItemMetadataFormController extends FormBasicController {
 			}
 		}
 		// Submit Button
-		uifactory.addFormSubmitButton("submit", formLayout);
+		if(!isBlockedEdit) {
+			uifactory.addFormSubmitButton("submit", formLayout);
+		}
 	}
 
 	/**
diff --git a/src/main/java/org/olat/ims/qti/editor/ItemNodeTabbedFormController.java b/src/main/java/org/olat/ims/qti/editor/ItemNodeTabbedFormController.java
index 1bc3e26fab5d88e387d9f8afb09fa5441ccfd3d7..f6104ffb9912de4b5e2c91b6c4a6b5da101d4465 100644
--- a/src/main/java/org/olat/ims/qti/editor/ItemNodeTabbedFormController.java
+++ b/src/main/java/org/olat/ims/qti/editor/ItemNodeTabbedFormController.java
@@ -52,7 +52,8 @@ public class ItemNodeTabbedFormController extends TabbableDefaultController {
 	private FeedbackFormController feedbackCtr;
 	private Panel feedbackPanel = new Panel("feedbackPanel");
 
-	private boolean restrictedEdit;
+	private final boolean restrictedEdit;
+	private final boolean blockedEdit;
 	
 	/**
 	 * @param item
@@ -61,10 +62,11 @@ public class ItemNodeTabbedFormController extends TabbableDefaultController {
 	 * @param trnsltr
 	 */
 	public ItemNodeTabbedFormController(Item item, QTIEditorPackage qtiPackage, UserRequest ureq, WindowControl wControl,
-			boolean restrictedEdit) {
+			boolean restrictedEdit, boolean blockedEdit) {
 		super(ureq, wControl);
+		this.blockedEdit = blockedEdit;
 		this.restrictedEdit = restrictedEdit;
-		metadataCtr = new ItemMetadataFormController(ureq, getWindowControl(), item, qtiPackage, restrictedEdit);
+		metadataCtr = new ItemMetadataFormController(ureq, getWindowControl(), item, qtiPackage, restrictedEdit, blockedEdit);
 		listenTo(metadataCtr);
 		this.item = item;
 		this.qtiPackage = qtiPackage;
@@ -72,19 +74,19 @@ public class ItemNodeTabbedFormController extends TabbableDefaultController {
 		int questionType = item.getQuestion().getType();
 		switch (questionType) {
 			case Question.TYPE_SC:
-				itemCtrl = new ChoiceItemController(ureq, getWindowControl(), item, qtiPackage, getTranslator(), restrictedEdit);
+				itemCtrl = new ChoiceItemController(ureq, getWindowControl(), item, qtiPackage, getTranslator(), restrictedEdit, blockedEdit);
 				break;
 			case Question.TYPE_MC:
-				itemCtrl = new ChoiceItemController(ureq, getWindowControl(), item, qtiPackage, getTranslator(), restrictedEdit);
+				itemCtrl = new ChoiceItemController(ureq, getWindowControl(), item, qtiPackage, getTranslator(), restrictedEdit, blockedEdit);
 				break;
 			case Question.TYPE_KPRIM:
-				itemCtrl = new ChoiceItemController(ureq, getWindowControl(), item, qtiPackage, getTranslator(), restrictedEdit);
+				itemCtrl = new ChoiceItemController(ureq, getWindowControl(), item, qtiPackage, getTranslator(), restrictedEdit, blockedEdit);
 				break;
 			case Question.TYPE_FIB:
-				itemCtrl = new FIBItemController(ureq, getWindowControl(), item, qtiPackage, getTranslator(), restrictedEdit);
+				itemCtrl = new FIBItemController(ureq, getWindowControl(), item, qtiPackage, getTranslator(), restrictedEdit, blockedEdit);
 				break;
 			case Question.TYPE_ESSAY:
-				itemCtrl = new EssayItemController(ureq, getWindowControl(), item, qtiPackage, getTranslator(), restrictedEdit);
+				itemCtrl = new EssayItemController(ureq, getWindowControl(), item, qtiPackage, getTranslator(), restrictedEdit, blockedEdit);
 				break;
 		}
 		if(itemCtrl != null) {
@@ -92,10 +94,6 @@ public class ItemNodeTabbedFormController extends TabbableDefaultController {
 		}
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.control.Controller, org.olat.core.gui.control.Event)
-	 */
 	@Override
 	protected void event(UserRequest ureq, Controller source, Event event) {
 		if (source == metadataCtr && event.equals(Event.DONE_EVENT)) {
@@ -107,17 +105,13 @@ public class ItemNodeTabbedFormController extends TabbableDefaultController {
 		
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#event(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.components.Component, org.olat.core.gui.control.Event)
-	 */
 	@Override
 	public void event(UserRequest ureq, Component source, Event event) {
 		if (event instanceof TabbedPaneChangedEvent) {
 			TabbedPaneChangedEvent tabbedPaneEvent = (TabbedPaneChangedEvent) event;
 			if (feedbackPanel.equals(tabbedPaneEvent.getNewComponent())) {
 				if (feedbackCtr != null) removeAsListenerAndDispose(feedbackCtr);
-				feedbackCtr = new FeedbackFormController(ureq, getWindowControl(), qtiPackage, item, restrictedEdit);
+				feedbackCtr = new FeedbackFormController(ureq, getWindowControl(), qtiPackage, item, restrictedEdit, blockedEdit);
 				// feedback controller sends out NodeBeforeChangeEvents which must be propagated				
 				listenTo(feedbackCtr);
 				feedbackPanel.setContent(feedbackCtr.getInitialComponent());
@@ -125,17 +119,11 @@ public class ItemNodeTabbedFormController extends TabbableDefaultController {
 		}
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.DefaultController#doDispose(boolean)
-	 */
 	@Override
 	protected void doDispose() {
 	// metadataCtr and feedbackCtr are registered as child controllers
 	}
 
-	/**
-	 * @see org.olat.core.gui.control.generic.tabbable.TabbableController#addTabs(org.olat.core.gui.components.TabbedPane)
-	 */
 	@Override
 	public void addTabs(TabbedPane tabbedPane) {
 		// add as listener to get tab activation events
diff --git a/src/main/java/org/olat/ims/qti/editor/MaterialFormController.java b/src/main/java/org/olat/ims/qti/editor/MaterialFormController.java
index 6f3dd079b77733b4abd3eb7c6042670aab780b00..6cdd1a9990aa7c655ebb8c664e8f4cd963e4d053 100644
--- a/src/main/java/org/olat/ims/qti/editor/MaterialFormController.java
+++ b/src/main/java/org/olat/ims/qti/editor/MaterialFormController.java
@@ -50,31 +50,26 @@ public class MaterialFormController extends FormBasicController {
 	private QTIEditorPackage qtiPackage;
 	private Material mat;
 	private RichTextElement richText;
-	private boolean isRestrictedEditMode;
+	private final boolean isRestrictedEditMode;
+	private final boolean isBlockedEditMode;
 	private String htmlContent = "";
 
 	public MaterialFormController(UserRequest ureq, WindowControl control, Material mat, QTIEditorPackage qtiPackage,
-			boolean isRestrictedEditMode) {
+			boolean isRestrictedEditMode, boolean isBlockedEditMode) {
 		super(ureq, control, FormBasicController.LAYOUT_VERTICAL);
 		this.mat = mat;
 		this.qtiPackage = qtiPackage;
 		this.htmlContent = mat.renderAsHtmlForEditor();
-
+		this.isBlockedEditMode = isBlockedEditMode;
 		this.isRestrictedEditMode = isRestrictedEditMode;
 		initForm(ureq);
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#doDispose()
-	 */
 	@Override
 	protected void doDispose() {
 	// nothing to get rid of
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#formOK(org.olat.core.gui.UserRequest)
-	 */
 	@Override
 	protected void formOK(UserRequest ureq) {
 		String newHtml = richText.getRawValue(); // trust authors, don't to XSS filtering
@@ -106,23 +101,20 @@ public class MaterialFormController extends FormBasicController {
 			// "lazy migration" to the new rich text style).
 			Mattext textHtml = new Mattext(newHtml);
 			// A single text/html element will be left over.
-			List<QTIObject> elements = new ArrayList<QTIObject>(1);
+			List<QTIObject> elements = new ArrayList<>(1);
 			elements.add(textHtml);
 			mat.setElements(elements);
 			fireEvent(ureq, Event.DONE_EVENT);
 		}
 	}
 
-	/**
-	 * @see org.olat.core.gui.components.form.flexible.impl.FormBasicController#initForm(org.olat.core.gui.components.form.flexible.FormItemContainer,
-	 *      org.olat.core.gui.control.Controller, org.olat.core.gui.UserRequest)
-	 */
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 
 		richText = uifactory.addRichTextElementForStringData("mce", null, htmlContent, 14, -1, true, qtiPackage.getBaseDir(), null,
 				formLayout, ureq.getUserSession(), getWindowControl());
 		richText.getEditorConfiguration().setFigCaption(false);
+		richText.setEnabled(!isBlockedEditMode);
 
 		RichTextConfiguration richTextConfig = richText.getEditorConfiguration();
 		// disable <p> element for enabling vertical layouts
@@ -135,7 +127,9 @@ public class MaterialFormController extends FormBasicController {
 		richTextConfig.setInvalidElements(RichTextConfiguration.INVALID_ELEMENTS_FORM_FULL_VALUE_UNSAVE_WITH_SCRIPT);
 		richTextConfig.setExtendedValidElements("script[src|type|defer]");
 		
-		uifactory.addFormSubmitButton("submit", formLayout);
+		if(!isBlockedEditMode) {
+			uifactory.addFormSubmitButton("submit", formLayout);
+		}
 	}
 
 	/**
diff --git a/src/main/java/org/olat/ims/qti/editor/QTIEditHelper.java b/src/main/java/org/olat/ims/qti/editor/QTIEditHelper.java
index 7393b2c7cdd5371422dbd3fa49fd79a4d38daa01..f55a9abdd774b84410a32ee368c5d352b46fa01e 100644
--- a/src/main/java/org/olat/ims/qti/editor/QTIEditHelper.java
+++ b/src/main/java/org/olat/ims/qti/editor/QTIEditHelper.java
@@ -251,7 +251,7 @@ public class QTIEditHelper {
 
 		// controls
 		Control control = new Control();
-		List<Control> controls = new ArrayList<Control>();
+		List<Control> controls = new ArrayList<>();
 		controls.add(control);
 		newItem.setItemcontrols(controls);
 		
@@ -307,7 +307,7 @@ public class QTIEditHelper {
 
 		// conrols
 		Control control = new Control();
-		List<Control> controls = new ArrayList<Control>();
+		List<Control> controls = new ArrayList<>();
 		controls.add(control);
 		newItem.setItemcontrols(controls);
 		
@@ -344,7 +344,7 @@ public class QTIEditHelper {
 
 		// conrols
 		Control control = new Control();
-		List<Control> controls = new ArrayList<Control>();
+		List<Control> controls = new ArrayList<>();
 		controls.add(control);
 		newItem.setItemcontrols(controls);
 		
diff --git a/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java b/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java
index 08ceb42b4e533341db0756a829705065ddfa7c2f..dcd097241887b65ee06e2152af04f0cb8201d4eb 100644
--- a/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java
+++ b/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java
@@ -103,6 +103,7 @@ import org.olat.fileresource.types.FileResource;
 import org.olat.fileresource.types.ImsQTI21Resource;
 import org.olat.ims.qti.QTIChangeLogMessage;
 import org.olat.ims.qti.QTIConstants;
+import org.olat.ims.qti.QTIModule;
 import org.olat.ims.qti.QTIResultManager;
 import org.olat.ims.qti.editor.beecom.objects.Assessment;
 import org.olat.ims.qti.editor.beecom.objects.ChoiceQuestion;
@@ -241,6 +242,7 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 	private Link previewLink, exportPoolLink, convertQTI21Link, exportDocLink, importTableLink, closeLink;
 	private Link addPoolLink, addSectionLink, addSCLink, addMCLink, addFIBLink, addKPrimLink, addEssayLink;
 	private Link deleteLink, moveLink, copyLink;
+	private Link convertQTI21Button;
 
 	private QTIEditorTreeModel menuTreeModel;
 	private DialogBoxController deleteDialog;
@@ -248,6 +250,7 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 	private IQDisplayController previewController;
 	private LockResult lockEntry;
 	private boolean restrictedEdit;
+	private boolean blockedEdit;
 	private Map<String, Memento> history = null;
 	private String startedWithTitle;
 	private List<Reference> referencees;
@@ -269,6 +272,8 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 	private CountDownLatch exportLatch;
 	private RepositoryEntry qtiEntry;
 
+	@Autowired
+	private QTIModule qtiModule;
 	@Autowired
 	private UserManager userManager;
 	@Autowired
@@ -290,6 +295,7 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 		super(ureq, wControl);
 		
 		this.qtiEntry = qtiEntry;
+		blockedEdit = !qtiModule.isEditResourcesEnabled();
 
 		for(Iterator<Reference> iter = referencees.iterator(); iter.hasNext(); ) {
 			Reference ref = iter.next();
@@ -386,8 +392,11 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 		} else {
 			// start with a fresh history. Editor is resumed but no changes were made
 			// so far.
-			history = new HashMap<String, Memento>();
+			history = new HashMap<>();
 		}
+		
+		convertQTI21Button = LinkFactory.createButton("tools.convert.qti21", main, this);
+		convertQTI21Button.setIconLeftCSS("o_icon o_FileResource-IMSQTI21_icon");
 
 		// The menu tree model represents the structure of the qti document.
 		// All insert/move operations on the model are propagated to the structure
@@ -411,7 +420,7 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 		populateToolC(); // qtiPackage must be loaded previousely
 		
 		// Add css background
-		if (restrictedEdit) {
+		if (restrictedEdit || blockedEdit) {
 			addSectionLink.setEnabled(false);
 			addSCLink.setEnabled(false);
 			addMCLink.setEnabled(false);
@@ -426,6 +435,10 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 		} else {
 			columnLayoutCtr.addCssClassToMain("o_editor_qti");
 		}
+		if(blockedEdit) {
+			importTableLink.setEnabled(false);
+			exportPoolLink.setEnabled(false);
+		}
 
 		deleteLink.setEnabled(false);
 		moveLink.setEnabled(false);
@@ -453,7 +466,7 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 		boolean warningEssay = false;
 		if(qtiPackage.getQTIDocument() != null && !qtiPackage.getQTIDocument().isSurvey()) {
 			//check if the test contains some essay
-			List<TreeNode> flattedTree = new ArrayList<TreeNode>();
+			List<TreeNode> flattedTree = new ArrayList<>();
 			TreeHelper.makeTreeFlat(menuTreeModel.getRootNode(), flattedTree);
 			for(TreeNode node:flattedTree) {
 				Object uo = node.getUserObject();
@@ -463,7 +476,7 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 				}
 			}
 		}
-		main.contextPut("warningEssay", new Boolean(warningEssay));
+		main.contextPut("warningEssay", Boolean.valueOf(warningEssay));
 	}
 
 	@Override
@@ -501,10 +514,10 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 					copyLink.setEnabled(false);
 					stackedPanel.setDirty(true);
 				} else {
-					deleteLink.setEnabled(true && !restrictedEdit);
-					moveLink.setEnabled(true && !restrictedEdit);
+					deleteLink.setEnabled(!restrictedEdit && !blockedEdit);
+					moveLink.setEnabled(!restrictedEdit && !blockedEdit);
 					if (clickedNode instanceof ItemNode) {
-						copyLink.setEnabled(true && !restrictedEdit);
+						copyLink.setEnabled(!restrictedEdit && !blockedEdit);
 					} else {
 						copyLink.setEnabled(false);
 					}
@@ -651,7 +664,7 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 			doExportQItem();
 		} else if (exportDocLink == source) {
 			doExportDocx(ureq);
-		} else if (convertQTI21Link == source) {
+		} else if (convertQTI21Link == source || convertQTI21Button == source) {
 			doConvertToQTI21(ureq);
 		} else if (importTableLink == source) {
 			doImportTable(ureq);
@@ -1006,9 +1019,6 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 		int targetPos = tp.getChildpos();
 		ItemNode selectedNode = (ItemNode) menuTree.getSelectedNode();
 		// only items are moveable
-		// use XStream instead of ObjectCloner
-		// Item qtiItem =
-		// (Item)xstream.fromXML(xstream.toXML(selectedNode.getUnderlyingQTIObject()));
 		Item toClone = (Item) selectedNode.getUnderlyingQTIObject();
 		Item qtiItem = (Item) XStreamHelper.xstreamClone(toClone);
 		// copy flow label class too, olat-2791
@@ -1210,7 +1220,7 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 		addItemTools.addComponent(new Spacer(""));
 		addPoolLink = LinkFactory.createToolLink(CMD_TOOLS_ADD_QPOOL, translate("tools.import.qpool"), this, "o_mi_qpool_import");
 		addItemTools.addComponent(addPoolLink);
-
+	
 		importTableLink = LinkFactory.createToolLink(CMD_TOOLS_IMPORT_TABLE, translate("tools.import.table"), this, "o_mi_table_import");
 		importTableLink.setIconLeftCSS("o_icon o_icon_table o_icon-fw");
 		addItemTools.addComponent(importTableLink);
@@ -1464,6 +1474,10 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 	public boolean isRestrictedEdit() {
 		return restrictedEdit;
 	}
+	
+	public boolean isBlockedEdit() {
+		return blockedEdit;
+	}
 
 	public boolean isLockedSuccessfully() {
 		return lockEntry.isSuccess();
diff --git a/src/main/java/org/olat/ims/qti/editor/SectionController.java b/src/main/java/org/olat/ims/qti/editor/SectionController.java
index 695de0a99a6ac64c46ddeefe3e0fbe259f21f2e5..e25d8d87cb253002d07e55baa6ef35b8895cc118 100644
--- a/src/main/java/org/olat/ims/qti/editor/SectionController.java
+++ b/src/main/java/org/olat/ims/qti/editor/SectionController.java
@@ -63,6 +63,7 @@ public class SectionController extends FormBasicController implements TabbableCo
 	private Section section;
 	private final QTIEditorPackage qtiPackage;
 	private final boolean restrictedEdit;
+	private final boolean blockedEdit;
 
 	/**
 	 * @param section
@@ -70,15 +71,13 @@ public class SectionController extends FormBasicController implements TabbableCo
 	 * @param locale
 	 * @param wControl
 	 */
-	public SectionController(Section section, QTIEditorPackage qtiPackage, UserRequest ureq, WindowControl wControl, boolean restrictedEdit) {
+	public SectionController(Section section, QTIEditorPackage qtiPackage, UserRequest ureq, WindowControl wControl,
+			boolean restrictedEdit, boolean blockedEdit) {
 		super(ureq, wControl);
-
+		this.blockedEdit = blockedEdit;
 		this.restrictedEdit = restrictedEdit;
 		this.section = section;
 		this.qtiPackage = qtiPackage;
-		/*
-		main.contextPut("mediaBaseURL", qtiPackage.getMediaBaseURL());
-		*/
 		initForm(ureq);
 	}
 
@@ -89,11 +88,13 @@ public class SectionController extends FormBasicController implements TabbableCo
 
 		String title = section.getTitle();
 		titleEl = uifactory.addTextElement("title", "form.metadata.title", 255, title, formLayout);
+		titleEl.setEnabled(!blockedEdit);
 		
 		String objectives = section.getObjectives();
 		objectivesEl = uifactory.addRichTextElementForStringData("objectives", "form.metadata.objectives", objectives, 6, 12, false,
 				qtiPackage.getBaseDir(), null, formLayout, ureq.getUserSession(), getWindowControl());
 		objectivesEl.getEditorConfiguration().setFigCaption(false);
+		objectivesEl.setEnabled(!blockedEdit);
 		
 		RichTextConfiguration richTextConfig = objectivesEl.getEditorConfiguration();
 		// disable <p> element for enabling vertical layouts
@@ -110,14 +111,14 @@ public class SectionController extends FormBasicController implements TabbableCo
 		String[] yesnoValues = new String[] { translate("yes"), translate("no") };
 		limitTimeEl = uifactory.addRadiosHorizontal("form.section.durationswitch", formLayout, yesnoKeys, yesnoValues);
 		limitTimeEl.addActionListener(FormEvent.ONCHANGE);
-		limitTimeEl.setEnabled(!restrictedEdit);
+		limitTimeEl.setEnabled(!restrictedEdit && !blockedEdit);
 		
 		timeMinEl = uifactory.addIntegerElement("form.imd.time.min", 0, formLayout);
 		timeMinEl.setDisplaySize(3);
-		timeMinEl.setEnabled(!restrictedEdit);
+		timeMinEl.setEnabled(!restrictedEdit && !blockedEdit);
 		timeSecEl = uifactory.addIntegerElement("form.imd.time.sek", 0, formLayout);
 		timeSecEl.setDisplaySize(3);
-		timeSecEl.setEnabled(!restrictedEdit);
+		timeSecEl.setEnabled(!restrictedEdit && !blockedEdit);
 		if (section.getDuration() != null && section.getDuration().isSet()) {
 			limitTimeEl.select(yesnoKeys[0], true);
 			timeMinEl.setIntValue(section.getDuration().getMin());
@@ -132,7 +133,7 @@ public class SectionController extends FormBasicController implements TabbableCo
 		boolean random = SelectionOrdering.RANDOM.equals(section.getSelection_ordering().getOrderType());
 		shuffleEl = uifactory.addRadiosHorizontal("shuffle", "form.section.shuffle", formLayout, yesnoKeys, yesnoValues);
 		shuffleEl.addActionListener(FormEvent.ONCHANGE);
-		shuffleEl.setEnabled(!restrictedEdit);
+		shuffleEl.setEnabled(!restrictedEdit && !blockedEdit);
 		if (random) {
 			shuffleEl.select(yesnoKeys[0], true);
 		} else {
@@ -150,7 +151,7 @@ public class SectionController extends FormBasicController implements TabbableCo
 		}
 		selectionNumEl = uifactory.addDropdownSingleselect("selection.num", "form.section.selection_pre", formLayout, theKeys, theValues, null);
 		selectionNumEl.setHelpText(translate("form.section.selection_pre.hover"));
-		selectionNumEl.setEnabled(!restrictedEdit);
+		selectionNumEl.setEnabled(!restrictedEdit && !blockedEdit);
 		int selectionNum = section.getSelection_ordering().getSelectionNumber();
 		if(selectionNum <= 0) {
 			selectionNumEl.select(theKeys[0], true);
@@ -162,7 +163,9 @@ public class SectionController extends FormBasicController implements TabbableCo
 		
 		FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
 		formLayout.add(buttonsCont);
-		uifactory.addFormSubmitButton("submit", buttonsCont);
+		if(!blockedEdit) {
+			uifactory.addFormSubmitButton("submit", buttonsCont);
+		}
 	}
 	
 	public void childNodeChanges() {
@@ -228,7 +231,7 @@ public class SectionController extends FormBasicController implements TabbableCo
 			section.setObjectives(newObjectives);
 		}
 
-		if (!restrictedEdit) {
+		if (!restrictedEdit && !blockedEdit) {
 			String selectionNumStr = selectionNumEl.getSelectedKey();
 			int selectionNum = 1;
 			try {
diff --git a/src/main/java/org/olat/ims/qti/editor/_content/index.html b/src/main/java/org/olat/ims/qti/editor/_content/index.html
index 5aa331d4b6169374fdb4f3c159dd80ce6ae097af..434256cfcfe6034badee60da3021546bc0b93b62 100644
--- a/src/main/java/org/olat/ims/qti/editor/_content/index.html
+++ b/src/main/java/org/olat/ims/qti/editor/_content/index.html
@@ -1,3 +1,6 @@
+<div class="o_error">$r.translate("error.qti.deprecated")
+	<div class="o_button_group">$r.render("tools.convert.qti21")</div>
+</div>
 <h4>$r.escapeHtml($qtititle)</h4>
 #if($warningEssay)
 	<div class="o_warning">$r.translate("warning.test.with.essay")</div>
diff --git a/src/main/java/org/olat/ims/qti/editor/_content/tab_assess.html b/src/main/java/org/olat/ims/qti/editor/_content/tab_assess.html
index 2159d92913a456e8d79cd9b2195998c11771ef2e..820dd701891e47811e50650a1966d12d2b9d9b63 100644
--- a/src/main/java/org/olat/ims/qti/editor/_content/tab_assess.html
+++ b/src/main/java/org/olat/ims/qti/editor/_content/tab_assess.html
@@ -19,18 +19,18 @@
 	<div class="form-group">
 		<label class="control-label col-sm-3">$r.translate("form.metadata.title")</label>
 		<div class="col-sm-9">
-			<input class="form-control" type="text" size="30" name="title" value="$r.escapeHtml($!assessment.title)" onchange="return setFormDirty('ofo_assessform')" onclick="return setFormDirty('ofo_assessform')" />
+			<input class="form-control" type="text" size="30" name="title" value="$r.escapeHtml($!assessment.title)" onchange="return setFormDirty('ofo_assessform')" onclick="return setFormDirty('ofo_assessform')" #if($isBlockedEdit) disabled="disabled" #end />
 		</div>
 	</div>
 
 	<div class="form-group">
 		<label class="control-label col-sm-3">$r.translate("form.metadata.objectives")</label>
 		<div class="col-sm-9">
-			<textarea name="objectives" class="form-control" cols="35" rows="8" onchange="return setFormDirty('ofo_assessform')" onclick="return setFormDirty('ofo_assessform')" >$!assessment.objectives</textarea>
+			<textarea name="objectives" class="form-control" cols="35" rows="8" onchange="return setFormDirty('ofo_assessform')" onclick="return setFormDirty('ofo_assessform')" #if($isBlockedEdit) disabled="disabled" #end>$!assessment.objectives</textarea>
 		</div>
 	</div>
 	
-#if($isRestrictedEdit)
+#if($isRestrictedEdit || $isBlockededit)
 	<div class="form-group">
 		<label class="control-label col-sm-3">$r.translate("form.assessment.selection_pre")$r.render("selectionPreHelpText")</label>
 		<div class="col-sm-9">
@@ -96,7 +96,7 @@
 
 
 #if($isSurveyMode.equals("false"))
-	#if($isRestrictedEdit)
+	#if($isRestrictedEdit || $isBlockedEdit)
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("form.metadata.duration")</label>
 			<div class="col-sm-9">
@@ -137,7 +137,7 @@
 		</div>
 	#end
 		
-	#if($isRestrictedEdit)
+	#if($isRestrictedEdit || $isBlockedEdit)
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("form.metadata.globalfeedbackNsolution")$r.render("globalfeedbackNsolutionHelpText")</label>
 			<div class="col-sm-9">
@@ -166,7 +166,7 @@
 		</div>
 	#end
 	
-	#if($isRestrictedEdit)
+	#if($isRestrictedEdit || $isBlockedEdit)
 		#if ($assessment.isInheritControls())
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("form.metadata.show.feedback")</label>
@@ -203,7 +203,7 @@
 		</div>
 	#end
 	
-	#if($isRestrictedEdit)
+	#if($isRestrictedEdit || $isBlockedEdit)
 		#if ($assessment.isInheritControls())
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("form.metadata.show.hints")</label>
@@ -240,7 +240,7 @@
 		</div>
 	#end
 		
-	#if($isRestrictedEdit)
+	#if($isRestrictedEdit || $isBlockedEdit)
 		#if ($assessment.isInheritControls())
 		<div class="form-group">	
 			<label class="control-label col-sm-3">$r.translate("form.metadata.show.solution")</label>
@@ -284,7 +284,7 @@
 #end 
 
 #if($isSurveyMode.equals("false"))
-	#if($isRestrictedEdit)
+	#if($isRestrictedEdit || $isBlockedEdit)
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("form.metadata.cutvalue")</label>
 			<div class="col-sm-9">
@@ -301,7 +301,11 @@
 		</div>
 	#end
 #end
+#if($isBlockedEdit)
+
+#else
 	<div class="col-sm-offset-3 col-sm-9 "><div class="btn-group">
 		<button type="button" class="btn btn-primary" name="olat_fosm" onclick="o_IQEvent('ofo_assessform')"><span>$r.translateInAttribute("submit")</span></button>
 	</div></div>
+#end
 </form></fieldset>
\ No newline at end of file
diff --git a/src/main/java/org/olat/ims/qti/editor/_content/tab_essayItem.html b/src/main/java/org/olat/ims/qti/editor/_content/tab_essayItem.html
index d7320c16418828460782633f5949dd5ccf0f2baf..b758b79ed81929889df3b5ac432e4c074252eddd 100644
--- a/src/main/java/org/olat/ims/qti/editor/_content/tab_essayItem.html
+++ b/src/main/java/org/olat/ims/qti/editor/_content/tab_essayItem.html
@@ -11,7 +11,9 @@
 			<tr>
 				<td>$r.formatLatexFormulas($question.getQuestion().renderAsHtml($mediaBaseURL))</td>
 				<td align="center">
+				#if(!$isBlockedEdit)
 					<a $r.hrefAndOnclick("editq",true,true) title="$r.translateInAttribute("mat.edit.question")"><i class="o_icon o_icon-lg o_icon_edit"> </i></a>
+				#end
 				</td>
 			</tr>
 		</tbody>
@@ -27,13 +29,13 @@
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("essay.columns")</label>
 			<div class="col-sm-9">
-				<input type="text" name="columns_q" value="$response.getColumns()" class="form-control" size="3" maxlength="3" onchange="return setFormDirty('ofo_tab_essavitem')" onclick="return setFormDirty('ofo_tab_essavitem')"/>
+				<input type="text" name="columns_q" value="$response.getColumns()" class="form-control" size="3" maxlength="3" #if($isBlockedEdit) disabled #end onchange="return setFormDirty('ofo_tab_essavitem')" onclick="return setFormDirty('ofo_tab_essavitem')"/>
 			</div>
 		</div>
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("essay.rows")</label>
 			<div class="col-sm-9">
-				<input type="text" name="rows_q" value="$response.getRows()" class="form-control" size="3" maxlength="3" onchange="return setFormDirty('ofo_tab_essavitem')" onclick="return setFormDirty('ofo_tab_essavitem')"/>
+				<input type="text" name="rows_q" value="$response.getRows()" class="form-control" size="3" maxlength="3" #if($isBlockedEdit) disabled #end onchange="return setFormDirty('ofo_tab_essavitem')" onclick="return setFormDirty('ofo_tab_essavitem')"/>
 			</div>
 		</div>
 
@@ -41,7 +43,7 @@
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("score")</label>
 			<div class="col-sm-9">
-				#if($isRestrictedEdit)
+				#if($isRestrictedEdit || $isBlockedEdit)
 					<p class="form-control-static">$question.getMaxValue()</p>
 				#else
 					<input type="text" name="single_score" value="$question.getMaxValue()" class="form-control" size="4" onchange="return setFormDirty('ofo_tab_essavitem')" onclick="return setFormDirty('ofo_tab_essavitem')"/>
@@ -50,7 +52,9 @@
 		</div>
 #end
 		<div class="col-sm-offset-3 col-sm-9 "><div class="btn-group">
+		#if(!$isBlockedEdit)
 			<button type="button" class="btn btn-primary" name="olat_fosm" onclick="o_IQEvent('ofo_tab_essavitem')"><span>$r.translateInAttribute("submit")</span></button>
+		#end
 		</div></div>
 	</form>
 </fieldset>
diff --git a/src/main/java/org/olat/ims/qti/editor/_content/tab_fibItem.html b/src/main/java/org/olat/ims/qti/editor/_content/tab_fibItem.html
index 825f443dbe3fe2081d87008cdf0b6a9e29270a9a..64623ddfe58cd50f2a9bd3544bf23916891f2049 100644
--- a/src/main/java/org/olat/ims/qti/editor/_content/tab_fibItem.html
+++ b/src/main/java/org/olat/ims/qti/editor/_content/tab_fibItem.html
@@ -2,7 +2,6 @@
 	<legend>$r.translate("fieldset.legend.answers")
 		$r.contextHelpWithWrapper("Test and Questionnaire Editor in Detail#details_testeditor_fragetypen_fib")
 	</legend>
-	
 	<form action="$r.formURIbg("sfib")" id="ofo_tab_fibitem" name="ofo_tab_fibitem" method="post" onsubmit="o_XHRSubmit('ofo_tab_fibitem');">
 		#if ($question && $question.getResponses().size() > 0)
 		<table class="table table-bordered">
@@ -27,7 +26,7 @@
 				#set ($count = ($foreach.count - 1))
 			<tr>
 				<td>
-				#if(!$isRestrictedEdit)
+				#if(!$isRestrictedEdit && !$isBlockedEdit)
 					<a $r.hrefAndOnclick("up",true,true,"posid","$count") title="$r.translateInAttribute("mat.move_up")"><i class="o_icon o_icon-lg o_icon_move_up"> </i></a>
 					<br />
 					<a $r.hrefAndOnclick("down",true,true,"posid","$count") title="$r.translateInAttribute("mat.move_down")"><i class="o_icon o_icon-lg o_icon_move_down"> </i></a>
@@ -61,14 +60,14 @@
 				#end
 					<input type="hidden" name="ident_q$count" value="$content.getIdent()" />
 				</td>
-				## if(!$isRestrictedEdit)
+				## if(!$isRestrictedEdit && !$isBlockedEdit)
 					#if($isSurveyMode.equals("false"))
 						#if($content.getType().equals("BLANK"))
 				<td valign="middle" align="center">
 							#if($content.getCaseSensitive().equals("Yes"))
-					<input type="checkbox" class="o_checkbox" name="case_q$count" value="Yes" checked onchange="return setFormDirty('ofo_tab_fibitem')" onclick="return setFormDirty('ofo_tab_fibitem')"/>
+					<input type="checkbox" class="o_checkbox" name="case_q$count" value="Yes" checked onchange="return setFormDirty('ofo_tab_fibitem')" #if($isBlockedEdit) disabled #end onclick="return setFormDirty('ofo_tab_fibitem')"/>
 							#else
-					<input type="checkbox" class="o_checkbox" name="case_q$count" value="Yes" onchange="return setFormDirty('ofo_tab_fibitem')" onclick="return setFormDirty('ofo_tab_fibitem')"/>
+					<input type="checkbox" class="o_checkbox" name="case_q$count" value="Yes" onchange="return setFormDirty('ofo_tab_fibitem')" #if($isBlockedEdit) disabled #end onclick="return setFormDirty('ofo_tab_fibitem')"/>
 							#end
 						#end
 				</td>
@@ -76,17 +75,17 @@
 				## end
 				#if($content.getType().equals("BLANK"))
 				<td valign="middle" align="center">
-					<input type="text" name="size_q$count" value="$content.getSize()" size="3" maxlength="3" onchange="return setFormDirty('ofo_tab_fibitem')" onclick="return setFormDirty('ofo_tab_fibitem')"/>
+					<input type="text" name="size_q$count" value="$content.getSize()" size="3" maxlength="3" onchange="return setFormDirty('ofo_tab_fibitem')" #if($isBlockedEdit) disabled #end onclick="return setFormDirty('ofo_tab_fibitem')"/>
 				</td>
 				<td valign="middle" align="center">
-					<input type="text" name="maxl_q$count" value="$content.getMaxLength()" size="3" maxlength="3" onchange="return setFormDirty('ofo_tab_fibitem')" onclick="return setFormDirty('ofo_tab_fibitem')"/>
+					<input type="text" name="maxl_q$count" value="$content.getMaxLength()" size="3" maxlength="3" onchange="return setFormDirty('ofo_tab_fibitem')" #if($isBlockedEdit) disabled #end onclick="return setFormDirty('ofo_tab_fibitem')"/>
 				</td>
 				#end
 
 				#if($isSurveyMode.equals("false") && !$question.isSingleCorrect() && $content.getType().equals("BLANK"))
 				<td>
-					#if(!$isRestrictedEdit)
-					<input type="text" name="points_q$count" value="$content.getPoints()" size="5" onchange="return setFormDirty('ofo_tab_fibitem')" onclick="return setFormDirty('ofo_tab_fibitem')"/>
+					#if(!$isRestrictedEdit && !$isBlockedEdit)
+					<input type="text" name="points_q$count" value="$content.getPoints()" size="5" onchange="return setFormDirty('ofo_tab_fibitem')" #if($isBlockedEdit) disabled #end onclick="return setFormDirty('ofo_tab_fibitem')"/>
 					#else
 					$content.getPoints()
 					#end
@@ -95,12 +94,14 @@
 
 				<td valign="middle" align="center">
 				#if($content.getType().equals("CONTENT"))
+					#if(!$isBlockedEdit)
 					<a $r.hrefAndOnclick("editr",true,true,"posid","$count") title="$r.translateInAttribute("mat.edit.response")"><i class="o_icon o_icon-lg o_icon_edit"> </i></a>
+					#end
 				#else
 					<img src="$r.staticLink("images/qti/empty.gif")" alt "" border="0" width="16">
 				#end
 					&nbsp;
-				#if(!$isRestrictedEdit && ($question.getResponses().size() > 1) )
+				#if(!$isRestrictedEdit && !$isBlockedEdit && ($question.getResponses().size() > 1) )
 					<a $r.hrefAndOnclick("del",true,true,"posid","$count") title="$r.translateInAttribute("mat.edit.delete")"><i class="o_icon o_icon-lg o_icon_delete_item"> </i></a>
 				#end
 				</td>
@@ -112,7 +113,7 @@
 
 		<p>
 		<br />
-		#if(!$isRestrictedEdit)
+		#if(!$isRestrictedEdit && !$isBlockedEdit)
 		<a $r.hrefAndOnclick("addtext",true,true) class="btn btn-default"><span>$r.translate("add_text")</span></a>
 		&nbsp;
 		<a $r.hrefAndOnclick("addblank",true,true) class="btn btn-default"><span>$r.translate("add_blank")</span></a>
@@ -124,7 +125,7 @@
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("valuation_method")</label>
 			<div class="col-sm-9">
-				#if($isRestrictedEdit)
+				#if($isRestrictedEdit || $isBlockedEdit)
 					#if(!$question.isSingleCorrect())
 						<p class="form-control-static">$r.translate("valuation_method_multi")</p>
 					#else
@@ -153,7 +154,7 @@
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("single_score") <i>$r.translate("valuation_method_single")</i></label>
 			<div class="col-sm-9">
-				#if($isRestrictedEdit)
+				#if($isRestrictedEdit || $isBlockedEdit)
 					#if($question.isSingleCorrect())
 						<p class="form-control-static">$!question.getSingleCorrectScore()</p>
 					#else
@@ -168,7 +169,7 @@
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("min_value")</label>
 			<div class="col-sm-9">
-				#if($isRestrictedEdit)
+				#if($isRestrictedEdit || $isBlockedEdit)
 					<p class="form-control-static">$!question.getMinValue()</p>
 				#else
 					<input type="text" name="min_value" value="$!question.getMinValue()" size="4" class="form-control" onchange="return setFormDirty('ofo_tab_fibitem')" onclick="return setFormDirty('ofo_tab_fibitem')"/>
@@ -178,7 +179,7 @@
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("max_value")</label>
 			<div class="col-sm-9">
-				#if($isRestrictedEdit)
+				#if($isRestrictedEdit || $isBlockedEdit)
 					<p class="form-control-static">$!question.getMaxValue()</p>
 				#else
 					<input type="text" name="max_value" value="$!question.getMaxValue()" size="4" class="form-control" onchange="return setFormDirty('ofo_tab_fibitem')" onclick="return setFormDirty('ofo_tab_fibitem')"/>
@@ -187,6 +188,8 @@
 		</div>
 #end
 	<div class="col-sm-offset-3 col-sm-9 "><div class="btn-group">
+	#if(!$isBlockedEdit)
 		<button type="button" class="btn btn-primary" name="olat_fosm" onclick="o_IQEvent('ofo_tab_fibitem')"><span>$r.translateInAttribute("submit")</span></button>
+	#end
 	</div>
 </form></fieldset>
\ No newline at end of file
diff --git a/src/main/java/org/olat/ims/qti/editor/_content/tab_kprimItem.html b/src/main/java/org/olat/ims/qti/editor/_content/tab_kprimItem.html
index c52d3ce723f1544f17a70e34816447b5656b429c..5997abe1269dec392829f03ca2ee12a6d93ad0c6 100644
--- a/src/main/java/org/olat/ims/qti/editor/_content/tab_kprimItem.html
+++ b/src/main/java/org/olat/ims/qti/editor/_content/tab_kprimItem.html
@@ -12,7 +12,9 @@
 			<tr>
 				<td>$r.formatLatexFormulas($question.getQuestion().renderAsHtml($mediaBaseURL))</td>
 				<td align="center">
+				#if(!$isBlockedEdit)
 					<a $r.hrefAndOnclick("editq",true,true) title="$r.translateInAttribute("mat.edit.question")"><i class="o_icon o_icon-lg o_icon_edit"> </i></a>
+				#end
 				</td>
 			</tr>
 		</tbody>
@@ -43,7 +45,7 @@
 				#set ($count = ($foreach.count - 1))
 			<tr>			
 				<td>
-				#if(!$isRestrictedEdit)
+				#if(!$isRestrictedEdit && !$isBlockedEdit)
 					<a $r.hrefAndOnclick("up",true,true,"posid","$count") title="$r.translateInAttribute("mat.move_up")"><i class="o_icon o_icon-lg o_icon_move_up"> </i></a>
 					<br />
 					<a $r.hrefAndOnclick("down",true,true,"posid","$count")" title="$r.translateInAttribute("mat.move_down")"><i class="o_icon o_icon-lg o_icon_move_down"> </i></a>
@@ -52,7 +54,7 @@
 				<td>$r.formatLatexFormulas($content.getContent().renderAsHtml($mediaBaseURL))</td>
 
 #if($isSurveyMode.equals("false"))
-			#if($isRestrictedEdit)
+			#if($isRestrictedEdit || $isBlockedEdit)
 				<td valign="middle" align="center">
 					<input type="radio" name="correctChoice_qro$count" value="correct" #if($content.isCorrect()) checked="checked" #end disabled="disabled" />	
 				</td>
@@ -79,7 +81,9 @@
 				<td >&nbsp;</td>
 #end
 				<td valign="middle" align="center">
+				#if(!$$isBlockedEdit)
 					<a $r.hrefAndOnclick("editr",true,true,"posid","$count") title="$r.translateInAttribute("mat.edit.response")"><i class="o_icon o_icon-lg o_icon_edit"> </i></a>
+				#end
 				</td>
 			</tr>
 #end
@@ -94,14 +98,14 @@
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("max_value")</label>
 			<div class="col-sm-9">
-				#if($isRestrictedEdit)
+				#if($isRestrictedEdit || $isBlockedEdit)
 					<p class="form-control-static">$!question.getMaxValue()</p>
 				#else
 					<input type="text" name="max_value" class="form-control" value="$!question.getMaxValue()" size="4" onchange="return setFormDirty('ofo_tab_kprimitem')" onclick="return setFormDirty('ofo_tab_kprimitem')"/>
 				#end
 			</div>
 		</div>
-	#if(!$isRestrictedEdit)
+	#if(!$isRestrictedEdit && !$isBlockedEdit)
 		<div class="col-sm-offset-3 col-sm-9 "><div class="btn-group">
 			<button type="button" class="btn btn-primary" name="olat_fosm" onclick="o_IQEvent('ofo_tab_kprimitem')"><span>$r.translateInAttribute("submit")</span></button>
 		</div></div>
diff --git a/src/main/java/org/olat/ims/qti/editor/_content/tab_mcItem.html b/src/main/java/org/olat/ims/qti/editor/_content/tab_mcItem.html
index 0afbe148fa5063653d0cba717feb329027eb085e..c405300ad106ca0f5992b1ecc50d991bd1f027ec 100644
--- a/src/main/java/org/olat/ims/qti/editor/_content/tab_mcItem.html
+++ b/src/main/java/org/olat/ims/qti/editor/_content/tab_mcItem.html
@@ -11,14 +11,15 @@
 		<tbody><tr>
 			<td>$r.formatLatexFormulas($question.getQuestion().renderAsHtml($mediaBaseURL))</td>
 			<td align="center">
+			#if(!$isBlockedEdit)
 				<a $r.hrefAndOnclick("editq",true,true) title="$r.translateInAttribute("mat.edit.question")"><i class="o_icon o_icon-lg o_icon_edit"> </i></a>
+			#end
 			</td>
 		</tr></tbody>
 	</table>
 </fieldset>
 <fieldset class="o_form form-horizontal" role="form">
-	<legend>$r.translate("fieldset.legend.answers")
-	</legend>
+	<legend>$r.translate("fieldset.legend.answers")</legend>
 	
 	<form action="$r.formURIbg("smc")" id="ofo_tab_mcitem" name="ofo_tab_mcitem" method="post" onsubmit="o_XHRSubmit('ofo_tab_mcitem');">
 #if ($question && $question.getResponses().size() > 0)
@@ -41,7 +42,7 @@
 				#set ($count = ($foreach.count - 1))
 			<tr>			
 				<td>
-				#if(!$isRestrictedEdit)
+				#if(!$isRestrictedEdit && !$isBlockedEdit)
 					<a $r.hrefAndOnclick("up",true,true,"posid","$count") title="$r.translateInAttribute("mat.move_up")"><i class="o_icon o_icon-lg o_icon_move_up"> </i></a>
 					<br />
 					<a $r.hrefAndOnclick("down",true,true,"posid","$count") title="$r.translateInAttribute("mat.move_down")"><i class="o_icon o_icon-lg o_icon_move_down"> </i></a>
@@ -52,7 +53,7 @@
 #if($isSurveyMode.equals("false"))
 			#if(!$question.isSingleCorrect())
 				<td>
-					#if($isRestrictedEdit)
+					#if($isRestrictedEdit || $isBlockedEdit)
 						$content.getPoints()
 					#else
 						<input type="text" name="points_q$count" value="$content.getPoints()" size="5" onchange="return setFormDirty('ofo_tab_mcitem')" onclick="return setFormDirty('ofo_tab_mcitem')"/>
@@ -60,7 +61,7 @@
 				</td>
 			#else	
 				<td valign="middle" align="center">
-				#if($isRestrictedEdit)
+				#if($isRestrictedEdit || $isBlockedEdit)
 					#if($content.isCorrect())
 					<input type="checkbox" class="o_checkbox" name="value_q" value="true" disabled="disabled" checked="checked"/>
 					#else
@@ -77,9 +78,11 @@
 			#end
 #end
 				<td valign="middle" align="center">
+					#if(!$isBlockedEdit)
 					<a $r.hrefAndOnclick("editr",true,true,"posid","$count") title="$r.translateInAttribute("mat.edit.response")"><i class="o_icon o_icon-lg o_icon_edit"> </i></a>
+					#end
 					&nbsp;
-					#if(!$isRestrictedEdit)
+					#if(!$isRestrictedEdit && !$isBlockedEdit)
 					<a $r.hrefAndOnclick("del",true,true,"posid","$count") title="$r.translateInAttribute("delete")"><i class="o_icon o_icon-lg o_icon_delete_item"> </i></a>
 					#end
 				</td>
@@ -89,7 +92,7 @@
 		</table>
 #end
 
-		#if(!$isRestrictedEdit)
+		#if(!$isRestrictedEdit && !$isBlockedEdit)
 		<a href="$r.commandURI("addchoice")" onclick="$r.commandURI("addchoice") return false;" class="btn btn-default"><span>$r.translate("add_answer")</span></a>
 		#end
 
@@ -98,7 +101,7 @@
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("valuation_method")</label>
 			<div class="col-sm-9">
-				#if($isRestrictedEdit)
+				#if($isRestrictedEdit || $isBlockedEdit)
 					#if(!$question.isSingleCorrect())
 						<p class="form-control-static">$r.translate("valuation_method_multi")</p>
 					#else
@@ -127,7 +130,7 @@
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("single_score") <i>$r.translate("valuation_method_single")</i></label>
 			<div class="col-sm-9">
-				#if($isRestrictedEdit)
+				#if($isRestrictedEdit || $isBlockedEdit)
 					#if($question.isSingleCorrect())
 						<p class="form-control-static">$!question.getSingleCorrectScore()</p>
 					#else
@@ -141,7 +144,7 @@
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("min_value")</label>
 			<div class="col-sm-9">
-				#if($isRestrictedEdit)
+				#if($isRestrictedEdit || $isBlockedEdit)
 					<p class="form-control-static">$!question.getMinValue()</p>
 				#else
 					<input type="text" name="min_value" value="$!question.getMinValue()" size="4" class="form-control" onchange="return setFormDirty('ofo_tab_mcitem')" onclick="return setFormDirty('ofo_tab_mcitem')"/>
@@ -151,14 +154,14 @@
 		<div class="form-group">
 			<label class="control-label col-sm-3">$r.translate("max_value")</label>
 			<div class="col-sm-9">
-				#if($isRestrictedEdit)
+				#if($isRestrictedEdit || $isBlockedEdit)
 					<p class="form-control-static">$!question.getMaxValue()</p>
 				#else
 					<input type="text" name="max_value" value="$!question.getMaxValue()" size="4" class="form-control" onchange="return setFormDirty('ofo_tab_mcitem')" onclick="return setFormDirty('ofo_tab_mcitem')"/>
 				#end
 			</div>
 		</div>
-	#if(!$isRestrictedEdit)
+	#if(!$isRestrictedEdit && !$isBlockedEdit)
 		<div class="col-sm-offset-3 col-sm-9 "><div class="btn-group">
 			<button type="button" class="btn btn-primary" name="olat_fosm" onclick="o_IQEvent('ofo_tab_mcitem')"><span>$r.translateInAttribute("submit")</span></button>
 		</div></div>
diff --git a/src/main/java/org/olat/ims/qti/editor/_content/tab_scItem.html b/src/main/java/org/olat/ims/qti/editor/_content/tab_scItem.html
index 9b03ee94be656e0c7f6e17e1c00b3a9cca3fd3e7..7e324a791af0e07d363521076428a73b72ffb6eb 100644
--- a/src/main/java/org/olat/ims/qti/editor/_content/tab_scItem.html
+++ b/src/main/java/org/olat/ims/qti/editor/_content/tab_scItem.html
@@ -10,7 +10,9 @@
 		<tbody><tr>
 			<td>$r.formatLatexFormulas($question.getQuestion().renderAsHtml($mediaBaseURL))</td>
 			<td align="center">
+			#if(!$isBlockedEdit)
 				<a $r.hrefAndOnclick("editq",true,true) title="$r.translateInAttribute("mat.edit.question")"><i class="o_icon o_icon-lg o_icon_edit"> </i></a>
+			#end
 			</td>
 		</tr></tbody>
 	</table>
@@ -42,7 +44,7 @@
 				#end
 				#set ($count = ($foreach.count - 1))
 				<tr><td>
-				#if(!$isRestrictedEdit)
+				#if(!$isRestrictedEdit && !$isBlockedEdit)
 					<a $r.hrefAndOnclick("up",true,true,"posid","$count") title="$r.translateInAttribute("mat.move_up")"><i class="o_icon o_icon-lg o_icon_move_up"> </i></a>
 					<br>
 					<a $r.hrefAndOnclick("down",true,true,"posid","$count") title="$r.translateInAttribute("mat.move_down")"><i class="o_icon o_icon-lg o_icon_move_down"> </i></a>
@@ -51,7 +53,7 @@
 
 #if($isSurveyMode.equals("false"))
 				<td valign="middle" align="center">
-				#if($isRestrictedEdit)
+				#if($isRestrictedEdit || $isBlockedEdit)
 					#if($content.isCorrect())
 						<input type="radio" name="cc" value="value_q" disabled="disabled" checked="checked" />
 					#else
@@ -68,16 +70,18 @@
 #end
 
 				<td valign="middle" align="center">
+					#if(!$isBlockedEdit)
 					<a $r.hrefAndOnclick("editr",true,true,"posid","$count") title="$r.translateInAttribute("mat.edit.response")"><i class="o_icon o_icon-lg o_icon_edit"> </i></a>
+					#end
 					&nbsp;
-					#if(!$isRestrictedEdit && ($question.getResponses().size() > 1) )
+					#if(!$isRestrictedEdit && !$isBlockedEdit && ($question.getResponses().size() > 1) )
 					<a $r.hrefAndOnclick("del",true,true,"posid","$count") title="$r.translateInAttribute("mat.edit.delete")"><i class="o_icon o_icon-lg o_icon_delete_item"> </i></a>
 					#end
 				</td></tr>
 			#end
 			</tbody>
 		</table>
-#if(!$isRestrictedEdit)
+#if(!$isRestrictedEdit && !$isBlockedEdit)
 		<a $r.hrefAndOnclick("addchoice",true,true) class="btn btn-default">$r.translate("add_answer")</a>
 #end	
 
@@ -86,7 +90,7 @@
 	<div class="form-group">
 		<label class="control-label col-sm-3">$r.translate("score")</label>
 		<div class="col-sm-9">
-			#if($isRestrictedEdit)
+			#if($isRestrictedEdit || $isBlockedEdit)
 			<p class="form-control-static">$!question.getSingleCorrectScore()</p>
 			#else
 			<input type="text" class="form-control" name="single_score" value="$!question.getSingleCorrectScore()" size="4" onchange="return setFormDirty('ofo_tab_scitem')" onclick="return setFormDirty('ofo_tab_scitem')"/>
@@ -95,7 +99,7 @@
 	</div>
 #end
 
-#if($isSurveyMode.equals("false") && !$isRestrictedEdit)
+#if($isSurveyMode.equals("false") && !$isRestrictedEdit && !$isBlockedEdit)
 		<div class="col-sm-offset-3 col-sm-9 "><div class="btn-group">
 			<button type="button" class="btn btn-primary" name="olat_fosm" onclick="o_IQEvent('ofo_tab_scitem')"><span>$r.translateInAttribute("submit")</span></button>
 		</div></div>
diff --git a/src/main/java/org/olat/ims/qti/editor/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti/editor/_i18n/LocalStrings_de.properties
index 19270a52ad6ff80058046ee7c53d98dde8ea03af..bb7ac7a3e9e746fbceb4bbefbc799d10253f986e 100644
--- a/src/main/java/org/olat/ims/qti/editor/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/ims/qti/editor/_i18n/LocalStrings_de.properties
@@ -3,135 +3,6 @@ add_answer=Neue Antwort hinzuf\u00FCgen
 add_blank=Neue L\u00FCcke hinzuf\u00FCgen
 add_text=Neues Textfragment hinzuf\u00FCgen
 answer_feedback=Feedback zur Antwort
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
 confirm.delete.element=Wollen Sie dieses Element wirklich l\u00F6schen?
 cut_value=Notwendige Punktzahl f\u00FCr "Bestanden"
 delete.item=Wollen Sie die Frage "{0}" wirklich l\u00F6schen?
@@ -158,6 +29,7 @@ error.rows=Das Format f\u00FCr die H\u00F6he ist ung\u00FCltig.
 error.save=Das Dokument konnte nicht gespeichert werden.
 error.title.empty=Der Fragetitel darf nicht leer sein.
 error.tries=Das Format f\u00FCr die Anzahl L\u00F6sungsversuche ist ung\u00FCltig.
+error.qti.deprecated=Diese Version von QTI ist deprecated. Bitte auf dem neuen QTI 2.1 konvertieren.
 essay.columns=Breite (Anzahl Buchstaben pro Zeile)
 essay.dimension=Gr\u00F6sse
 essay.dimension.header=Gr\u00F6sse des Antwortfeldes
@@ -218,7 +90,6 @@ form.metadata.timerestriction=Zeitbeschr\u00E4nkung f\u00FCr gesamten Test
 form.metadata.title=Titel
 form.metadata.type=Typ
 form.section.durationswitch=Zeitbeschr\u00E4nkung f\u00FCr ganze Sektion
-
 form.assessment.order_type=Reihenfolge
 form.assessment.order_type.hover=Bestimmen Sie in welcher Reihenfolge die ausgew\u00e4hlten Sektionen dem Benutzer angezeigt werden sollen.
 form.assessment.selection_pre=Anzahl Sektionen in diesem Test
@@ -340,8 +211,6 @@ tools.export.qpool=Zum Pool exportieren
 tools.export.docx=Als Worddatei exportieren
 tools.import.table=Fragen aus Excel importieren
 export.qpool.successful={0} Frage wurde erfolgreich exportiert
-
-
 tools.material.back=Zur\u00FCck
 tools.material.header=Hinzuf\u00FCgen
 tools.tools.closeeditor=Schliessen/Speichern
diff --git a/src/main/java/org/olat/ims/qti/editor/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti/editor/_i18n/LocalStrings_en.properties
index 0589279680f3c2caa379dd03bc5b681e38b29c2f..d4a7af1a8a9b385dd5b021904f348a2cd6d1d508 100644
--- a/src/main/java/org/olat/ims/qti/editor/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/ims/qti/editor/_i18n/LocalStrings_en.properties
@@ -25,6 +25,7 @@ error.load=This document could not be uploaded.
 error.lock=This test/questionnaire is being edited by user {0} at the moment and therefore locked.
 error.move.atleastoneitem=Question cannot be moved. A section must contain at least one question.
 error.preview=An error has occurred while creating the preview.
+error.qti.deprecated=This version of QTI is deprecated. Please consider to convert your test to QTI 2.1.
 error.rows=Height format invalid.
 error.save=This document could not be saved.
 error.title.empty=The question's title is mandatory.
diff --git a/src/main/java/org/olat/ims/qti/editor/tree/AssessmentNode.java b/src/main/java/org/olat/ims/qti/editor/tree/AssessmentNode.java
index 8de263c4fd724583d27bde733eac380835e86f8f..6ba18b5b5a088f9fce514dea47e00b972cad13e5 100644
--- a/src/main/java/org/olat/ims/qti/editor/tree/AssessmentNode.java
+++ b/src/main/java/org/olat/ims/qti/editor/tree/AssessmentNode.java
@@ -71,22 +71,19 @@ public class AssessmentNode extends GenericQtiNode {
 	 * 
 	 * @param title
 	 */
+	@Override
 	public void setMenuTitleAndAlt(String title) {
 		super.setMenuTitleAndAlt(title);
 		assmnt.setTitle(title);
 	}
 
-	/**
-	 * @see org.olat.ims.qti.editor.tree.GenericQtiNode#createEditTabbedPane(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.control.WindowControl,
-	 *      org.olat.core.gui.translator.Translator, QTIEditorMainController)
-	 */
+	@Override
 	public TabbedPane createEditTabbedPane(UserRequest ureq, WindowControl wControl, Translator trnsltr,
 			QTIEditorMainController editorMainController) {
 		if (myTabbedPane == null) {
 			myTabbedPane = new TabbedPane("tabbedPane", ureq.getLocale());
-			TabbableController tabbCntrllr = new AssessmentController(assmnt, qtiPackage, ureq, wControl, editorMainController
-					.isRestrictedEdit());
+			TabbableController tabbCntrllr = new AssessmentController(assmnt, qtiPackage, ureq, wControl,
+					editorMainController.isRestrictedEdit(), editorMainController.isBlockedEdit());
 			tabbCntrllr.addTabs(myTabbedPane);
 			tabbCntrllr.addControllerListener(editorMainController);
 		}
diff --git a/src/main/java/org/olat/ims/qti/editor/tree/ItemNode.java b/src/main/java/org/olat/ims/qti/editor/tree/ItemNode.java
index 24e8ded2132f00b3491896521753d88e5462906c..b05063b8c59f6279599f506710cec6038a8cebff 100644
--- a/src/main/java/org/olat/ims/qti/editor/tree/ItemNode.java
+++ b/src/main/java/org/olat/ims/qti/editor/tree/ItemNode.java
@@ -110,23 +110,20 @@ public class ItemNode extends GenericQtiNode {
 	 * 
 	 * @param title
 	 */
+	@Override
 	public void setMenuTitleAndAlt(String title) {
 		super.setMenuTitleAndAlt(title);
 		item.setTitle(title);
 	}
 
-	/**
-	 * @see org.olat.ims.qti.editor.tree.GenericQtiNode#createEditTabbedPane(org.olat.core.gui.UserRequest,
-	 *      org.olat.core.gui.control.WindowControl,
-	 *      org.olat.core.gui.translator.Translator, QTIEditorMainController)
-	 */
+	@Override
 	public TabbedPane createEditTabbedPane(UserRequest ureq, WindowControl wControl, Translator trnsltr,
 			QTIEditorMainController editorMainController) {
 		if (myTabbedPane == null) {
 			try {
 				myTabbedPane = new TabbedPane("tabbedPane", ureq.getLocale());
-				TabbableController tabbCntrllr = new ItemNodeTabbedFormController(item, qtiPackage, ureq, wControl, editorMainController
-						.isRestrictedEdit());
+				TabbableController tabbCntrllr = new ItemNodeTabbedFormController(item, qtiPackage, ureq, wControl,
+						editorMainController.isRestrictedEdit(), editorMainController.isBlockedEdit());
 				tabbCntrllr.addTabs(myTabbedPane);
 				tabbCntrllr.addControllerListener(editorMainController);
 			} catch (Exception e) {
@@ -142,10 +139,7 @@ public class ItemNode extends GenericQtiNode {
 		//
 	}
 
-	/**
-	 * @see org.olat.ims.qti.editor.tree.IQtiNode#insertQTIObjectAt(QTIObject,
-	 *      int)
-	 */
+	@Override
 	public void insertQTIObjectAt(QTIObject object, int position) {
 		throw new AssertException("Can't insert objects on ItemNode.");
 	}
diff --git a/src/main/java/org/olat/ims/qti/editor/tree/SectionNode.java b/src/main/java/org/olat/ims/qti/editor/tree/SectionNode.java
index af1ff2aa210aa1f0ae166d95273ffb831d4734d7..746075c48876ef035542762a90ad6d1bbdb3e9fb 100644
--- a/src/main/java/org/olat/ims/qti/editor/tree/SectionNode.java
+++ b/src/main/java/org/olat/ims/qti/editor/tree/SectionNode.java
@@ -82,13 +82,12 @@ public class SectionNode extends GenericQtiNode {
 		section.setTitle(title);
 	}
 
-	/**
-	 * @see org.olat.ims.qti.editor.tree.GenericQtiNode#createEditTabbedPane(org.olat.core.gui.UserRequest, org.olat.core.gui.control.WindowControl, org.olat.core.gui.translator.Translator, QTIEditorMainController)
-	 */
+	@Override
 	public TabbedPane createEditTabbedPane(UserRequest ureq, WindowControl wControl, Translator trnsltr, QTIEditorMainController editorMainController) {
 		if (myTabbedPane == null) {
 			myTabbedPane = new TabbedPane("tabbedPane", ureq.getLocale());
-			sectionCtrl = new SectionController(section, qtiPackage, ureq, wControl, editorMainController.isRestrictedEdit());
+			sectionCtrl = new SectionController(section, qtiPackage, ureq, wControl,
+					editorMainController.isRestrictedEdit(), editorMainController.isBlockedEdit());
 			sectionCtrl.addTabs(myTabbedPane);
 			sectionCtrl.addControllerListener(editorMainController);
 		}
diff --git a/src/main/java/org/olat/ims/qti21/ui/QTI21AdminController.java b/src/main/java/org/olat/ims/qti21/ui/QTI21AdminController.java
index beedacec6114e5e253ef65138e079a2e0833dc62..c81eab6f9892092473899e8e79e5f335f14a46de 100644
--- a/src/main/java/org/olat/ims/qti21/ui/QTI21AdminController.java
+++ b/src/main/java/org/olat/ims/qti21/ui/QTI21AdminController.java
@@ -39,7 +39,6 @@ import org.olat.core.gui.control.generic.closablewrapper.CloseableModalControlle
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.crypto.CryptoUtil;
 import org.olat.core.util.crypto.X509CertificatePrivateKeyPair;
-import org.olat.ims.qti.QTIModule;
 import org.olat.ims.qti21.QTI21Module;
 import org.olat.ims.qti21.QTI21Module.CorrectionWorkflow;
 import org.olat.ims.qti21.ui.assessment.ValidationXmlSignatureController;
@@ -62,8 +61,6 @@ public class QTI21AdminController extends FormBasicController {
 	private FormLink validationButton;
 	private MultipleSelectionElement mathExtensionEl;
 	private MultipleSelectionElement digitalSignatureEl;
-	private MultipleSelectionElement createQTI12resourcesEl;
-	private MultipleSelectionElement createQTI12SurveyResourcesEl;
 	private MultipleSelectionElement anonymCorrectionWorkflowEl;
 	private FileElement certificateEl;
 	private TextElement certificatePasswordEl;
@@ -71,47 +68,23 @@ public class QTI21AdminController extends FormBasicController {
 	private CloseableModalController cmc;
 	private ValidationXmlSignatureController validationCtrl;
 
-
-	@Autowired
-	private QTIModule qti12Module;
 	@Autowired
 	private QTI21Module qti21Module;
 	
 	public QTI21AdminController(UserRequest ureq, WindowControl wControl) {
-		super(ureq, wControl, "admin");
+		super(ureq, wControl);
 		initForm(ureq);
 	}
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
-		FormLayoutContainer qti12LayoutCont = FormLayoutContainer.createDefaultFormLayout("optionsFor12", getTranslator());
-		qti12LayoutCont.setRootForm(mainForm);
-		formLayout.add("optionsFor12", qti12LayoutCont);
-		qti12LayoutCont.setFormTitle(translate("admin.12.title"));
-		qti12LayoutCont.setFormDescription(translate("admin.12.description"));
-		
-		createQTI12resourcesEl = uifactory.addCheckboxesHorizontal("create.12.resources", "create.12.resources", qti12LayoutCont,
-				onKeys, onValues);
-		if(qti12Module.isCreateResourcesEnabled()) {
-			createQTI12resourcesEl.select(onKeys[0], true);
-		}
-		
-		createQTI12SurveyResourcesEl = uifactory.addCheckboxesHorizontal("create.12.survey.resources", "create.12.survey.resources", qti12LayoutCont,
-				onKeys, onValues);
-		if(qti12Module.isCreateSurveyResourcesEnabled()) {
-			createQTI12SurveyResourcesEl.select(onKeys[0], true);
-		}
-		
-		FormLayoutContainer layoutCont = FormLayoutContainer.createDefaultFormLayout("options", getTranslator());
-		layoutCont.setRootForm(mainForm);
-		formLayout.add("options", layoutCont);
-		layoutCont.setFormTitle(translate("admin.title"));
+		setFormTitle("admin.title");
 
-		validationButton = uifactory.addFormLink("validate.xml.signature", layoutCont, Link.BUTTON);
+		validationButton = uifactory.addFormLink("validate.xml.signature", formLayout, Link.BUTTON);
 		validationButton.setCustomEnabledLinkCSS("btn btn-default pull-right");
 		validationButton.getComponent().setSuppressDirtyFormWarning(true);
 		
-		digitalSignatureEl = uifactory.addCheckboxesHorizontal("digital.signature", "digital.signature", layoutCont,
+		digitalSignatureEl = uifactory.addCheckboxesHorizontal("digital.signature", "digital.signature", formLayout,
 				onKeys, onValues);
 		if(qti21Module.isDigitalSignatureEnabled()) {
 			digitalSignatureEl.select(onKeys[0], true);
@@ -119,7 +92,7 @@ public class QTI21AdminController extends FormBasicController {
 		digitalSignatureEl.setExampleKey("digital.signature.text", null);
 		digitalSignatureEl.addActionListener(FormEvent.ONCHANGE);
 		
-		certificateEl = uifactory.addFileElement(getWindowControl(), "digital.signature.certificate", "digital.signature.certificate", layoutCont);
+		certificateEl = uifactory.addFileElement(getWindowControl(), "digital.signature.certificate", "digital.signature.certificate", formLayout);
 		certificateEl.setExampleKey("digital.signature.certificate.example", null);
 		certificateEl.setHelpText(translate("digital.signature.certificate.hint"));
 		if(StringHelper.containsNonWhitespace(qti21Module.getDigitalSignatureCertificate())) {
@@ -130,16 +103,16 @@ public class QTI21AdminController extends FormBasicController {
 		String certificatePassword = qti21Module.getDigitalSignatureCertificatePassword();
 		String password = StringHelper.containsNonWhitespace(certificatePassword) ? PLACEHOLDER : "";
 		certificatePasswordEl = uifactory.addPasswordElement("digital.signature.certificate.password", "digital.signature.certificate.password",
-				256, password, layoutCont);
+				256, password, formLayout);
 		certificatePasswordEl.setAutocomplete("new-password");
 		
-		anonymCorrectionWorkflowEl = uifactory.addCheckboxesHorizontal("correction.workflow", "correction.workflow", layoutCont,
+		anonymCorrectionWorkflowEl = uifactory.addCheckboxesHorizontal("correction.workflow", "correction.workflow", formLayout,
 				onKeys, new String[] { translate("correction.workflow.anonymous") });
 		if(qti21Module.getCorrectionWorkflow() == CorrectionWorkflow.anonymous) {
 			anonymCorrectionWorkflowEl.select(onKeys[0], true);
 		}
 
-		mathExtensionEl = uifactory.addCheckboxesHorizontal("math.extension", "math.extension", layoutCont,
+		mathExtensionEl = uifactory.addCheckboxesHorizontal("math.extension", "math.extension", formLayout,
 				onKeys, onValues);
 		if(qti21Module.isMathAssessExtensionEnabled()) {
 			mathExtensionEl.select(onKeys[0], true);
@@ -148,7 +121,7 @@ public class QTI21AdminController extends FormBasicController {
 		mathExtensionEl.addActionListener(FormEvent.ONCHANGE);
 		
 		FormLayoutContainer buttonsCont = FormLayoutContainer.createButtonLayout("buttons", getTranslator());
-		layoutCont.add(buttonsCont);
+		formLayout.add(buttonsCont);
 		uifactory.addFormSubmitButton("save", buttonsCont);
 	}
 	
@@ -172,8 +145,8 @@ public class QTI21AdminController extends FormBasicController {
 				allOk &= validateCertificatePassword(uploadedCertificate);
 			}
 		} else {
-			String password = certificatePasswordEl.getValue();
-			if(!PLACEHOLDER.equals(password) && certificateEl.getInitialFile() != null) {
+			String credential = certificatePasswordEl.getValue();
+			if(!PLACEHOLDER.equals(credential) && certificateEl.getInitialFile() != null) {
 				allOk &= validateCertificatePassword(certificateEl.getInitialFile());
 			}
 		}
@@ -234,8 +207,6 @@ public class QTI21AdminController extends FormBasicController {
 
 	@Override
 	protected void formOK(UserRequest ureq) {
-		qti12Module.setCreateResourcesEnabled(createQTI12resourcesEl.isSelected(0));
-		qti12Module.setCreateSurveyResourcesEnabled(createQTI12SurveyResourcesEl.isSelected(0));
 		CorrectionWorkflow correctionWf = anonymCorrectionWorkflowEl.isAtLeastSelected(1)
 				? CorrectionWorkflow.anonymous : CorrectionWorkflow.named;
 		qti21Module.setCorrectionWorkflow(correctionWf);
@@ -249,9 +220,9 @@ public class QTI21AdminController extends FormBasicController {
 				certificateEl.reset();// make sure the same certificate is not load twice
 				certificateEl.setInitialFile(newFile);
 			}
-			String password = certificatePasswordEl.getValue();
-			if(!PLACEHOLDER.equals(password)) {
-				qti21Module.setDigitalSignatureCertificatePassword(password);
+			String credential = certificatePasswordEl.getValue();
+			if(!PLACEHOLDER.equals(credential)) {
+				qti21Module.setDigitalSignatureCertificatePassword(credential);
 			}
 		}
 	}
diff --git a/src/main/java/org/olat/ims/qti21/ui/_content/admin.html b/src/main/java/org/olat/ims/qti21/ui/_content/admin.html
deleted file mode 100644
index f8552ac9a2e455e9d4412fa55be8c22f0debcb9e..0000000000000000000000000000000000000000
--- a/src/main/java/org/olat/ims/qti21/ui/_content/admin.html
+++ /dev/null
@@ -1,2 +0,0 @@
-$r.render("optionsFor12")
-$r.render("options")
\ No newline at end of file
diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties
index e4fff68fa18ed8d4ed8d6fa9fb40fe70eb37c823..9963e5377ac02b3411e8b45476b34f4b2134b684 100644
--- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_de.properties
@@ -1,7 +1,5 @@
 #Wed Dec 19 17:16:29 CET 2018
 actualPoints=$org.olat.modules.iq\:actualPoints
-admin.12.description=Hinweis\: Die OpenOLAT Unterst\u00FCtzung f\u00FCr den QTI1.2 Standard endet und wird mit Release 14 vollst\u00E4ndig entfernt.
-admin.12.title=QTI 1.2 Einstellungen
 admin.menu.title=QTI 2.1
 admin.menu.title.alt=QTI 2.1 Einstellungen
 admin.title=QTI 2.1 Einstellungen
@@ -82,8 +80,6 @@ correction=Korrigieren
 correction.workflow=Korrekturworkflow
 correction.workflow.anonymous=Anonym
 countdown.running=Zeitlimit {1} Sekunden\: nur <strong>{0} Sekunden \u00FCbrigs</strong>
-create.12.resources=Neue QTI 1.2 Tests und Fragen zulassen
-create.12.survey.resources=Neue QTI 1.2 Frageb\u00F6gen zulassen
 debug.outcomes=Output Daten
 debug.responses=Antworten Daten
 digital.signature=Testquittung der Testergebnisse
diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties
index fc2a6760c59654e97c31e86329e471066de59e41..68bb384fb7eb11d3fe34a211bbc917df4f8580a2 100644
--- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_en.properties
@@ -1,7 +1,5 @@
 #Thu Dec 07 19:13:19 CET 2017
 actualPoints=$org.olat.modules.iq\:actualPoints
-admin.12.description=Note: The OpenOLAT support for the QTI1.2 standard will end and be removed completely with release 14.
-admin.12.title=QTI 1.2 settings
 admin.menu.title=QTI 2.1
 admin.menu.title.alt=QTI 2.1 settings
 admin.title=QTI 2.1 settings
@@ -81,8 +79,6 @@ correct.solution=Correct solution
 correction=Grade
 correction.workflow=Correction workflow
 correction.workflow.anonymous=Anonymous
-create.12.resources=Allow new QTI 1.2 tests and questions
-create.12.survey.resources=Allow new QTI 1.2 questionnaires
 countdown.running=Time limit {1} seconds\: <strong>{0} seconds left</strong>
 debug.outcomes=Output data
 debug.responses=Responses data
diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_fr.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_fr.properties
index ab088ae1b6af4991cc9b59b06046dc84e1a834ea..e2f62fe82b281af37f819c9467eb78898d4303a2 100644
--- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_fr.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_fr.properties
@@ -1,7 +1,5 @@
 #Sun Feb 24 08:30:11 CET 2019
 actualPoints=$org.olat.modules.iq\:actualPoints
-admin.12.description=Conseil\: le support d'OpenOLAT du standard QTI 1.2 arrive \u00E0 son terme et sera enlever compl\u00E8tement de la version 14.
-admin.12.title=Configuration QTI 1.2
 admin.menu.title=QTI 2.1
 admin.menu.title.alt=Configuration QTI 2.1
 admin.title=Configuration QTI 2.1
@@ -82,8 +80,6 @@ correction=Corriger
 correction.workflow=Corrections
 correction.workflow.anonymous=Anonymis\u00E9
 countdown.running=Limite de temps de {1} secondes\: seulement <strong>{0} secondes restantes</strong>
-create.12.resources=Autoriser de nouveaux test et questions au format QTI 1.2
-create.12.survey.resources=Autoriser de nouveaux questionnaires au format QTI 1.2
 debug.outcomes=Donn\u00E9es et variables
 debug.responses=Donn\u00E9es de la r\u00E9ponse
 digital.signature=Signature digitale des r\u00E9sultats du test
diff --git a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_pt_BR.properties b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_pt_BR.properties
index a65296c1aaf74be813c1e78c9b95dd482d300adf..2a3e5bfcb91c68b7392aba714f25edc957e594ed 100644
--- a/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_pt_BR.properties
+++ b/src/main/java/org/olat/ims/qti21/ui/_i18n/LocalStrings_pt_BR.properties
@@ -1,7 +1,5 @@
 #Wed Mar 06 15:44:46 CET 2019
 actualPoints=$org.olat.modules.iq\:actualPoints
-admin.12.description=Nota\: O suporte ao OpenOLAT para o padr\u00E3o QTI1.2 ser\u00E1 finalizado e removido completamente com o release 14
-admin.12.title=Configura\u00E7\u00F5es QTI 1.2
 admin.menu.title=QTI 2.1
 admin.menu.title.alt=Defini\u00E7\u00F5es do QTI 2.1
 admin.title=Defini\u00E7\u00F5es do QTI 2.1
@@ -82,8 +80,6 @@ correction=Grau
 correction.workflow=Workflow de corre\u00E7\u00E3o
 correction.workflow.anonymous=An\u00F4nimo
 countdown.running=Limite de tempo {1} segundos\: <strong>{0} segundos restantes</strong>
-create.12.resources=Permitir novos testes QTI 1.2 e perguntas
-create.12.survey.resources=Permitir novos question\u00E1rios QTI 1.2
 debug.outcomes=Dados de sa\u00EDda
 debug.responses=Dados de respostas
 digital.signature=Recibo dos resultados dos testes
diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties
index 0e7e02f7e4322bc8517c04fd4f071284cc07e8ca..44d2a62eef143d265460d2399e5c3944af38c445 100644
--- a/src/main/resources/serviceconfig/olat.properties
+++ b/src/main/resources/serviceconfig/olat.properties
@@ -358,6 +358,13 @@ qti21.digital.signature.certificate=
 #Try an other encoding to open the ZIP files during import of tests
 qti21.import.encoding.fallback=
 
+########################################################################
+# QTI 1.2 DEPRECATED , WILL BE REMOVED IN A FURTHER RELEASE
+########################################################################
+qti12.edit.resources.enabled=false
+qti12.create.resources.enabled=false
+qti12.survey.create.resources.enabled=false
+
 ########################################################################
 # Certificates
 ########################################################################
@@ -1315,14 +1322,12 @@ course.node.podcast.enabled=true
 course.node.blog.enabled=true
 # The project broker
 course.node.projectbroker.enabled=true
-# The test QTI 1.2
+# The test QTI
 course.node.test.enabled=true
-# The self test QTI 1.2
+# The self test QTI
 course.node.selfttest.enabled=true
-# The survey QTI 1.2
+# The survey QTI
 course.node.survey.enabled=true
-# This course node should not be used an longer. Use the modern one (course.node.form.survey.enabled)!
-qti12.survey.create.resources.enabled=false
 # The form survey
 course.node.form.survey.enabled=true
 # The modern check list