diff --git a/src/main/java/de/bps/course/nodes/den/DENManageParticipantsController.java b/src/main/java/de/bps/course/nodes/den/DENManageParticipantsController.java
index c5ea6a8cb49e5adfe0d1175caff0fa939f8968c7..4a91e7eb42f810ee719eadd118d2ef35bf5a0baa 100644
--- a/src/main/java/de/bps/course/nodes/den/DENManageParticipantsController.java
+++ b/src/main/java/de/bps/course/nodes/den/DENManageParticipantsController.java
@@ -319,7 +319,7 @@ public class DENManageParticipantsController extends BasicController {
 		cmsg.addEmailTo(contactList);
 		
 		removeAsListenerAndDispose(contactCtr);
-		contactCtr = new ContactFormController(ureq, getWindowControl(), false, false, false, cmsg, null);
+		contactCtr = new ContactFormController(ureq, getWindowControl(), false, false, false, cmsg);
 		listenTo(contactCtr);
 		
 		sendMessageVC.contextPut("title", translate("participants.message"));
diff --git a/src/main/java/de/bps/course/nodes/den/DENManager.java b/src/main/java/de/bps/course/nodes/den/DENManager.java
index 20c7c7e040cd8d656f62220f1756e2144f758cc5..2e893c97b908be4fe986b7e12fc8cca4955e30f3 100644
--- a/src/main/java/de/bps/course/nodes/den/DENManager.java
+++ b/src/main/java/de/bps/course/nodes/den/DENManager.java
@@ -764,7 +764,7 @@ public class DENManager {
 		}
 		contactList.addAllIdentites(participants);
 		cmsg.addEmailTo(contactList);
-		ContactFormController contactCtr = new ContactFormController(ureq, wControl, false, false, false, cmsg, null);
+		ContactFormController contactCtr = new ContactFormController(ureq, wControl, false, false, false, cmsg);
 		contactCtr.addControllerListener(listener);
 		sendMessageVC.contextPut("title", trans.translate("participants.message"));
 		sendMessageVC.put("contactForm", contactCtr.getInitialComponent());
diff --git a/src/main/java/org/olat/admin/sysinfo/LargeFilesController.java b/src/main/java/org/olat/admin/sysinfo/LargeFilesController.java
index 1c8e615d7babd256f4734541a4a181f928c0ab4e..44a328014955a5a781ccf8a90d4924794e0a3113 100644
--- a/src/main/java/org/olat/admin/sysinfo/LargeFilesController.java
+++ b/src/main/java/org/olat/admin/sysinfo/LargeFilesController.java
@@ -531,7 +531,7 @@ public class LargeFilesController extends FormBasicController implements Extende
 						.append("<li>")
 							.append("Path: " + row.getPath())
 						.append("</li>");
-						if (row.getContext() != VFSContextInfoUnknownPathResolver.UNKNOWN_TYPE ) {
+						if (!row.getContext().equals(VFSContextInfoUnknownPathResolver.UNKNOWN_TYPE)) {
 							bodyFiles.append("<li>")
 								.append("<span>URL: " + "<a href='" + vfsRepositoryService.getContextInfoFor(row.getPath(), getLocale()).getContextUrl() + "'>" + vfsRepositoryService.getContextInfoFor(row.getPath(), getLocale()).getContextUrl() + "</a></span>")
 							.append("</li>");
@@ -543,7 +543,7 @@ public class LargeFilesController extends FormBasicController implements Extende
 		bodyFiles.append("</ul>");
 
 		cmsg.setBodyText(bodyStart + bodyFiles.toString() + bodyEnd);
-		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg, null);
+		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg);
 		listenTo(contactCtrl);
 		cmc = new CloseableModalController(getWindowControl(), "close", contactCtrl.getInitialComponent());
 		cmc.activate();
diff --git a/src/main/java/org/olat/collaboration/CollaborationTools.java b/src/main/java/org/olat/collaboration/CollaborationTools.java
index 2d9cb12e0962d188be89300c893e04c06b00294e..7bebf36f6c8a94cf1a3665910c348cad89288774 100644
--- a/src/main/java/org/olat/collaboration/CollaborationTools.java
+++ b/src/main/java/org/olat/collaboration/CollaborationTools.java
@@ -480,7 +480,7 @@ public class CollaborationTools implements Serializable {
 	 * @return a contact form controller
 	 */
 	public ContactFormController createContactFormController(UserRequest ureq, WindowControl wControl, ContactMessage cmsg) {
-		return new ContactFormController(ureq, wControl, true, false, false, cmsg, null);
+		return new ContactFormController(ureq, wControl, true, false, false, cmsg);
 	}
 
 	
diff --git a/src/main/java/org/olat/commons/memberlist/ui/MembersAvatarDisplayRunController.java b/src/main/java/org/olat/commons/memberlist/ui/MembersAvatarDisplayRunController.java
index 7e4c8e98a98933fbdf904f6d6379ad9d68e798f0..b57185d55e2df8b1163c1d6a96b55a4ebcf3d5e5 100644
--- a/src/main/java/org/olat/commons/memberlist/ui/MembersAvatarDisplayRunController.java
+++ b/src/main/java/org/olat/commons/memberlist/ui/MembersAvatarDisplayRunController.java
@@ -504,7 +504,7 @@ public class MembersAvatarDisplayRunController extends FormBasicController {
 			cmsg.addEmailTo(contactList);
 			// preset body template from i18n
 			cmsg.setBodyText(createBodyTemplate());
-			emailController = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg, null);
+			emailController = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg);
 			listenTo(emailController);
 			
 			String title = translate("members.email.title");
diff --git a/src/main/java/org/olat/commons/memberlist/ui/MembersTableController.java b/src/main/java/org/olat/commons/memberlist/ui/MembersTableController.java
index c67cf7dcc31e30bc7e0b5efcdffd535deee965b3..f2f7e36b23cf901a0fd3fdb69d3e34f3c346e061 100644
--- a/src/main/java/org/olat/commons/memberlist/ui/MembersTableController.java
+++ b/src/main/java/org/olat/commons/memberlist/ui/MembersTableController.java
@@ -318,7 +318,7 @@ public class MembersTableController extends FormBasicController {
 	}
 	
 	private void doSendEmailToMember(ContactList contactList, UserRequest ureq) {
-		if (contactList.getEmailsAsStrings().size() > 0) {
+		if (!contactList.getEmailsAsStrings().isEmpty()) {
 			removeAsListenerAndDispose(cmc);
 			removeAsListenerAndDispose(emailController);
 			
@@ -326,7 +326,7 @@ public class MembersTableController extends FormBasicController {
 			cmsg.addEmailTo(contactList);
 			// preset body template from i18n
 			cmsg.setBodyText(createBodyTemplate());
-			emailController = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg, null);
+			emailController = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg);
 			listenTo(emailController);
 			
 			String title = translate("members.email.title");
diff --git a/src/main/java/org/olat/core/commons/controllers/impressum/ContactController.java b/src/main/java/org/olat/core/commons/controllers/impressum/ContactController.java
index 65e25a8c4590864c0f6824d264a364ae00a910f6..d5641f9bf1d634ba2093ea1c841688b85cf0a3d4 100644
--- a/src/main/java/org/olat/core/commons/controllers/impressum/ContactController.java
+++ b/src/main/java/org/olat/core/commons/controllers/impressum/ContactController.java
@@ -90,7 +90,7 @@ public class ContactController extends BasicController implements GenericEventLi
 		contactMessage.addEmailTo(contactList);
 
 		// Show GUI
-		contactForm = new ContactFormController(ureq, getWindowControl(), false, false, false, contactMessage, null);
+		contactForm = new ContactFormController(ureq, getWindowControl(), false, false, false, contactMessage);
 		listenTo(contactForm);
 		content.put("contactForm", contactForm.getInitialComponent());
 		putInitialPanel(content);
diff --git a/src/main/java/org/olat/core/util/mail/MailTemplate.java b/src/main/java/org/olat/core/util/mail/MailTemplate.java
index a81b2757cfb3e8fc49d8d21cec8bc28d0a717602..e818259e0bda4df190d4dcf9c45aa3c001d1db07 100644
--- a/src/main/java/org/olat/core/util/mail/MailTemplate.java
+++ b/src/main/java/org/olat/core/util/mail/MailTemplate.java
@@ -45,6 +45,7 @@ import org.olat.core.id.Identity;
  *         http://www.frentix.com
  */
 public abstract class MailTemplate {
+	private String templateName;
 	private String subjectTemplate;
 	private String bodyTemplate;
 	private File[] attachments;
@@ -64,6 +65,24 @@ public abstract class MailTemplate {
 		this.context = new VelocityContext();
 		this.cpfrom = true;
 	}
+	
+	/**
+	 * @return A name for UI
+	 */
+	public String getTemplateName() {
+		return templateName;
+	}
+
+	/**
+	 * Only used for UI
+	 * 
+	 * @param templateName The name of the template
+	 */
+	public void setTemplateName(String templateName) {
+		this.templateName = templateName;
+	}
+
+
 
 	/**
 	 * @return
diff --git a/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java b/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java
index 3b5b30d8dff59d645d59d4978f5346435dbdc897..5e3db3ee1b0faa5a2ea7f1c5c42660c9d55af521 100644
--- a/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java
+++ b/src/main/java/org/olat/course/assessment/ui/tool/IdentityListCourseNodeController.java
@@ -894,7 +894,7 @@ public class IdentityListCourseNodeController extends FormBasicController
 			contactMessage.addEmailTo(contactList);
 
 			removeAsListenerAndDispose(contactCtrl);
-			contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, contactMessage, null);
+			contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, contactMessage);
 			listenTo(contactCtrl);
 
 			cmc = new CloseableModalController(getWindowControl(), translate("close"),
diff --git a/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementController.java b/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementController.java
index 7d77feb4d7a5d8aa6a5285270fac83f33c1e30e1..863a9f4bc57c33d8a329c89899dc44f6b201372f 100644
--- a/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementController.java
+++ b/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementController.java
@@ -371,7 +371,7 @@ public class CertificateAndEfficiencyStatementController extends BasicController
 		ContactList contactList = new ContactList("to");
 		contactList.add(statementOwner);
 		cmsg.addEmailTo(contactList);
-		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg, null);
+		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg);
 		listenTo(contactCtrl);
 		cmc = new CloseableModalController(getWindowControl(), translate("close"), contactCtrl.getInitialComponent());
 		cmc.activate();
diff --git a/src/main/java/org/olat/course/nodes/co/COToolController.java b/src/main/java/org/olat/course/nodes/co/COToolController.java
index e8d64e7be9e914e3ce1b616e90ea5228fc90b9c2..cf9d5505167e90dcd112f2766aee96674a2496df 100644
--- a/src/main/java/org/olat/course/nodes/co/COToolController.java
+++ b/src/main/java/org/olat/course/nodes/co/COToolController.java
@@ -81,7 +81,7 @@ public class COToolController extends BasicController {
 		ContactList dummyList = new ContactList("dummy");
 		dummyList.add(getIdentity());
 		cmsg.addEmailTo(dummyList);
-		emailCtrl = new ContactFormController(ureq, getWindowControl(), false, false, false, cmsg, null);
+		emailCtrl = new ContactFormController(ureq, getWindowControl(), false, false, false, cmsg);
 		emailCtrl.setContactFormTitle(null);
 		Set<Recipients> recipients = recipientCtrl.getSelectedRecipients();
 		doSetReciepients(recipients);
diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java
index 23109d337619a42b5eba7989b04300c5e36d3b82..376fd35d92a29e96f2d27070a704625a5104c48f 100644
--- a/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java
+++ b/src/main/java/org/olat/course/nodes/gta/ui/GTACoachController.java
@@ -818,7 +818,7 @@ public class GTACoachController extends GTAAbstractController implements Assessm
 			ContactMessage cmsg = new ContactMessage(ureq.getIdentity());
 			cmsg.addEmailTo(contactList);
 			
-			emailController = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg, null);
+			emailController = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg);
 			listenTo(emailController);
 			
 			removeAsListenerAndDispose(cmc);
diff --git a/src/main/java/org/olat/group/ui/homepage/GroupContactController.java b/src/main/java/org/olat/group/ui/homepage/GroupContactController.java
index ba1d873b0f003fee1a34a21e937b616c440722be..3afd9908606fcfe39d6180472e8271a528fef21e 100644
--- a/src/main/java/org/olat/group/ui/homepage/GroupContactController.java
+++ b/src/main/java/org/olat/group/ui/homepage/GroupContactController.java
@@ -57,7 +57,7 @@ public class GroupContactController extends BasicController {
 		// per default contact the group owners.
 		if (businessGroupService.countMembers(businessGroup, GroupRoles.coach.name()) != 0) {
 			ContactMessage contactMessage = createContactMessage(ureq.getIdentity(), "form.to.owners", businessGroup);
-			contactForm = new ContactFormController(ureq, getWindowControl(), false, false, false, contactMessage, null);
+			contactForm = new ContactFormController(ureq, getWindowControl(), false, false, false, contactMessage);
 			listenTo(contactForm);
 			content.put("contactForm",	contactForm.getInitialComponent());
 		} else {
diff --git a/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java b/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
index cb5f7fdccea243e072c083de9b450ddab75189da..f92a90cbdd67c9b3c812b3a404ec6b20ee3d52f9 100644
--- a/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
+++ b/src/main/java/org/olat/group/ui/main/AbstractBusinessGroupListController.java
@@ -602,7 +602,7 @@ public abstract class AbstractBusinessGroupListController extends FormBasicContr
 		msg.setBodyText(translate("request.leaving.body", args));
 		msg.addEmailTo(contacts);
 		
-		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, true, msg, null);
+		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, true, msg);
 		listenTo(contactCtrl);
 		cmc = new CloseableModalController(getWindowControl(), "close", contactCtrl.getInitialComponent(),
 				true, translate("dialog.modal.bg.asktoleave.title"));
diff --git a/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java b/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java
index 2d2c903a0f90c48d06fb52baab6689e0482788cd..cf64ce59499d12b17a2b577327d3c9e7d4b7eef6 100644
--- a/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java
+++ b/src/main/java/org/olat/group/ui/main/AbstractMemberListController.java
@@ -679,7 +679,7 @@ public abstract class AbstractMemberListController extends FormBasicController i
 		contactList.addAllIdentites(identities);
 		contactMessage.addEmailTo(contactList);
 		
-		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, contactMessage, null);
+		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, contactMessage);
 		listenTo(contactCtrl);
 
 		cmc = new CloseableModalController(getWindowControl(), translate("close"), contactCtrl.getInitialComponent(),
@@ -764,7 +764,7 @@ public abstract class AbstractMemberListController extends FormBasicController i
 		
 		OLATResourceable ores = OresHelper.createOLATResourceableType("Contact");
 		WindowControl bwControl = addToHistory(ureq, ores, null);
-		contactCtrl = new ContactFormController(ureq, bwControl, true, false, false, cmsg, null);
+		contactCtrl = new ContactFormController(ureq, bwControl, true, false, false, cmsg);
 		listenTo(contactCtrl);
 		
 		toolbarPanel.pushController(fullname, contactCtrl);
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 a40d0bf2ad9e5d0725ae865e59629d38a047dae7..9fbc84dc823fe68c3a3ff2753eba110fcdcdba9b 100644
--- a/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java
+++ b/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java
@@ -816,7 +816,7 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 					changeEmail.setBodyText("<p>" + userMsg + "</p>\n<pre>" + changeLog + "</pre>");
 				}// else nothing was added!
 				changeEmail.setSubject("Change log for " + startedWithTitle);
-				cfc = new ContactFormController(ureq, getWindowControl(), true, false, false, changeEmail, null);
+				cfc = new ContactFormController(ureq, getWindowControl(), true, false, false, changeEmail);
 				listenTo(cfc);
 				exitPanel.setContent(cfc.getInitialComponent());
 				return;
diff --git a/src/main/java/org/olat/modules/co/ContactForm.java b/src/main/java/org/olat/modules/co/ContactForm.java
index 4a4fd4c3b87c40db23d86bf4ba9e1c92ff891f22..929c2775c1429b623a154dd4e39170b21163cd37 100644
--- a/src/main/java/org/olat/modules/co/ContactForm.java
+++ b/src/main/java/org/olat/modules/co/ContactForm.java
@@ -28,7 +28,6 @@ package org.olat.modules.co;
 import java.io.File;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.Hashtable;
 import java.util.List;
 import java.util.Map;
 
@@ -41,12 +40,14 @@ import org.olat.core.gui.components.form.flexible.elements.FileElement;
 import org.olat.core.gui.components.form.flexible.elements.FormLink;
 import org.olat.core.gui.components.form.flexible.elements.RichTextElement;
 import org.olat.core.gui.components.form.flexible.elements.SelectionElement;
+import org.olat.core.gui.components.form.flexible.elements.SingleSelection;
 import org.olat.core.gui.components.form.flexible.elements.TextElement;
 import org.olat.core.gui.components.form.flexible.impl.Form;
 import org.olat.core.gui.components.form.flexible.impl.FormBasicController;
 import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
 import org.olat.core.gui.components.link.Link;
+import org.olat.core.gui.components.util.KeyValues;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.Event;
 import org.olat.core.gui.control.WindowControl;
@@ -60,6 +61,7 @@ import org.olat.core.util.filter.FilterFactory;
 import org.olat.core.util.mail.ContactList;
 import org.olat.core.util.mail.EmailAddressValidator;
 import org.olat.core.util.mail.MailModule;
+import org.olat.core.util.mail.MailTemplate;
 import org.olat.user.UserManager;
 
 /**
@@ -107,12 +109,15 @@ public class ContactForm extends FormBasicController {
 	private boolean hasMsgSave=true;
 	private static final String NLS_CONTACT_SEND_CP_FROM = "contact.cp.from";
 	private SelectionElement tcpfrom;
+	private static final String NLS_CONTACT_TEMPLATES = "contact.templates";
+	private SingleSelection templateEl;
 	private Identity emailFrom;
 	private File attachementTempDir;
 	private long attachmentSize = 0l;
+	private List<MailTemplate> mailTemplates;
 	private Map<String,String> attachmentCss = new HashMap<>();
 	private Map<String,String> attachmentNames = new HashMap<>();
-	private Map<String,ContactList> contactLists = new Hashtable<>();
+	private Map<String,ContactList> contactLists = new HashMap<>();
 	
 	private final UserManager userManager;
 
@@ -137,8 +142,7 @@ public class ContactForm extends FormBasicController {
 		this.contactAttachmentMaxSizeInMb = CoreSpringFactory.getImpl(MailModule.class).getMaxSizeForAttachement();
 		userManager = CoreSpringFactory.getImpl(UserManager.class);
 		initForm(ureq);
-	}
-		
+	}	
 
 	public void setSubject(final String defaultSubject) {
 		tsubject.setValue(defaultSubject);
@@ -154,6 +158,29 @@ public class ContactForm extends FormBasicController {
 			addEmailTo(contactList);
 		}
 	}
+	
+	public void setTemplates(List<MailTemplate> templates) {
+		this.mailTemplates = templates;
+		if(templates == null || templates.isEmpty()) {
+			templateEl.setVisible(false);
+		} else {
+			templateEl.setVisible(templates.size() > 1);
+			templateEl.setAllowNoSelection(templates.size() == 1);
+			
+			KeyValues templatesKeyValues = new KeyValues();
+			for(int i=0; i<templates.size(); i++) {
+				String templateName = templates.get(i).getTemplateName();
+				if(!StringHelper.containsNonWhitespace(templateName)) {
+					templateName = Integer.toString(i);
+				}
+				templatesKeyValues.add(KeyValues.entry(Integer.toString(i), templateName));
+			}
+			String[] templateKeys = templatesKeyValues.keys();
+			templateEl.setKeysAndValues(templatesKeyValues.keys(), templatesKeyValues.values(), null);
+			templateEl.select(templateKeys[0], true);
+			selectTemplate(0);
+		}
+	}
 
 	/**
 	 * add a ContactList as EmailTo:
@@ -268,6 +295,22 @@ public class ContactForm extends FormBasicController {
  		return tbody.getValue(FilterFactory.getSmileysCssToDataUriFilter());
 	}
  	
+ 	public MailTemplate getTemplate() {
+ 		if(mailTemplates == null || mailTemplates.isEmpty()) {
+ 			return null;
+ 		}
+ 		if(mailTemplates.size() == 1) {
+ 			return mailTemplates.get(0);
+ 		}
+ 		if(templateEl.isVisible() && templateEl.isOneSelected()) {
+ 			int selected = templateEl.getSelected();
+ 			if(selected >= 0 && selected < mailTemplates.size()) {
+ 				return mailTemplates.get(selected);
+ 			}
+ 		}
+ 		return null;
+ 	}
+ 	
  	public File[] getAttachments() {
  		List<File> attachments = new ArrayList<>();
  		for(FormLink removeLink : attachmentLinks) {
@@ -363,15 +406,33 @@ public class ContactForm extends FormBasicController {
 				uploadCont.setLabel(null, null);
 				attachmentEl.setLabel(NLS_CONTACT_ATTACHMENT, null);
 			}
+		} else if(templateEl == source) {
+			if(templateEl.isOneSelected() && StringHelper.isLong(templateEl.getSelectedKey())) {
+				selectTemplate(Integer.parseInt(templateEl.getSelectedKey()));
+			}
 		}
 		super.formInnerEvent(ureq, source, event);
 	}
+	
+	private void selectTemplate(int index) {
+		if(index >= 0 && index < mailTemplates.size()) {
+			MailTemplate template = mailTemplates.get(index);
+			setSubject(template.getSubjectTemplate());
+			setBody(template.getBodyTemplate());
+		}
+	}
 
 	@Override
 	protected void initForm(FormItemContainer formLayout, Controller listener, UserRequest ureq) {
 		formLayout.setElementCssClass("o_sel_contact_form");
 		
 		setFormTitle("header.newcntctmsg");
+		
+		templateEl = uifactory.addDropdownSingleselect("ttemplates", NLS_CONTACT_TEMPLATES, formLayout, new String[0], new String[0]);
+		templateEl.setVisible(false);
+		templateEl.setAllowNoSelection(true);
+		templateEl.addActionListener(FormEvent.ONCHANGE);
+		
 		String fullName = userManager.getUserDisplayName(emailFrom);
 		if(StringHelper.containsNonWhitespace(fullName)) {
 			fullName = "[" + fullName + "]";
@@ -408,19 +469,18 @@ public class ContactForm extends FormBasicController {
 		attachmentEl.addActionListener(FormEvent.ONCHANGE);
 		attachmentEl.setExampleKey(NLS_CONTACT_ATTACHMENT_EXPL, new String[]{Integer.toString(contactAttachmentMaxSizeInMb)});
 		
-
 		tcpfrom = uifactory.addCheckboxesVertical("tcpfrom", "", formLayout, new String[]{"xx"}, new String[]{translate(NLS_CONTACT_SEND_CP_FROM)}, 1);
 		
 		FormLayoutContainer buttonGroupLayout = FormLayoutContainer.createButtonLayout("buttonGroupLayout", getTranslator());
 		buttonGroupLayout.setElementCssClass("o_sel_contact_buttons");
 		formLayout.add(buttonGroupLayout);
 		
-		if(hasMsgSave) {
-			uifactory.addFormSubmitButton("msg.save", buttonGroupLayout);
-		}
 		if (hasMsgCancel) {
 			uifactory.addFormCancelButton("msg.cancel", buttonGroupLayout, ureq, getWindowControl());
 		}
+		if(hasMsgSave) {
+			uifactory.addFormSubmitButton("msg.save", buttonGroupLayout);
+		}
 	}
 
 	@Override
diff --git a/src/main/java/org/olat/modules/co/ContactFormController.java b/src/main/java/org/olat/modules/co/ContactFormController.java
index 4561b8ad0d702a42c3a8e00d41c416d0c9033047..f5ffad09892dfbbd83b732c4bf0ff70768ba6a4e 100644
--- a/src/main/java/org/olat/modules/co/ContactFormController.java
+++ b/src/main/java/org/olat/modules/co/ContactFormController.java
@@ -26,6 +26,7 @@
 package org.olat.modules.co;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.List;
 
 import org.olat.core.gui.UserRequest;
@@ -91,16 +92,20 @@ import org.springframework.beans.factory.annotation.Autowired;
  */
 public class ContactFormController extends BasicController {
 
-	private ContactForm cntctForm;
+	private final ContactForm cntctForm;
 	private DialogBoxController noUsersErrorCtr;
 
 	private Object userObject;
 	private Identity emailFrom;
-	private MailTemplate template;
+	private List<MailTemplate> templates;
 	
 	@Autowired
 	private MailManager mailService;
 	
+	public ContactFormController(UserRequest ureq, WindowControl windowControl, boolean isCanceable, boolean isReadonly, boolean hasRecipientsEditable, ContactMessage cmsg) {
+		this(ureq, windowControl, isCanceable, isReadonly, hasRecipientsEditable, cmsg, Collections.emptyList());
+	}
+	
 	/**
 	 * 
 	 * @param ureq The user request
@@ -113,17 +118,28 @@ public class ContactFormController extends BasicController {
 	 */
 	public ContactFormController(UserRequest ureq, WindowControl windowControl, boolean isCanceable, boolean isReadonly, boolean hasRecipientsEditable,
 			ContactMessage cmsg, MailTemplate template) {
+		this(ureq, windowControl, isCanceable, isReadonly, hasRecipientsEditable, cmsg,
+				template == null ? null : Collections.singletonList(template));
+	}
+	
+	public ContactFormController(UserRequest ureq, WindowControl windowControl, boolean isCanceable, boolean isReadonly, boolean hasRecipientsEditable,
+			ContactMessage cmsg, List<MailTemplate> templates) {
 		super(ureq, windowControl);
 		
-		this.template = template;
+		this.templates = templates;
 		//init email form
 		emailFrom = cmsg.getFrom();
 		
-		cntctForm = new ContactForm(ureq, windowControl, emailFrom, isReadonly,isCanceable,hasRecipientsEditable);
+		cntctForm = new ContactForm(ureq, windowControl, emailFrom, isReadonly, isCanceable, hasRecipientsEditable);
 		listenTo(cntctForm);
 		
 		List<ContactList> recipList = cmsg.getEmailToContactLists();
 		boolean hasAtLeastOneAddress = hasAtLeastOneAddress(recipList);
+		
+		if(templates != null && !templates.isEmpty()) {
+			cntctForm.setTemplates(templates);
+		}
+		MailTemplate template = templates != null && templates.size() == 1 ? templates.get(0) : null;
 		if(StringHelper.containsNonWhitespace(cmsg.getBodyText())) {
 			cntctForm.setBody(cmsg.getBodyText());
 		} else if(template != null && StringHelper.containsNonWhitespace(template.getBodyTemplate())) {
@@ -148,26 +164,26 @@ public class ContactFormController extends BasicController {
 		this.userObject = userObject;
 	}
 	
+	public String getAndRemoveTitle() {
+		return cntctForm.getAndRemoveFormTitle();
+	}
+	
 	public void setContactFormTitle(String translatedTitle) {
-		if(cntctForm != null) {
-			cntctForm.setFormTranslatedTitle(translatedTitle);
-		}
+		cntctForm.setFormTranslatedTitle(translatedTitle);
 	}
 	
 	public void setContactFormDescription(String translatedDescription) {
-		if(cntctForm != null) {
-			cntctForm.setFormTranslatedDescription(translatedDescription);
-		}
+		cntctForm.setFormTranslatedDescription(translatedDescription);
 	}
 
 	private boolean hasAtLeastOneAddress(List<ContactList> recipList) {
 		boolean hasAtLeastOneAddress = false;
-		if (recipList != null && recipList.size() > 0 ) {
+		if (recipList != null && !recipList.isEmpty()) {
 			for (ContactList cl: recipList) {
 				if (!hasAtLeastOneAddress && cl != null && cl.hasAddresses()) {
 					hasAtLeastOneAddress = true;
 				}
-				if (cl.hasAddresses()) {
+				if (cl != null && cl.hasAddresses()) {
 					cntctForm.addEmailTo(cl);
 				}
 			}
@@ -176,23 +192,15 @@ public class ContactFormController extends BasicController {
 	}
 	
 	public String getSubject() {
-		if(cntctForm != null) {
-			return cntctForm.getSubject();
-		}
-		return null;
+		return cntctForm.getSubject();
 	}
 	
 	public String getBody() {
-		if(cntctForm != null) {
-			return cntctForm.getBody();
-		}
-		return null;
+		return cntctForm.getBody();
 	}
 	
 	public void setRecipientsLists(List<ContactList> recipientsLists) {
-		if (cntctForm != null) {
-			cntctForm.setRecipientsLists(recipientsLists);
-		}	
+		cntctForm.setRecipientsLists(recipientsLists);
 	}
 
 	private void init(UserRequest ureq, boolean hasAtLeastOneAddress, List<Identity> disabledIdentities) {
@@ -246,10 +254,16 @@ public class ContactFormController extends BasicController {
 	private MailBundle createBundle(MailerResult result) {
 		MailContext context = new MailContextImpl(getWindowControl().getBusinessControl().getAsString());
 		MailBundle bundle;
-		if(template == null) {
+		if(templates == null || templates.isEmpty()) {
 			bundle = new MailBundle(context);
 			bundle.setContent(cntctForm.getSubject(), cntctForm.getBody(), cntctForm.getAttachments());
 		} else {
+			MailTemplate template;
+			if(templates.size() == 1) {
+				template = templates.get(0);
+			} else {
+				template = cntctForm.getTemplate();
+			}
 			template.setSubjectTemplate(cntctForm.getSubject());
 			template.setBodyTemplate(cntctForm.getBody());
 			template.setAttachments(cntctForm.getAttachments());
diff --git a/src/main/java/org/olat/modules/co/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/co/_i18n/LocalStrings_de.properties
index 2e24e74f2f09e9c8d821349894d503544b907857..57d0472afdbaabc84034ab9143357b24eb44cd8a 100644
--- a/src/main/java/org/olat/modules/co/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/co/_i18n/LocalStrings_de.properties
@@ -4,6 +4,7 @@ contact.cp.from = Kopie an Absender
 contact.list.sender = Absender
 contact.from=Von
 contact.subject=Betreff
+contact.templates=Vorlage
 contact.to=An
 contact.to.groupname.undisclosedrecipients=Vordefinierte Empf\u00E4nger
 contact.attachment=Anhang
diff --git a/src/main/java/org/olat/modules/co/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/co/_i18n/LocalStrings_en.properties
index daceed472a78e382dd6d4c1692a2bcf4f3f01e99..e606d351bf224cfabde1261de2814794c35fdd3b 100644
--- a/src/main/java/org/olat/modules/co/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/co/_i18n/LocalStrings_en.properties
@@ -6,6 +6,7 @@ contact.cp.from=Copy sent to addresser
 contact.from=From
 contact.list.sender=Addresser
 contact.subject=Subject
+contact.templates=Templates
 contact.to=To
 contact.to.groupname.undisclosedrecipients=Predefined recipients
 error.field.not.empty=This field is mandatory.
diff --git a/src/main/java/org/olat/modules/coach/ui/StudentCoursesController.java b/src/main/java/org/olat/modules/coach/ui/StudentCoursesController.java
index 5be69a779f1a8c543bfce1ed8c2f53f2485bfc74..ed4b88a7f835ca6dad9171a5327061f50e78cd72 100644
--- a/src/main/java/org/olat/modules/coach/ui/StudentCoursesController.java
+++ b/src/main/java/org/olat/modules/coach/ui/StudentCoursesController.java
@@ -399,7 +399,7 @@ public class StudentCoursesController extends FormBasicController implements Act
 		ContactList contactList = new ContactList(fullName);
 		contactList.add(student);
 		cmsg.addEmailTo(contactList);
-		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg, null);
+		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg);
 		listenTo(contactCtrl);
 		cmc = new CloseableModalController(getWindowControl(), translate("close"), contactCtrl.getInitialComponent());
 		cmc.activate();
diff --git a/src/main/java/org/olat/modules/grading/manager/GradingAssignmentDAO.java b/src/main/java/org/olat/modules/grading/manager/GradingAssignmentDAO.java
index 0a00670472d7d588db22838408a6d626dad64545..64c5b95e20e409d2d40c204dcce2dc7797688837 100644
--- a/src/main/java/org/olat/modules/grading/manager/GradingAssignmentDAO.java
+++ b/src/main/java/org/olat/modules/grading/manager/GradingAssignmentDAO.java
@@ -117,6 +117,10 @@ public class GradingAssignmentDAO {
 				.getResultList();
 	}
 	
+	/**
+	 * @param key The assignment primary key
+	 * @return The assignment with the grader's identity fetched
+	 */
 	public GradingAssignment loadByKey(Long key) {
 		QueryBuilder sb = new QueryBuilder();
 		sb.append("select assignment from gradingassignment as assignment")
@@ -132,6 +136,32 @@ public class GradingAssignmentDAO {
 		return assignments == null || assignments.isEmpty() ? null : assignments.get(0);
 	}
 	
+	/**
+	 * @param key The assignment primary key
+	 * @return The assignment with the grader's identity fetched, reference entry,
+	 * 		assessment entry, repository entry in assessment entry
+	 */
+	public GradingAssignment loadFullByKey(Long key) {
+		QueryBuilder sb = new QueryBuilder();
+		sb.append("select assignment from gradingassignment as assignment")
+		  .append(" left join fetch assignment.grader as grader")
+		  .append(" left join fetch grader.identity as graderIdent")
+		  .append(" left join fetch graderIdent.user as graderUser")
+		  .append(" left join fetch assignment.referenceEntry as refEntry")
+		  .append(" left join fetch refEntry.olatResource as refEntryResource")
+		  .append(" left join fetch assignment.assessmentEntry as assessmentEntry")
+		  .append(" left join fetch assessmentEntry.repositoryEntry as assessmentRe")
+		  .append(" left join fetch assessmentRe.olatResource as assessmentReResource")
+		  .append(" where assignment.key=:assignmentKey");
+		
+		List<GradingAssignment> assignments = dbInstance.getCurrentEntityManager()
+				.createQuery(sb.toString(), GradingAssignment.class)
+				.setParameter("assignmentKey", key)
+				.getResultList();
+		return assignments == null || assignments.isEmpty() ? null : assignments.get(0);
+	}
+	
+	
 	public List<RepositoryEntry> getEntries(RepositoryEntryRef referenceEntry) {
 		QueryBuilder sb = new QueryBuilder();
 		sb.append("select distinct assessmentRe from gradingassignment as assignment")
diff --git a/src/main/java/org/olat/modules/grading/manager/GradingServiceImpl.java b/src/main/java/org/olat/modules/grading/manager/GradingServiceImpl.java
index 0e5b9fd8ee0f7e7a83e4697c33acbfa31eb055c1..8536fa2357757012f14112349b55b5927f31a7a1 100644
--- a/src/main/java/org/olat/modules/grading/manager/GradingServiceImpl.java
+++ b/src/main/java/org/olat/modules/grading/manager/GradingServiceImpl.java
@@ -360,7 +360,7 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, In
 
 	@Override
 	public GradingAssignment getGradingAssignment(GradingAssignmentRef ref) {
-		return gradingAssignmentDao.loadByKey(ref.getKey());
+		return gradingAssignmentDao.loadFullByKey(ref.getKey());
 	}
 	
 	@Override
@@ -507,7 +507,7 @@ public class GradingServiceImpl implements GradingService, UserDataDeletable, In
 	private GradingAssignment decorateGraderMailTemplate(GradingAssignment assignment, GraderMailTemplate template) {
 		if(template == null) return assignment;
 		
-		assignment = gradingAssignmentDao.loadByKey(assignment.getKey());
+		assignment = gradingAssignmentDao.loadFullByKey(assignment.getKey());
 		template.setAssessmentDate(assignment.getAssessmentDate());
 
 		RepositoryEntry entry = assignment.getAssessmentEntry().getRepositoryEntry();
diff --git a/src/main/java/org/olat/modules/grading/ui/AssignedReferenceEntryListController.java b/src/main/java/org/olat/modules/grading/ui/AssignedReferenceEntryListController.java
index 579e237769c70498e50922be822b78f8aea6188a..e12a7619c9b9013ad184948ee3600b0d8241e048 100644
--- a/src/main/java/org/olat/modules/grading/ui/AssignedReferenceEntryListController.java
+++ b/src/main/java/org/olat/modules/grading/ui/AssignedReferenceEntryListController.java
@@ -228,7 +228,7 @@ public class AssignedReferenceEntryListController extends FormBasicController {
 		msg.addEmailTo(contact);
 		
 		RepositoryEntry referenceEntry = row.getReferenceEntry();
-		MailTemplate template = new GraderMailTemplate(null, null, referenceEntry);
+		MailTemplate template = new GraderMailTemplate(null, null, null, referenceEntry);
 		contactGraderCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, msg, template);
 		listenTo(contactGraderCtrl);
 		
diff --git a/src/main/java/org/olat/modules/grading/ui/GradersListController.java b/src/main/java/org/olat/modules/grading/ui/GradersListController.java
index 8506404f78519c74c6c0323821d345c5f3cf1f2b..50f40d0f971c26937ff1b761b6b906f93a25c4ac 100644
--- a/src/main/java/org/olat/modules/grading/ui/GradersListController.java
+++ b/src/main/java/org/olat/modules/grading/ui/GradersListController.java
@@ -387,6 +387,7 @@ public class GradersListController extends FormBasicController {
 
 		MailTemplate template = new GraderMailTemplate(null, null, null);
 		contactGraderCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, msg, template);
+		contactGraderCtrl.getAndRemoveTitle();
 		listenTo(contactGraderCtrl);
 		
 		String graderName = userManager.getUserDisplayName(row.getGrader());
diff --git a/src/main/java/org/olat/modules/grading/ui/GradingAssignmentsListController.java b/src/main/java/org/olat/modules/grading/ui/GradingAssignmentsListController.java
index 00f581e15e01559af29c104538dc5f42878957fd..11800f1b861559ba9c39c245924ce0c146f992c5 100644
--- a/src/main/java/org/olat/modules/grading/ui/GradingAssignmentsListController.java
+++ b/src/main/java/org/olat/modules/grading/ui/GradingAssignmentsListController.java
@@ -718,8 +718,9 @@ public class GradingAssignmentsListController extends FormBasicController implem
 			
 			RepositoryEntry entry = entries.size() == 1 ? entries.iterator().next() : null;
 			RepositoryEntry referenceEntry = referenceEntries.size() == 1 ? referenceEntries.iterator().next() : null; 
-			MailTemplate template = new GraderMailTemplate(entry, null, referenceEntry);
-			contactGraderCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, msg, template);
+			List<MailTemplate> templates = getTemplates(entry, referenceEntry);
+			contactGraderCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, msg, templates);
+			contactGraderCtrl.getAndRemoveTitle();
 			listenTo(contactGraderCtrl);
 			
 			String graderName = getGradersNames(assignmentRows);
@@ -741,8 +742,9 @@ public class GradingAssignmentsListController extends FormBasicController implem
 		AssessmentEntry assessmentEntry = assignment.getAssessmentEntry();
 		RepositoryEntry entry = assessmentEntry.getRepositoryEntry();
 		
-		MailTemplate template = new GraderMailTemplate(entry, null, referenceEntry);
-		contactGraderCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, msg, template);
+		List<MailTemplate> templates = getTemplates(entry, referenceEntry);
+		contactGraderCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, msg, templates);
+		contactGraderCtrl.getAndRemoveTitle();
 		listenTo(contactGraderCtrl);
 		
 		String graderName = userManager.getUserDisplayName(row.getGrader());
@@ -752,6 +754,18 @@ public class GradingAssignmentsListController extends FormBasicController implem
 		cmc.activate();	
 	}
 	
+	private List<MailTemplate> getTemplates(RepositoryEntry entry, RepositoryEntry referenceEntry) {
+		List<MailTemplate> templates = new ArrayList<>();
+		templates.add(new GraderMailTemplate(translate("template.empty"), entry, null, referenceEntry));
+		templates.add(new GraderMailTemplate(translate("template.notification"), 
+				translate("mail.notification.subject"), translate("mail.notification.subject"), entry, null, referenceEntry));
+		templates.add(new GraderMailTemplate(translate("template.reminder1"),
+				translate("mail.reminder1.subject"), translate("mail.reminder1.body"), entry, null, referenceEntry));
+		templates.add(new GraderMailTemplate(translate("template.reminder2"), 
+				translate("mail.reminder2.subject"), translate("mail.reminder2.body"), entry, null, referenceEntry));
+		return templates;
+	}
+	
 	private void doBatchUnassignGrader(UserRequest ureq) {
 		List<GradingAssignmentRow> rows = getSelectedGradingAssignmentRows();
 		if(rows.isEmpty()) {
diff --git a/src/main/java/org/olat/modules/grading/ui/GradingInformationsController.java b/src/main/java/org/olat/modules/grading/ui/GradingInformationsController.java
index bd1f688640d4877dc3cc300057ad4e9a7612ddaf..91c4b33a4a046bf1040ff4c8ebee04762ae49b80 100644
--- a/src/main/java/org/olat/modules/grading/ui/GradingInformationsController.java
+++ b/src/main/java/org/olat/modules/grading/ui/GradingInformationsController.java
@@ -261,7 +261,8 @@ public class GradingInformationsController extends FormBasicController {
 		ownersList.addAllIdentites(owners);
 		cmsg.addEmailTo(ownersList);
 
-		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg, null);
+		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg);
+		contactCtrl.getAndRemoveTitle();
 		listenTo(contactCtrl);
 		
 		String title = translate("contact.owners.title");
diff --git a/src/main/java/org/olat/modules/grading/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/modules/grading/ui/_i18n/LocalStrings_de.properties
index 8f69d55c663115853b3f9a4e7e2ee604177953ba..e6bd31185a05c3971cb7a579a426f78bacb13bb3 100644
--- a/src/main/java/org/olat/modules/grading/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/modules/grading/ui/_i18n/LocalStrings_de.properties
@@ -142,6 +142,10 @@ table.header.status=Status
 table.header.taxonomy=Taxonomie
 table.header.tools=Action
 table.header.username=Benutzername
+template.empty=Leer
+template.notification=Zuweisung Benachrichtigung
+template.reminder1=Erste Erinnerung
+template.reminder2=Zweite Erinnerung
 tool.absence=Abwesenheit einstellen lassen
 tool.activate=Aktivieren
 tool.assign.grader=Korrektor w\u00E4hlen
diff --git a/src/main/java/org/olat/modules/grading/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/modules/grading/ui/_i18n/LocalStrings_en.properties
index 4058c29a160f58a8b55010939c19ef4b5486e3c8..b7fa46cea5ef94f2451cd4a6497909a4ad5d2b9b 100644
--- a/src/main/java/org/olat/modules/grading/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/modules/grading/ui/_i18n/LocalStrings_en.properties
@@ -140,6 +140,10 @@ table.header.status=Status
 table.header.taxonomy=Taxonomie
 table.header.tools=Action
 table.header.username=Username
+template.empty=Empty
+template.notification=Assignment notification
+template.reminder1=First reminder
+template.reminder2=Second reminder
 tool.absence=Set absence leave
 tool.activate=Activate
 tool.assign.grader=Assign grader
diff --git a/src/main/java/org/olat/modules/grading/ui/component/GraderMailTemplate.java b/src/main/java/org/olat/modules/grading/ui/component/GraderMailTemplate.java
index dc68a5119eba164b0dcb6aaf82b4e1908f73a3d1..bc1dcf5b4e988f196b2f7013d34b06232ef98ebf 100644
--- a/src/main/java/org/olat/modules/grading/ui/component/GraderMailTemplate.java
+++ b/src/main/java/org/olat/modules/grading/ui/component/GraderMailTemplate.java
@@ -61,8 +61,17 @@ public class GraderMailTemplate extends MailTemplate {
 		this.referenceEntry = referenceEntry;
 	}
 	
-	public GraderMailTemplate(String subject, String body, RepositoryEntry entry, CourseNode courseNode, RepositoryEntry referenceEntry) {
+	public GraderMailTemplate(String name, RepositoryEntry entry, CourseNode courseNode, RepositoryEntry referenceEntry) {
+		super(null, null, null);
+		setTemplateName(name);
+		this.entry = entry;
+		this.courseNode = courseNode;
+		this.referenceEntry = referenceEntry;
+	}
+	
+	public GraderMailTemplate(String templateName, String subject, String body, RepositoryEntry entry, CourseNode courseNode, RepositoryEntry referenceEntry) {
 		super(subject, body, null);
+		setTemplateName(templateName);
 		this.entry = entry;
 		this.courseNode = courseNode;
 		this.referenceEntry = referenceEntry;
diff --git a/src/main/java/org/olat/modules/grading/ui/confirmation/ConfirmDeactivationGraderController.java b/src/main/java/org/olat/modules/grading/ui/confirmation/ConfirmDeactivationGraderController.java
index 0a031f738d7592c0591c1468e19b7722a970f5a7..e303b47b38e0f3517d2f635a17a58e90c97b7f1e 100644
--- a/src/main/java/org/olat/modules/grading/ui/confirmation/ConfirmDeactivationGraderController.java
+++ b/src/main/java/org/olat/modules/grading/ui/confirmation/ConfirmDeactivationGraderController.java
@@ -160,7 +160,7 @@ public class ConfirmDeactivationGraderController extends FormBasicController {
 		MailerResult result = new MailerResult();
 		GraderMailTemplate reassignmentTemplate = null;
 		if(replacement != null) {
-			reassignmentTemplate = new GraderMailTemplate("", "", null, null, referenceEntry);
+			reassignmentTemplate = new GraderMailTemplate(null, null, referenceEntry);
 		}
 		
 		if(remove) {
diff --git a/src/main/java/org/olat/modules/grading/ui/wizard/ImportGraderMailController.java b/src/main/java/org/olat/modules/grading/ui/wizard/ImportGraderMailController.java
index 7284068cf78bc2cbf79e5b20ec74fc333da707eb..162e28e6fd55d34f22aff7a50e9869a2a2cc793c 100644
--- a/src/main/java/org/olat/modules/grading/ui/wizard/ImportGraderMailController.java
+++ b/src/main/java/org/olat/modules/grading/ui/wizard/ImportGraderMailController.java
@@ -48,6 +48,7 @@ public class ImportGraderMailController extends StepFormBasicController {
 		super(ureq, wControl, rootForm, runContext, LAYOUT_CUSTOM, "mail_template");
 		this.mailTemplate = mailTemplate;
 		mailCtrl = new ContactForm(ureq, getWindowControl(), rootForm, getIdentity(), false, false, false, false);
+		mailCtrl.getAndRemoveFormTitle();
 		mailCtrl.setSubject(mailTemplate.getSubjectTemplate());
 		mailCtrl.setBody(mailTemplate.getBodyTemplate());
 		mailCtrl.setRecipientsLists(Collections.singletonList(contactList));
diff --git a/src/main/java/org/olat/modules/lecture/ui/ParticipantLectureBlocksController.java b/src/main/java/org/olat/modules/lecture/ui/ParticipantLectureBlocksController.java
index ce63612412af8880b6af5e8ce1b7415dc683b7e3..e24ad16035946316fbd7fe2a060384636a379132 100644
--- a/src/main/java/org/olat/modules/lecture/ui/ParticipantLectureBlocksController.java
+++ b/src/main/java/org/olat/modules/lecture/ui/ParticipantLectureBlocksController.java
@@ -384,7 +384,7 @@ public class ParticipantLectureBlocksController extends FormBasicController {
 		cmsg.addEmailTo(contactList);
 		cmsg.setSubject(translate("appeal.subject", args));
 		cmsg.setBodyText(body.toString());
-		appealCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg, null);
+		appealCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg);
 		appealCtrl.setUserObject(row);
 		appealCtrl.setContactFormTitle(translate("new.appeal.title"));
 		listenTo(appealCtrl);
diff --git a/src/main/java/org/olat/modules/quality/ui/SuggestionController.java b/src/main/java/org/olat/modules/quality/ui/SuggestionController.java
index f39222d9ef027372d05d767c9588df4a2cf6fc58..3587b4bf352ada96c238b89924175b4dbcdeb92a 100644
--- a/src/main/java/org/olat/modules/quality/ui/SuggestionController.java
+++ b/src/main/java/org/olat/modules/quality/ui/SuggestionController.java
@@ -63,7 +63,7 @@ public class SuggestionController extends BasicController {
 		String emailBody = qualityModule.getSuggestionEmailBody();
 		contactMessage.setBodyText(emailBody);
 
-		contactFormCtrl = new ContactFormController(ureq, getWindowControl(), false, false, false, contactMessage, null);
+		contactFormCtrl = new ContactFormController(ureq, getWindowControl(), false, false, false, contactMessage);
 		contactFormCtrl.setContactFormTitle(translate("suggestion.title"));
 		contactFormCtrl.setContactFormDescription(translate("suggestion.description"));
 		listenTo(contactFormCtrl);
diff --git a/src/main/java/org/olat/registration/DisclaimerController.java b/src/main/java/org/olat/registration/DisclaimerController.java
index 3fef4dc6e3af5f61fa84cb556101ce6351307c44..826425fbb2d9640302f455ba87a4bd9dfd6b26e3 100644
--- a/src/main/java/org/olat/registration/DisclaimerController.java
+++ b/src/main/java/org/olat/registration/DisclaimerController.java
@@ -263,7 +263,7 @@ public class DisclaimerController extends BasicController {
 		contact.add(mailAddress);
 		contactMessage.addEmailTo(contact);
 
-		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, contactMessage, null);
+		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, contactMessage);
 		listenTo(contactCtrl);
 		
 		String title = translate("request.delete.account");
diff --git a/src/main/java/org/olat/registration/RequestAccountDeletionController.java b/src/main/java/org/olat/registration/RequestAccountDeletionController.java
index 4fdcc77f6b8c11bb5bc2cbe72555f90a2d35a7c7..da3dbc0a82df5a5d8edd508b70c04d7cf360e027 100644
--- a/src/main/java/org/olat/registration/RequestAccountDeletionController.java
+++ b/src/main/java/org/olat/registration/RequestAccountDeletionController.java
@@ -146,7 +146,7 @@ public class RequestAccountDeletionController extends FormBasicController {
 		contact.add(mailAddress);
 		contactMessage.addEmailTo(contact);
 
-		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, contactMessage, null);
+		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, contactMessage);
 		listenTo(contactCtrl);
 		
 		String title = translate("request.delete.account");
diff --git a/src/main/java/org/olat/repository/ui/catalog/CatalogNodeManagerController.java b/src/main/java/org/olat/repository/ui/catalog/CatalogNodeManagerController.java
index dcbcae9eae69657a0ba2dd54db67c69549dbcf86..532145dfc70b7ca9fa22c062c7c385db84dd3de6 100644
--- a/src/main/java/org/olat/repository/ui/catalog/CatalogNodeManagerController.java
+++ b/src/main/java/org/olat/repository/ui/catalog/CatalogNodeManagerController.java
@@ -853,7 +853,7 @@ public class CatalogNodeManagerController extends FormBasicController implements
 		//create e-mail Message
 		ContactMessage cmsg = new ContactMessage(ureq.getIdentity());
 		cmsg.addEmailTo(caretaker);
-		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg, null);
+		contactCtrl = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg);
 		listenTo(contactCtrl);
 		
 		// open form in dialog
diff --git a/src/main/java/org/olat/user/ui/admin/UserSearchTableController.java b/src/main/java/org/olat/user/ui/admin/UserSearchTableController.java
index 057f3504cdebfe7289cb2c5b5a808c30b418e6cc..a31b457b6da802957ef93b5c54e8752418ece075 100644
--- a/src/main/java/org/olat/user/ui/admin/UserSearchTableController.java
+++ b/src/main/java/org/olat/user/ui/admin/UserSearchTableController.java
@@ -419,7 +419,7 @@ public class UserSearchTableController extends FormBasicController implements Ac
 		cmsg.addEmailTo(contacts);
 
 		// create contact form controller with ContactMessage
-		contactCtr = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg, null);
+		contactCtr = new ContactFormController(ureq, getWindowControl(), true, false, false, cmsg);
 		listenTo(contactCtr);
 		
 		cmc = new CloseableModalController(getWindowControl(), "close", contactCtr.getInitialComponent(),
diff --git a/src/main/java/org/olat/user/ui/identity/AbstractUserInfoMainController.java b/src/main/java/org/olat/user/ui/identity/AbstractUserInfoMainController.java
index a78fd886a84551fb74b45a378c5d65d027094319..30c8a9393b876f02c988525773816cc1c45b6db1 100644
--- a/src/main/java/org/olat/user/ui/identity/AbstractUserInfoMainController.java
+++ b/src/main/java/org/olat/user/ui/identity/AbstractUserInfoMainController.java
@@ -166,7 +166,7 @@ public abstract class AbstractUserInfoMainController extends BasicController {
 		
 		OLATResourceable ores = OresHelper.createOLATResourceableType(CMD_CONTACT);
 		WindowControl bwControl = addToHistory(ureq, ores, null);
-		contactFormController = new ContactFormController(ureq, bwControl, true, false, false, cmsg, null);
+		contactFormController = new ContactFormController(ureq, bwControl, true, false, false, cmsg);
 		listenTo(contactFormController);
 		return contactFormController;
 	}
diff --git a/src/test/java/org/olat/modules/grading/manager/GradingAssignmentDAOTest.java b/src/test/java/org/olat/modules/grading/manager/GradingAssignmentDAOTest.java
index 572e9feeef7bcce1d33c1642ad96ca13a12bb793..4ba95762351ed4261c8b26110815c80666caa6d2 100644
--- a/src/test/java/org/olat/modules/grading/manager/GradingAssignmentDAOTest.java
+++ b/src/test/java/org/olat/modules/grading/manager/GradingAssignmentDAOTest.java
@@ -122,6 +122,41 @@ public class GradingAssignmentDAOTest extends OlatTestCase {
 		Assert.assertNotNull(reloadedAssignment.getGrader().getIdentity().getUser());
 	}
 	
+	@Test
+	public void loadFullByKey() {
+		Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-author1");
+		Identity grader = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-grader-2");
+		Identity student = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-student-3");
+		RepositoryEntry entry = JunitTestHelper.createRandomRepositoryEntry(author);
+		GraderToIdentity relation = gradedToIdentityDao.createRelation(entry, grader);
+		dbInstance.commitAndCloseSession();
+		
+		AssessmentEntry assessment = assessmentEntryDao
+				.createAssessmentEntry(student, null, entry, null, false, entry);
+		Assert.assertNotNull(assessment);
+		dbInstance.commitAndCloseSession();
+		
+		GradingAssignment assignment = gradingAssignmentDao.createGradingAssignment(relation, entry, assessment, new Date(), new Date());
+		dbInstance.commit();
+		
+		GradingAssignment reloadedAssignment = gradingAssignmentDao.loadFullByKey(assignment.getKey());
+		dbInstance.commitAndCloseSession();
+		
+		// grader and identity of grader are fetched
+		Assert.assertNotNull(reloadedAssignment);
+		Assert.assertEquals(assignment, reloadedAssignment);
+		Assert.assertEquals(relation, reloadedAssignment.getGrader());
+		Assert.assertEquals(grader, reloadedAssignment.getGrader().getIdentity());
+		Assert.assertNotNull(reloadedAssignment.getGrader().getIdentity().getUser());
+		// reference entry is fetch
+		Assert.assertNotNull(reloadedAssignment.getReferenceEntry());
+		Assert.assertNotNull(reloadedAssignment.getReferenceEntry().getDisplayname());
+		// assessment entry repository entry is fetch
+		Assert.assertNotNull(reloadedAssignment.getAssessmentEntry());
+		Assert.assertNotNull(reloadedAssignment.getAssessmentEntry().getRepositoryEntry());
+		Assert.assertNotNull(reloadedAssignment.getAssessmentEntry().getRepositoryEntry().getDisplayname());
+	}
+	
 	@Test
 	public void getEntries_repositoryEntries() {
 		Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("assignment-author1");