diff --git a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java
index f11316f22946da216044ec5a380af2458284f789..bd9ba345b97b8888fa5392436517cdd4607b9689 100644
--- a/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java
+++ b/src/main/java/org/olat/course/assessment/manager/CourseAssessmentManagerImpl.java
@@ -56,6 +56,7 @@ import org.olat.course.assessment.model.AssessmentNodesLastModified;
 import org.olat.course.auditing.UserNodeAuditManager;
 import org.olat.course.certificate.CertificateTemplate;
 import org.olat.course.certificate.CertificatesManager;
+import org.olat.course.certificate.model.CertificateConfig;
 import org.olat.course.certificate.model.CertificateInfos;
 import org.olat.course.groupsandrights.CourseGroupManager;
 import org.olat.course.nodes.AssessableCourseNode;
@@ -522,7 +523,13 @@ public class CourseAssessmentManagerImpl implements AssessmentManager {
 					template = certificatesManager.getTemplateById(templateId);
 				}
 				CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, rootEval.getScore(), rootEval.getPassed());
-				certificatesManager.generateCertificate(certificateInfos, cgm.getCourseEntry(), template, true);
+				CertificateConfig config = CertificateConfig.builder()
+						.withCustom1(course.getCourseConfig().getCertificateCustom1())
+						.withCustom2(course.getCourseConfig().getCertificateCustom2())
+						.withCustom3(course.getCourseConfig().getCertificateCustom3())
+						.withSendModuleEmail(true)
+						.build();
+				certificatesManager.generateCertificate(certificateInfos, cgm.getCourseEntry(), template, config);
 			}
 		}
 	}
diff --git a/src/main/java/org/olat/course/assessment/ui/tool/IdentityCertificatesController.java b/src/main/java/org/olat/course/assessment/ui/tool/IdentityCertificatesController.java
index 03c01ab11895cac8d5becc143bbcd466a5e1249b..236cfa05f3cf6160a9dc2afe0258f5a04f53dde1 100644
--- a/src/main/java/org/olat/course/assessment/ui/tool/IdentityCertificatesController.java
+++ b/src/main/java/org/olat/course/assessment/ui/tool/IdentityCertificatesController.java
@@ -49,6 +49,7 @@ import org.olat.course.certificate.Certificate;
 import org.olat.course.certificate.CertificateEvent;
 import org.olat.course.certificate.CertificateTemplate;
 import org.olat.course.certificate.CertificatesManager;
+import org.olat.course.certificate.model.CertificateConfig;
 import org.olat.course.certificate.model.CertificateInfos;
 import org.olat.course.certificate.ui.DownloadCertificateCellRenderer;
 import org.olat.course.config.CourseConfig;
@@ -236,7 +237,13 @@ public class IdentityCertificatesController extends BasicController implements G
 		Float score = scoreEval == null ? null : scoreEval.getScore();
 		Boolean passed = scoreEval == null ? null : scoreEval.getPassed();
 		CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, score, passed);
-		certificatesManager.generateCertificate(certificateInfos, courseEntry, template, true);
+		CertificateConfig config = CertificateConfig.builder()
+				.withCustom1(course.getCourseConfig().getCertificateCustom1())
+				.withCustom2(course.getCourseConfig().getCertificateCustom2())
+				.withCustom3(course.getCourseConfig().getCertificateCustom3())
+				.withSendModuleEmail(true)
+				.build();
+		certificatesManager.generateCertificate(certificateInfos, courseEntry, template, config);
 		loadList();
 		showInfo("msg.certificate.pending");
 		fireEvent(ureq, Event.CHANGED_EVENT);
diff --git a/src/main/java/org/olat/course/certificate/CertificatesManager.java b/src/main/java/org/olat/course/certificate/CertificatesManager.java
index 69bef6ee3f731c8364ecc653a3c057169fa5b391..ad64ef9834a63c206401fd9b23b2cad56fccc29b 100644
--- a/src/main/java/org/olat/course/certificate/CertificatesManager.java
+++ b/src/main/java/org/olat/course/certificate/CertificatesManager.java
@@ -33,6 +33,7 @@ import org.olat.core.id.OLATResourceable;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.course.ICourse;
+import org.olat.course.certificate.model.CertificateConfig;
 import org.olat.course.certificate.model.CertificateInfos;
 import org.olat.group.BusinessGroup;
 import org.olat.repository.RepositoryEntry;
@@ -161,15 +162,15 @@ public interface CertificatesManager {
 	 */
 	public Date getDateNextRecertification(Certificate certificate, RepositoryEntry entry);
 	
-	public File previewCertificate(CertificateTemplate template, RepositoryEntry entry, Locale locale);
+	public File previewCertificate(CertificateTemplate template, RepositoryEntry entry, Locale locale, String custom1, String custom2, String custom3);
 
 	public Certificate uploadCertificate(Identity identity, Date creationDate, OLATResource resource, File certificateFile);
 	
 	public Certificate uploadStandaloneCertificate(Identity identity, Date creationDate, String courseTitle, Long resourceKey, File certificateFile);
 	
-	public void generateCertificates(List<CertificateInfos> identities, RepositoryEntry entry, CertificateTemplate template, boolean sendMail);
+	public void generateCertificates(List<CertificateInfos> infos, RepositoryEntry entry, CertificateTemplate template, CertificateConfig config);
 
-	public Certificate generateCertificate(CertificateInfos identity, RepositoryEntry entry, CertificateTemplate template, boolean sendMail);
+	public Certificate generateCertificate(CertificateInfos infos, RepositoryEntry entry, CertificateTemplate template, CertificateConfig config);
 	
 	public void deleteCertificate(Certificate certificate);
 
diff --git a/src/main/java/org/olat/course/certificate/manager/CertificatePDFFormWorker.java b/src/main/java/org/olat/course/certificate/manager/CertificatePDFFormWorker.java
index df9765c96868e144768cebc5765b12c6ec9bbd9b..a127ee91c8b9d5291d48db95ac036010eb376a19 100644
--- a/src/main/java/org/olat/course/certificate/manager/CertificatePDFFormWorker.java
+++ b/src/main/java/org/olat/course/certificate/manager/CertificatePDFFormWorker.java
@@ -66,21 +66,27 @@ public class CertificatePDFFormWorker {
 	private final Identity identity;
 	private final RepositoryEntry entry;
 
-	private Date dateCertification;
-	private Date dateFirstCertification;
-	private Date dateNextRecertification;
+	private final Date dateCertification;
+	private final Date dateFirstCertification;
+	private final Date dateNextRecertification;
+	private final String custom1;
+	private final String custom2;
+	private final String custom3;
 	private final String certificateURL;
 
 	private final Locale locale;
 	private final UserManager userManager;
 	private final CertificatesManagerImpl certificatesManager;
 
-	public CertificatePDFFormWorker(Identity identity, RepositoryEntry entry,
-			Float score, Boolean passed, Date dateCertification, Date dateFirstCertification,
-			Date dateNextRecertification, String certificateURL, Locale locale, UserManager userManager,
+	public CertificatePDFFormWorker(Identity identity, RepositoryEntry entry, Float score, Boolean passed,
+			Date dateCertification, Date dateFirstCertification, Date dateNextRecertification, String custom1,
+			String custom2, String custom3, String certificateURL, Locale locale, UserManager userManager,
 			CertificatesManagerImpl certificatesManager) {
 		this.entry = entry;
 		this.score = score;
+		this.custom1 = custom1;
+		this.custom2 = custom2;
+		this.custom3 = custom3;
 		this.locale = locale;
 		this.passed = passed;
 		this.identity = identity;
@@ -244,6 +250,9 @@ public class CertificatePDFFormWorker {
 	
 	
 	private void fillMetaInfos(PDAcroForm acroForm) throws IOException {
+		fillField("custom1", custom1, acroForm);
+		fillField("custom2", custom2, acroForm);
+		fillField("custom3", custom3, acroForm);
 		fillField("certificateVerificationUrl", certificateURL, acroForm);
 	}
 
diff --git a/src/main/java/org/olat/course/certificate/manager/CertificatePdfServiceWorker.java b/src/main/java/org/olat/course/certificate/manager/CertificatePdfServiceWorker.java
index 8ac577533dc69b27e0f0f1fd3435d4ed4a932e2e..031d6644583a04932d115fa9d8f270ae84cc041f 100644
--- a/src/main/java/org/olat/course/certificate/manager/CertificatePdfServiceWorker.java
+++ b/src/main/java/org/olat/course/certificate/manager/CertificatePdfServiceWorker.java
@@ -68,21 +68,27 @@ public class CertificatePdfServiceWorker {
 	private final RepositoryEntry entry;
 	private final String certificateURL;
 
-	private Date dateCertification;
-	private Date dateFirstCertification;
-	private Date dateNextRecertification;
+	private final Date dateCertification;
+	private final Date dateFirstCertification;
+	private final Date dateNextRecertification;
+	private final String custom1;
+	private final String custom2;
+	private final String custom3;
 
 	private final Locale locale;
 	private final PdfService pdfService;
 	private final UserManager userManager;
 	private final CertificatesManagerImpl certificatesManager;
 
-	public CertificatePdfServiceWorker(Identity identity, RepositoryEntry entry,
-			Float score, Boolean passed, Date dateCertification,
-			Date dateFirstCertification, Date nextRecertificationDate, String certificateURL, Locale locale,
-			UserManager userManager, CertificatesManagerImpl certificatesManager, PdfService pdfService) {
+	public CertificatePdfServiceWorker(Identity identity, RepositoryEntry entry, Float score, Boolean passed,
+			Date dateCertification, Date dateFirstCertification, Date nextRecertificationDate, String custom1,
+			String custom2, String custom3, String certificateURL, Locale locale, UserManager userManager,
+			CertificatesManagerImpl certificatesManager, PdfService pdfService) {
 		this.entry = entry;
 		this.score = score;
+		this.custom1 = custom1;
+		this.custom2 = custom2;
+		this.custom3 = custom3;
 		this.locale = locale;
 		this.passed = passed;
 		this.identity = identity;
@@ -256,6 +262,9 @@ public class CertificatePdfServiceWorker {
 	}
 	
 	private void fillMetaInfos(VelocityContext context) {
+		context.put("custom1", custom1);
+		context.put("custom2", custom2);
+		context.put("custom3", custom3);
 		context.put("certificateVerificationUrl", certificateURL);
 	}
 	
diff --git a/src/main/java/org/olat/course/certificate/manager/CertificatePhantomWorker.java b/src/main/java/org/olat/course/certificate/manager/CertificatePhantomWorker.java
index f3741b9474fab55c87fe5fbc56e5fcfb70907683..278e543d6ed22df174ef76040c8ca7fb09ee6552 100644
--- a/src/main/java/org/olat/course/certificate/manager/CertificatePhantomWorker.java
+++ b/src/main/java/org/olat/course/certificate/manager/CertificatePhantomWorker.java
@@ -68,20 +68,26 @@ public class CertificatePhantomWorker {
 	private final RepositoryEntry entry;
 	private final String certificateURL;
 
-	private Date dateCertification;
-	private Date dateFirstCertification;
-	private Date dateNextRecertification;
+	private final Date dateCertification;
+	private final Date dateFirstCertification;
+	private final Date dateNextRecertification;
+	private final String custom1;
+	private final String custom2;
+	private final String custom3;
 
 	private final Locale locale;
 	private final UserManager userManager;
 	private final CertificatesManagerImpl certificatesManager;
 
-	public CertificatePhantomWorker(Identity identity, RepositoryEntry entry,
-			Float score, Boolean passed, Date dateCertification,
-			Date dateFirstCertification, Date nextRecertificationDate, String certificateURL, Locale locale,
-			UserManager userManager, CertificatesManagerImpl certificatesManager) {
+	public CertificatePhantomWorker(Identity identity, RepositoryEntry entry, Float score, Boolean passed,
+			Date dateCertification, Date dateFirstCertification, Date nextRecertificationDate, String custom1,
+			String custom2, String custom3, String certificateURL, Locale locale, UserManager userManager,
+			CertificatesManagerImpl certificatesManager) {
 		this.entry = entry;
 		this.score = score;
+		this.custom1 = custom1;
+		this.custom2 = custom2;
+		this.custom3 = custom3;
 		this.locale = locale;
 		this.passed = passed;
 		this.identity = identity;
@@ -269,6 +275,9 @@ public class CertificatePhantomWorker {
 	}
 	
 	private void fillMetaInfos(VelocityContext context) {
+		context.put("custom1", custom1);
+		context.put("custom2", custom2);
+		context.put("custom3", custom3);
 		context.put("certificateVerificationUrl", certificateURL);
 	}
 	
diff --git a/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java b/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java
index b0b8bc5f0361d02f876b8597b2d5bd6b5974c76a..baed748b41f3b0fd1510ac105b9be0491de795a6 100644
--- a/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java
+++ b/src/main/java/org/olat/course/certificate/manager/CertificatesManagerImpl.java
@@ -97,6 +97,7 @@ import org.olat.course.certificate.CertificatesManager;
 import org.olat.course.certificate.CertificatesModule;
 import org.olat.course.certificate.EmailStatus;
 import org.olat.course.certificate.RecertificationTimeUnit;
+import org.olat.course.certificate.model.CertificateConfig;
 import org.olat.course.certificate.model.CertificateImpl;
 import org.olat.course.certificate.model.CertificateInfos;
 import org.olat.course.certificate.model.CertificateStandalone;
@@ -587,9 +588,8 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 				case year: cal.add(Calendar.YEAR, time); break;
 			}
 			return cal.getTime();
-		} else {
-			return null;
 		}		
+		return null;
 	}
 
 	
@@ -706,10 +706,10 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 
 	@Override
 	public void generateCertificates(List<CertificateInfos> certificateInfos, RepositoryEntry entry,
-			CertificateTemplate template, boolean sendMail) {
+			CertificateTemplate template, CertificateConfig config) {
 		int count = 0;
 		for(CertificateInfos certificateInfo:certificateInfos) {
-			generateCertificate(certificateInfo, entry, template, sendMail);
+			generateCertificate(certificateInfo, entry, template, config);
 			if(++count % 10 == 0) {
 				dbInstance.commitAndCloseSession();
 			}
@@ -718,7 +718,8 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 	}
 
 	@Override
-	public File previewCertificate(CertificateTemplate template, RepositoryEntry entry, Locale locale) {
+	public File previewCertificate(CertificateTemplate template, RepositoryEntry entry, Locale locale, String custom1,
+			String custom2, String custom3) {
 		Identity identity = getPreviewIdentity();
 		
 		File certificateFile;
@@ -732,20 +733,20 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 		
 		if(template == null) {
 			CertificatePDFFormWorker worker = new CertificatePDFFormWorker(identity, entry, 2.0f, true,
-					new Date(), new Date(), new Date(), certUrl, locale, userManager, this);
+					new Date(), new Date(), new Date(), custom1, custom2, custom3, certUrl, locale, userManager, this);
 			certificateFile = worker.fill(null, dirFile, "Certificate.pdf");
 		} else if(template.getPath().toLowerCase().endsWith("pdf")) {
 			CertificatePDFFormWorker worker = new CertificatePDFFormWorker(identity, entry, 2.0f, true,
-					new Date(), new Date(), new Date(), certUrl, locale, userManager, this);
+					new Date(), new Date(), new Date(), custom1, custom2, custom3, certUrl, locale, userManager, this);
 			certificateFile = worker.fill(template, dirFile, "Certificate.pdf");
 		} else if (pdfModule.isEnabled()) {
 			CertificatePdfServiceWorker worker = new CertificatePdfServiceWorker(identity, entry, 2.0f, true,
-					new Date(), new Date(),new Date(), certUrl, locale,
+					new Date(), new Date(),new Date(), custom1, custom2, custom3, certUrl, locale,
 					userManager, this, pdfService);
 			certificateFile = worker.fill(template, dirFile, "Certificate.pdf");
 		} else {
-			CertificatePhantomWorker worker = new CertificatePhantomWorker(identity, entry, 2.0f, true,
-					new Date(), new Date(),new Date(), certUrl, locale, userManager, this);
+			CertificatePhantomWorker worker = new CertificatePhantomWorker(identity, entry, 2.0f, true, new Date(),
+					new Date(), new Date(), custom1, custom2, custom3, certUrl, locale, userManager, this);
 			certificateFile = worker.fill(template, dirFile, "Certificate.pdf");
 		}
 		return certificateFile;
@@ -767,14 +768,14 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 
 	@Override
 	public Certificate generateCertificate(CertificateInfos certificateInfos, RepositoryEntry entry,
-			CertificateTemplate template, boolean sendMail) {
-		Certificate certificate = persistCertificate(certificateInfos, entry, template, sendMail);
+			CertificateTemplate template, CertificateConfig config) {
+		Certificate certificate = persistCertificate(certificateInfos, entry, template, config);
 		markPublisherNews(null, entry.getOlatResource());
 		return certificate;
 	}
 
 	private Certificate persistCertificate(CertificateInfos certificateInfos, RepositoryEntry entry,
-			CertificateTemplate template, boolean sendMail) {
+			CertificateTemplate template, CertificateConfig config) {
 		OLATResource resource = entry.getOlatResource();
 		Identity identity = certificateInfos.getAssessedIdentity();
 		
@@ -800,7 +801,7 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 		dbInstance.commit();
 		
 		//send message
-		sendJmsCertificateFile(certificate, template, certificateInfos.getScore(), certificateInfos.getPassed(), sendMail);
+		sendJmsCertificateFile(certificate, template, certificateInfos.getScore(), certificateInfos.getPassed(), config);
 
 		return certificate;
 	}
@@ -809,7 +810,7 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 		return velocityEngine;
 	}
 	
-	private void sendJmsCertificateFile(Certificate certificate, CertificateTemplate template, Float score, Boolean passed, boolean sendMail) {
+	private void sendJmsCertificateFile(Certificate certificate, CertificateTemplate template, Float score, Boolean passed, CertificateConfig config) {
 		QueueSender sender;
 		QueueSession session = null;
 		try  {
@@ -820,16 +821,16 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 			}
 			workUnit.setPassed(passed);
 			workUnit.setScore(score);
-			workUnit.setSendMail(sendMail);
+			workUnit.setConfig(config);
 			
-			session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE );
+			session = connection.createQueueSession(false, QueueSession.AUTO_ACKNOWLEDGE);
 			ObjectMessage message = session.createObjectMessage();
 			message.setObject(workUnit);
 
 			sender = session.createSender(getJmsQueue());
 			sender.send( message );
 		} catch (JMSException e) {
-			log.error("", e );
+			log.error("", e);
 		} finally {
 			if(session != null) {
 				try {
@@ -878,6 +879,9 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 		Date dateCertification = certificate.getCreationDate();
 		Date dateFirstCertification = getDateFirstCertification(identity, resource.getKey());
 		Date dateNextRecertification = certificate.getNextRecertificationDate();
+		String custom1 = workUnit.getConfig().getCustom1();
+		String custom2 = workUnit.getConfig().getCustom2();
+		String custom3 = workUnit.getConfig().getCustom3();
 		
 		File certificateFile;
 		// File name with user name
@@ -895,8 +899,8 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 		
 		if(template == null || template.getPath().toLowerCase().endsWith("pdf")) {
 			CertificatePDFFormWorker worker = new CertificatePDFFormWorker(identity, entry, score, passed,
-					dateCertification, dateFirstCertification, dateNextRecertification, certUrl, locale,
-					userManager, this);
+					dateCertification, dateFirstCertification, dateNextRecertification, custom1, custom2, custom3,
+					certUrl, locale, userManager, this);
 			certificateFile = worker.fill(template, dirFile, filename);
 			if(certificateFile == null) {
 				certificate.setStatus(CertificateStatus.error);
@@ -906,13 +910,13 @@ public class CertificatesManagerImpl implements CertificatesManager, MessageList
 		} else {
 			if(pdfModule.isEnabled()) {
 				CertificatePdfServiceWorker worker = new CertificatePdfServiceWorker(identity, entry, score, passed,
-						dateCertification, dateFirstCertification, dateNextRecertification, certUrl, locale,
-						userManager, this, pdfService);
+						dateCertification, dateFirstCertification, dateNextRecertification, custom1, custom2, custom3,
+						certUrl, locale, userManager, this, pdfService);
 				certificateFile = worker.fill(template, dirFile, filename);
 			} else {
 				CertificatePhantomWorker worker = new CertificatePhantomWorker(identity, entry, score, passed,
-						dateCertification, dateFirstCertification, dateNextRecertification, certUrl, locale,
-						userManager, this);
+						dateCertification, dateFirstCertification, dateNextRecertification, custom1, custom2, custom3,
+						certUrl, locale, userManager, this);
 				certificateFile = worker.fill(template, dirFile, filename);
 			}
 			if(certificateFile == null) {
diff --git a/src/main/java/org/olat/course/certificate/model/CertificateConfig.java b/src/main/java/org/olat/course/certificate/model/CertificateConfig.java
new file mode 100644
index 0000000000000000000000000000000000000000..9f7df2a0b30b0f770beae76164587e8244fb14fa
--- /dev/null
+++ b/src/main/java/org/olat/course/certificate/model/CertificateConfig.java
@@ -0,0 +1,100 @@
+/**
+ * <a href="http://www.openolat.org">
+ * OpenOLAT - Online Learning and Training</a><br>
+ * <p>
+ * Licensed under the Apache License, Version 2.0 (the "License"); <br>
+ * you may not use this file except in compliance with the License.<br>
+ * You may obtain a copy of the License at the
+ * <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
+ * <p>
+ * Unless required by applicable law or agreed to in writing,<br>
+ * software distributed under the License is distributed on an "AS IS" BASIS, <br>
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
+ * See the License for the specific language governing permissions and <br>
+ * limitations under the License.
+ * <p>
+ * Initial code contributed and copyrighted by<br>
+ * frentix GmbH, http://www.frentix.com
+ * <p>
+ */
+package org.olat.course.certificate.model;
+
+import java.io.Serializable;
+
+/**
+ * 
+ * Initial date: 23 Apr 2019<br>
+ * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
+ *
+ */
+public class CertificateConfig implements Serializable {
+	
+	private static final long serialVersionUID = 8837808595823549502L;
+	
+	private String custom1;
+	private String custom2;
+	private String custom3;
+	private boolean sendModuleEmail;
+
+	private CertificateConfig(Builder builder) {
+		this.custom1 = builder.custom1;
+		this.custom2 = builder.custom2;
+		this.custom3 = builder.custom3;
+		this.sendModuleEmail = builder.sendModuleEmail;
+	}
+	
+	public String getCustom1() {
+		return custom1;
+	}
+
+	public String getCustom2() {
+		return custom2;
+	}
+
+	public String getCustom3() {
+		return custom3;
+	}
+
+	public boolean isSendModuleEmail() {
+		return sendModuleEmail;
+	}
+
+	public static Builder builder() {
+		return new Builder();
+	}
+
+	public static final class Builder {
+		private String custom1;
+		private String custom2;
+		private String custom3;
+		private boolean sendModuleEmail;
+
+		private Builder() {
+		}
+
+		public Builder withCustom1(String custom1) {
+			this.custom1 = custom1;
+			return this;
+		}
+
+		public Builder withCustom2(String custom2) {
+			this.custom2 = custom2;
+			return this;
+		}
+
+		public Builder withCustom3(String custom3) {
+			this.custom3 = custom3;
+			return this;
+		}
+
+		public Builder withSendModuleEmail(boolean sendModuleEmail) {
+			this.sendModuleEmail = sendModuleEmail;
+			return this;
+		}
+
+		public CertificateConfig build() {
+			return new CertificateConfig(this);
+		}
+	}
+
+}
diff --git a/src/main/java/org/olat/course/certificate/model/JmsCertificateWork.java b/src/main/java/org/olat/course/certificate/model/JmsCertificateWork.java
index 68475a9fea7f28603647a7c1bacf7158d2acd95f..6d7ebc6fb5b10c0d30b62a7dcda7e58d8b7d3f2e 100644
--- a/src/main/java/org/olat/course/certificate/model/JmsCertificateWork.java
+++ b/src/main/java/org/olat/course/certificate/model/JmsCertificateWork.java
@@ -35,16 +35,16 @@ public class JmsCertificateWork implements Serializable {
 	private Boolean passed;
 	private Long templateKey;
 	private Long certificateKey;
-	private boolean sendMail;
+	private CertificateConfig config;
 	
 	public JmsCertificateWork() {
 		//
 	}
 	
-	public JmsCertificateWork(Long certificateKey, Long templateKey, Float score, Boolean passed, boolean sendMail) {
+	public JmsCertificateWork(Long certificateKey, Long templateKey, Float score, Boolean passed, CertificateConfig config) {
 		this.score = score;
 		this.passed = passed;
-		this.sendMail = sendMail;
+		this.config = config;
 		this.templateKey = templateKey;
 		this.certificateKey = certificateKey;
 	}
@@ -65,12 +65,12 @@ public class JmsCertificateWork implements Serializable {
 		this.passed = passed;
 	}
 
-	public boolean isSendMail() {
-		return sendMail;
+	public CertificateConfig getConfig() {
+		return config;
 	}
 
-	public void setSendMail(boolean sendMail) {
-		this.sendMail = sendMail;
+	public void setConfig(CertificateConfig config) {
+		this.config = config;
 	}
 
 	public Long getTemplateKey() {
diff --git a/src/main/java/org/olat/course/certificate/restapi/CertificationWebService.java b/src/main/java/org/olat/course/certificate/restapi/CertificationWebService.java
index d5207d7e181510a5476d82fa66356af2b8c28f7b..f0e906e3c79d5977a82eace24c4c53b07630cb32 100644
--- a/src/main/java/org/olat/course/certificate/restapi/CertificationWebService.java
+++ b/src/main/java/org/olat/course/certificate/restapi/CertificationWebService.java
@@ -54,6 +54,7 @@ import org.olat.course.ICourse;
 import org.olat.course.certificate.Certificate;
 import org.olat.course.certificate.CertificateTemplate;
 import org.olat.course.certificate.CertificatesManager;
+import org.olat.course.certificate.model.CertificateConfig;
 import org.olat.course.certificate.model.CertificateInfos;
 import org.olat.repository.RepositoryEntry;
 import org.olat.resource.OLATResource;
@@ -217,27 +218,33 @@ public class CertificationWebService {
 		
 		if(resource == null) {	
 			return Response.serverError().status(Response.Status.NOT_FOUND).build();
-		} else {
-			ICourse course = CourseFactory.loadCourse(resource);
-			RepositoryEntry entry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
+		}
+		
+		ICourse course = CourseFactory.loadCourse(resource);
+		RepositoryEntry entry = course.getCourseEnvironment().getCourseGroupManager().getCourseEntry();
 
-			CertificateTemplate template = null;
-			Long templateId = course.getCourseConfig().getCertificateTemplate();
-			if(templateId != null) {
-				template = certificatesManager.getTemplateById(templateId);
-			}
-			
-			CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, score, passed);
-			if(StringHelper.containsNonWhitespace(creationDate)) {
-				Date date = ObjectFactory.parseDate(creationDate);
-				certificateInfos.setCreationDate(date);
-			}
-			Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, template, false);
-			if(certificate != null) {
-				return Response.ok().build();
-			}
-			return Response.serverError().status(Response.Status.INTERNAL_SERVER_ERROR).build();
-		}	
+		CertificateTemplate template = null;
+		Long templateId = course.getCourseConfig().getCertificateTemplate();
+		if(templateId != null) {
+			template = certificatesManager.getTemplateById(templateId);
+		}
+		
+		CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, score, passed);
+		if(StringHelper.containsNonWhitespace(creationDate)) {
+			Date date = ObjectFactory.parseDate(creationDate);
+			certificateInfos.setCreationDate(date);
+		}
+		CertificateConfig config = CertificateConfig.builder()
+				.withCustom1(course.getCourseConfig().getCertificateCustom1())
+				.withCustom2(course.getCourseConfig().getCertificateCustom2())
+				.withCustom3(course.getCourseConfig().getCertificateCustom3())
+				.withSendModuleEmail(false)
+				.build();
+		Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, template, config);
+		if(certificate != null) {
+			return Response.ok().build();
+		}
+		return Response.serverError().status(Response.Status.INTERNAL_SERVER_ERROR).build();
 	}
 
 	/**
diff --git a/src/main/java/org/olat/course/certificate/ui/AssessedIdentityCertificatesController.java b/src/main/java/org/olat/course/certificate/ui/AssessedIdentityCertificatesController.java
index fe4608f029a4607fbecee928789de68505c35008..a2d537ed0a8316be7613e5cd072453ca0b65d4d1 100644
--- a/src/main/java/org/olat/course/certificate/ui/AssessedIdentityCertificatesController.java
+++ b/src/main/java/org/olat/course/certificate/ui/AssessedIdentityCertificatesController.java
@@ -43,6 +43,7 @@ import org.olat.course.certificate.Certificate;
 import org.olat.course.certificate.CertificateEvent;
 import org.olat.course.certificate.CertificateTemplate;
 import org.olat.course.certificate.CertificatesManager;
+import org.olat.course.certificate.model.CertificateConfig;
 import org.olat.course.certificate.model.CertificateInfos;
 import org.olat.course.config.CourseConfig;
 import org.olat.course.nodes.CourseNode;
@@ -210,7 +211,13 @@ public class AssessedIdentityCertificatesController extends BasicController impl
 		Float score = scoreEval == null ? null : scoreEval.getScore();
 		Boolean passed = scoreEval == null ? null : scoreEval.getPassed();
 		CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, score, passed);
-		certificatesManager.generateCertificate(certificateInfos, courseEntry, template, true);
+		CertificateConfig config = CertificateConfig.builder()
+				.withCustom1(course.getCourseConfig().getCertificateCustom1())
+				.withCustom2(course.getCourseConfig().getCertificateCustom2())
+				.withCustom3(course.getCourseConfig().getCertificateCustom3())
+				.withSendModuleEmail(true)
+				.build();
+		certificatesManager.generateCertificate(certificateInfos, courseEntry, template, config);
 		loadList();
 		showInfo("msg.certificate.pending");
 		fireEvent(ureq, Event.CHANGED_EVENT);
diff --git a/src/main/java/org/olat/course/certificate/ui/CertificatesOptionsController.java b/src/main/java/org/olat/course/certificate/ui/CertificatesOptionsController.java
index d8c2ff8b5bf3e6e694df52ff677ccb73c961c8c4..b9fab6b7cb2b96eabe03c9e51eee61617ec05dad 100644
--- a/src/main/java/org/olat/course/certificate/ui/CertificatesOptionsController.java
+++ b/src/main/java/org/olat/course/certificate/ui/CertificatesOptionsController.java
@@ -38,6 +38,7 @@ import org.olat.core.gui.components.form.flexible.elements.FormLink;
 import org.olat.core.gui.components.form.flexible.elements.IntegerElement;
 import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
 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.FormBasicController;
 import org.olat.core.gui.components.form.flexible.impl.FormEvent;
 import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer;
@@ -95,6 +96,9 @@ public class CertificatesOptionsController extends FormBasicController {
 
 	private MultipleSelectionElement pdfCertificatesEl;
 	private MultipleSelectionElement efficencyEl;
+	private TextElement certificationCustom1El;
+	private TextElement certificationCustom2El;
+	private TextElement certificationCustom3El;
 	private MultipleSelectionElement reCertificationEl;
 	private IntegerElement reCertificationTimelapseEl;
 	private SingleSelection reCertificationTimelapseUnitEl;
@@ -220,6 +224,10 @@ public class CertificatesOptionsController extends FormBasicController {
 		previewTemplateLink = LinkFactory.createButton("preview", templateCont.getFormItemComponent(), this);
 		previewTemplateLink.setTarget("preview");
 		
+		certificationCustom1El = uifactory.addTextElement("certificate.custom1", 1000, courseConfig.getCertificateCustom1(), formLayout);
+		certificationCustom2El = uifactory.addTextElement("certificate.custom2", 2000, courseConfig.getCertificateCustom2(), formLayout);
+		certificationCustom3El = uifactory.addTextElement("certificate.custom3", 3000, courseConfig.getCertificateCustom3(), formLayout);
+		
 		boolean reCertificationEnabled = courseConfig.isRecertificationEnabled();
 		reCertificationEl = uifactory.addCheckboxesHorizontal("recertification", formLayout, new String[]{ "xx" }, new String[]{ "" });
 		reCertificationEl.addActionListener(FormEvent.ONCHANGE);
@@ -336,7 +344,10 @@ public class CertificatesOptionsController extends FormBasicController {
 	
 	private void doPreviewTemplate(UserRequest ureq) {
 		selectedTemplate = certificatesManager.getTemplateById(selectedTemplate.getKey());
-		File preview = certificatesManager.previewCertificate(selectedTemplate, entry, getLocale());
+		String custom1 = certificationCustom1El.getValue();
+		String custom2 = certificationCustom2El.getValue();
+		String custom3 = certificationCustom3El.getValue();
+		File preview = certificatesManager.previewCertificate(selectedTemplate, entry, getLocale(), custom1, custom2, custom3);
 		MediaResource resource = new PreviewMediaResource(preview);
 		ureq.getDispatchResult().setResultingMediaResource(resource);
 	}
@@ -403,6 +414,10 @@ public class CertificatesOptionsController extends FormBasicController {
 		} else {
 			courseConfig.setCertificateTemplate(null);
 		}
+		
+		courseConfig.setCertificateCustom1(certificationCustom1El.getValue());
+		courseConfig.setCertificateCustom2(certificationCustom2El.getValue());
+		courseConfig.setCertificateCustom3(certificationCustom3El.getValue());
 
 		boolean recertificationEnabled = reCertificationEl.isEnabled() && reCertificationEl.isAtLeastSelected(1);
 		courseConfig.setRecertificationEnabled(recertificationEnabled);
diff --git a/src/main/java/org/olat/course/certificate/ui/CertificatesSelectionController.java b/src/main/java/org/olat/course/certificate/ui/CertificatesSelectionController.java
index 6b1a2764be833ff413bd618b6d5b00c8d55e7751..035af1e9fe23b5559bc80f0faf2bf7267d9cc64a 100644
--- a/src/main/java/org/olat/course/certificate/ui/CertificatesSelectionController.java
+++ b/src/main/java/org/olat/course/certificate/ui/CertificatesSelectionController.java
@@ -101,7 +101,7 @@ public class CertificatesSelectionController extends StepFormBasicController {
 		}
 		
 		List<UserPropertyHandler> userPropertyHandlers = userManager.getUserPropertyHandlersFor(AssessedIdentitiesTableDataModel.usageIdentifyer, isAdministrativeUser);
-		List<UserPropertyHandler> resultingPropertyHandlers = new ArrayList<UserPropertyHandler>();
+		List<UserPropertyHandler> resultingPropertyHandlers = new ArrayList<>();
 		// followed by the users fields
 		for (int i = 0; i < userPropertyHandlers.size(); i++) {
 			UserPropertyHandler userPropertyHandler	= userPropertyHandlers.get(i);
diff --git a/src/main/java/org/olat/course/certificate/ui/CertificatesSelectionOverviewController.java b/src/main/java/org/olat/course/certificate/ui/CertificatesSelectionOverviewController.java
index 6d69b80694e7217acae42332e211c9f32b2f686e..61ef9d90cbd27657adbfea1e78107306931a402e 100644
--- a/src/main/java/org/olat/course/certificate/ui/CertificatesSelectionOverviewController.java
+++ b/src/main/java/org/olat/course/certificate/ui/CertificatesSelectionOverviewController.java
@@ -84,7 +84,7 @@ public class CertificatesSelectionOverviewController extends StepFormBasicContro
 		}
 		
 		List<UserPropertyHandler> userPropertyHandlers = userManager.getUserPropertyHandlersFor(AssessedIdentitiesTableDataModel.usageIdentifyer, isAdministrativeUser);
-		List<UserPropertyHandler> resultingPropertyHandlers = new ArrayList<UserPropertyHandler>();
+		List<UserPropertyHandler> resultingPropertyHandlers = new ArrayList<>();
 		// followed by the users fields
 		for (int i = 0; i < userPropertyHandlers.size(); i++) {
 			UserPropertyHandler userPropertyHandler	= userPropertyHandlers.get(i);
diff --git a/src/main/java/org/olat/course/certificate/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/certificate/ui/_i18n/LocalStrings_de.properties
index 00f52fcee1626cf391b594d8bd7076fde55e9fb6..c9f88a23b5287e0feafe0d769e6fc8ef74f6fbcb 100644
--- a/src/main/java/org/olat/course/certificate/ui/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/certificate/ui/_i18n/LocalStrings_de.properties
@@ -10,6 +10,9 @@ admin.certificates.bcc=BCC E-Mail-Adresse
 admin.certificates.bcc.enable=Zertifikate BCC einschalten
 certificate=Zertifikate
 certificate.creationdate=Zertifikat ausgestellt am {0}
+certificate.custom1=Optionale Variable 1
+certificate.custom2=Optionale Variable 2
+certificate.custom3=Optionale Variable 3
 coaching.tool=Coaching
 confirm.delete.title=Zertifikate l\u00F6schen
 confirm.delete.text=Wollen Sie dieses Zertifikat wirklich l\u00F6schen?
diff --git a/src/main/java/org/olat/course/certificate/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/certificate/ui/_i18n/LocalStrings_en.properties
index 1b1a1d14bff46a3e4ddd399e775f2fed847ad71a..d9b1f70efead5c340adbfc33b20be5094383eb9f 100644
--- a/src/main/java/org/olat/course/certificate/ui/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/certificate/ui/_i18n/LocalStrings_en.properties
@@ -11,6 +11,9 @@ admin.certificates.bcc=BCC email address
 admin.certificates.bcc.enable=Enable BCC of certificates
 certificate=Certificates
 certificate.creationdate=Certificate issued on {0}
+certificate.custom1=Custom variable 1
+certificate.custom2=Custom variable 2
+certificate.custom3=Custom variable 3
 certificates.wizard.overview=Overview
 certificates.wizard.select=Select user
 certificates.wizard.title=Create certificates
diff --git a/src/main/java/org/olat/course/config/CourseConfig.java b/src/main/java/org/olat/course/config/CourseConfig.java
index 9f27fc40fa450ae03c42722a3349b3bac86b03cc..d72f67da27eb0768f6654ca373da86903a3ab96e 100644
--- a/src/main/java/org/olat/course/config/CourseConfig.java
+++ b/src/main/java/org/olat/course/config/CourseConfig.java
@@ -72,7 +72,7 @@ public class CourseConfig implements Serializable, Cloneable {
 	/**
 	 * current config file version
 	 */
-	private static final transient int CURRENTVERSION = 13;
+	private static final transient int CURRENTVERSION = 14;
 	/**
 	 * Log levels
 	 */
@@ -96,6 +96,9 @@ public class CourseConfig implements Serializable, Cloneable {
 	public static final transient String CERTIFICATE_AUTO_ENABLED = "CERTIFICATE_AUTO";
 	public static final transient String CERTIFICATE_MANUAL_ENABLED = "CERTIFICATE_MANUAL";
 	public static final transient String CERTIFICATE_TEMPLATE = "CERTIFICATE_TEMPLATE";
+	public static final transient String CERTIFICATE_CUSTOM1 = "CERTIFICATE_CUSTOM1";
+	public static final transient String CERTIFICATE_CUSTOM2 = "CERTIFICATE_CUSTOM2";
+	public static final transient String CERTIFICATE_CUSTOM3 = "CERTIFICATE_CUSTOM3";
 	public static final transient String RECERTIFICATION_ENABLED = "RECERTIFICATION_ENABLED";
 	public static final transient String RECERTIFICATION_TIMELAPSE = "RECERTIFICATION_TIMELAPSE";
 	public static final transient String RECERTIFICATION_TIMELAPSE_UNIT = "RECERTIFICATION_TIMELAPSE_UNIT";
@@ -282,6 +285,14 @@ public class CourseConfig implements Serializable, Cloneable {
 				if (!configuration.containsKey(BREADCRUMB_ENABLED)) configuration.put(BREADCRUMB_ENABLED, Boolean.TRUE);
 				this.version = 13;
 			}
+			
+			if (version == 13) {
+				if (!configuration.containsKey(CERTIFICATE_CUSTOM1)) configuration.put(CERTIFICATE_CUSTOM1, "");
+				if (!configuration.containsKey(CERTIFICATE_CUSTOM2)) configuration.put(CERTIFICATE_CUSTOM2, "");
+				if (!configuration.containsKey(CERTIFICATE_CUSTOM3)) configuration.put(CERTIFICATE_CUSTOM3, "");
+				
+				this.version = 14;
+			}
 
 			
 			/*
@@ -461,6 +472,30 @@ public class CourseConfig implements Serializable, Cloneable {
 		return templateId;
 	}
 	
+	public String getCertificateCustom1() {
+		return (String) configuration.get(CERTIFICATE_CUSTOM1);
+	}
+	
+	public void setCertificateCustom1(String custom1) {
+		configuration.put(CERTIFICATE_CUSTOM1, custom1);
+	}
+	
+	public String getCertificateCustom2() {
+		return (String) configuration.get(CERTIFICATE_CUSTOM2);
+	}
+	
+	public void setCertificateCustom2(String custom2) {
+		configuration.put(CERTIFICATE_CUSTOM2, custom2);
+	}
+	
+	public String getCertificateCustom3() {
+		return (String) configuration.get(CERTIFICATE_CUSTOM3);
+	}
+	
+	public void setCertificateCustom3(String custom3) {
+		configuration.put(CERTIFICATE_CUSTOM3, custom3);
+	}
+	
 	/**
 	 * @param b
 	 */
@@ -608,6 +643,9 @@ public class CourseConfig implements Serializable, Cloneable {
 		clone.setAutomaticCertificationEnabled(isAutomaticCertificationEnabled());
 		clone.setManualCertificationEnabled(isManualCertificationEnabled());
 		clone.setCertificateTemplate(getCertificateTemplate());
+		clone.setCertificateCustom1(getCertificateCustom1());
+		clone.setCertificateCustom2(getCertificateCustom2());
+		clone.setCertificateCustom3(getCertificateCustom3());
 		clone.setRecertificationEnabled(isRecertificationEnabled());
 		clone.setRecertificationTimelapse(getRecertificationTimelapse());
 		clone.setRecertificationTimelapseUnit(getRecertificationTimelapseUnit());
diff --git a/src/main/java/org/olat/upgrade/legacy/NewCachePersistingAssessmentManager.java b/src/main/java/org/olat/upgrade/legacy/NewCachePersistingAssessmentManager.java
index a5eedd1916acca9d45adf1ac7a21d414ff766ad8..15dd04417b01fb4b3d938b4e327fbd64728d7b8c 100644
--- a/src/main/java/org/olat/upgrade/legacy/NewCachePersistingAssessmentManager.java
+++ b/src/main/java/org/olat/upgrade/legacy/NewCachePersistingAssessmentManager.java
@@ -61,6 +61,7 @@ import org.olat.course.assessment.manager.EfficiencyStatementManager;
 import org.olat.course.auditing.UserNodeAuditManager;
 import org.olat.course.certificate.CertificateTemplate;
 import org.olat.course.certificate.CertificatesManager;
+import org.olat.course.certificate.model.CertificateConfig;
 import org.olat.course.certificate.model.CertificateInfos;
 import org.olat.course.nodes.AssessableCourseNode;
 import org.olat.course.nodes.CourseNode;
@@ -426,6 +427,7 @@ public class NewCachePersistingAssessmentManager {
 		ICourse course = CourseFactory.loadCourse(ores);
 		final CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
 		CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(createOLATResourceableForLocking(assessedIdentity), new SyncerExecutor(){
+			@Override
 			public void execute() {
 				Property attemptsProperty = cpm.findCourseNodeProperty(courseNode, assessedIdentity, null, ATTEMPTS);
 				if (attemptsProperty == null) {
@@ -497,6 +499,7 @@ public class NewCachePersistingAssessmentManager {
 		ICourse course = CourseFactory.loadCourse(ores);
 		final CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
 		CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(createOLATResourceableForLocking(assessedIdentity), new SyncerExecutor(){
+			@Override
 			public void execute() {
 				Property commentProperty = cpm.findCourseNodeProperty(courseNode, assessedIdentity, null, COMMENT);
 				if (commentProperty == null) {
@@ -533,6 +536,7 @@ public class NewCachePersistingAssessmentManager {
 		ICourse course = CourseFactory.loadCourse(ores);
 		final CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
 		CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(createOLATResourceableForLocking(assessedIdentity), new SyncerExecutor(){
+			@Override
 			public void execute() {
 				Property commentProperty = cpm.findCourseNodeProperty(courseNode, assessedIdentity, null, COACH_COMMENT);
 				if (commentProperty == null) {
@@ -579,6 +583,7 @@ public class NewCachePersistingAssessmentManager {
 		ICourse course = CourseFactory.loadCourse(ores);
 		final CoursePropertyManager cpm = course.getCourseEnvironment().getCoursePropertyManager();
 		long attempts = CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(createOLATResourceableForLocking(identity), new SyncerCallback<Long>(){
+			@Override
 			public Long execute() {
 				long attempts = incrementNodeAttemptsProperty(courseNode, identity, cpm);
 				if(courseNode instanceof AssessableCourseNode) {
@@ -864,6 +869,7 @@ public class NewCachePersistingAssessmentManager {
 		// we could also sync on the assessedIdentity.
 		
 		Long attempts = CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync(createOLATResourceableForLocking(assessedIdentity), new SyncerCallback<Long>(){
+			@Override
 			public Long execute() {
 				Long attempts = null;
 				Float score = scoreEvaluation.getScore();
@@ -891,7 +897,13 @@ public class NewCachePersistingAssessmentManager {
 							template = certificatesManager.getTemplateById(templateId);
 						}
 						CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, score, passed);
-						certificatesManager.generateCertificate(certificateInfos, courseEntry, template, true);
+						CertificateConfig config = CertificateConfig.builder()
+								.withCustom1(course.getCourseConfig().getCertificateCustom1())
+								.withCustom2(course.getCourseConfig().getCertificateCustom2())
+								.withCustom3(course.getCourseConfig().getCertificateCustom3())
+								.withSendModuleEmail(true)
+								.build();
+						certificatesManager.generateCertificate(certificateInfos, courseEntry, template, config);
 					}
 				}
 				
diff --git a/src/test/java/org/olat/course/certificate/manager/CertificatesManagerTest.java b/src/test/java/org/olat/course/certificate/manager/CertificatesManagerTest.java
index 84b7b5531918f763f1a9fa1f5fe58c60fe03c812..26fd1bdaebbd8ae410c7d3caabc57efd2469e4c7 100644
--- a/src/test/java/org/olat/course/certificate/manager/CertificatesManagerTest.java
+++ b/src/test/java/org/olat/course/certificate/manager/CertificatesManagerTest.java
@@ -41,6 +41,7 @@ import org.olat.course.certificate.CertificateLight;
 import org.olat.course.certificate.CertificateStatus;
 import org.olat.course.certificate.CertificateTemplate;
 import org.olat.course.certificate.CertificatesManager;
+import org.olat.course.certificate.model.CertificateConfig;
 import org.olat.course.certificate.model.CertificateImpl;
 import org.olat.course.certificate.model.CertificateInfos;
 import org.olat.group.BusinessGroup;
@@ -99,7 +100,8 @@ public class CertificatesManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		CertificateInfos certificateInfos = new CertificateInfos(identity, null, null);
-		Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, false);
+		CertificateConfig config = CertificateConfig.builder().build();
+		Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, config);
 		Assert.assertNotNull(certificate);
 		Assert.assertNotNull(certificate.getKey());
 		Assert.assertNotNull(certificate.getUuid());
@@ -122,7 +124,8 @@ public class CertificatesManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		CertificateInfos certificateInfos = new CertificateInfos(identity, 5.0f, Boolean.TRUE);
-		Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, false);
+		CertificateConfig config = CertificateConfig.builder().build();
+		Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, config);
 		Assert.assertNotNull(certificate);
 		dbInstance.commitAndCloseSession();
 		
@@ -162,7 +165,8 @@ public class CertificatesManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		CertificateInfos certificateInfos = new CertificateInfos(identity, 5.0f, Boolean.TRUE);
-		Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, false);
+		CertificateConfig config = CertificateConfig.builder().build();
+		Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, config);
 		Assert.assertNotNull(certificate);
 		dbInstance.commitAndCloseSession();
 		
@@ -195,10 +199,11 @@ public class CertificatesManagerTest extends OlatTestCase {
 		dbInstance.commitAndCloseSession();
 		
 		CertificateInfos certificateInfos1 = new CertificateInfos(participant1, null, null);
-		Certificate certificate1 = certificatesManager.generateCertificate(certificateInfos1, entry, null, false);
+		CertificateConfig config = CertificateConfig.builder().build();
+		Certificate certificate1 = certificatesManager.generateCertificate(certificateInfos1, entry, null, config);
 		Assert.assertNotNull(certificate1);
 		CertificateInfos certificateInfos2 = new CertificateInfos(participant2, null, null);
-		Certificate certificate2 = certificatesManager.generateCertificate(certificateInfos2, entry, null, false);
+		Certificate certificate2 = certificatesManager.generateCertificate(certificateInfos2, entry, null, config);
 		Assert.assertNotNull(certificate2);
 		dbInstance.commitAndCloseSession();
 		
@@ -237,10 +242,11 @@ public class CertificatesManagerTest extends OlatTestCase {
 		
 		//make a certificate
 		CertificateInfos certificateInfos1 = new CertificateInfos(participant1, null, null);
-		Certificate certificate1 = certificatesManager.generateCertificate(certificateInfos1, entry, null, false);
+		CertificateConfig config = CertificateConfig.builder().build();
+		Certificate certificate1 = certificatesManager.generateCertificate(certificateInfos1, entry, null, config);
 		Assert.assertNotNull(certificate1);
 		CertificateInfos certificateInfos2 = new CertificateInfos(participant2, null, null);
-		Certificate certificate2 = certificatesManager.generateCertificate(certificateInfos2, entry, null, false);
+		Certificate certificate2 = certificatesManager.generateCertificate(certificateInfos2, entry, null, config);
 		Assert.assertNotNull(certificate2);
 		dbInstance.commitAndCloseSession();
 		
diff --git a/src/test/java/org/olat/restapi/CertificationTest.java b/src/test/java/org/olat/restapi/CertificationTest.java
index 9687b5d3256efd53bdd9d34351799d8baaa6a62f..86cd9c583c69fb9b07785f82dd33c15144b50da8 100644
--- a/src/test/java/org/olat/restapi/CertificationTest.java
+++ b/src/test/java/org/olat/restapi/CertificationTest.java
@@ -49,6 +49,7 @@ import org.olat.core.util.vfs.VFSLeaf;
 import org.olat.course.certificate.Certificate;
 import org.olat.course.certificate.CertificateStatus;
 import org.olat.course.certificate.CertificatesManager;
+import org.olat.course.certificate.model.CertificateConfig;
 import org.olat.course.certificate.model.CertificateInfos;
 import org.olat.repository.RepositoryEntry;
 import org.olat.restapi.support.ObjectFactory;
@@ -81,7 +82,8 @@ public class CertificationTest extends OlatJerseyTestCase {
 		dbInstance.commitAndCloseSession();
 
 		CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, 2.0f, true);
-		Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, false);
+		CertificateConfig config = CertificateConfig.builder().withSendModuleEmail(false).build();
+		Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, config);
 		dbInstance.commitAndCloseSession();
 		Assert.assertNotNull(certificate);
 		sleep(1000);
@@ -120,7 +122,8 @@ public class CertificationTest extends OlatJerseyTestCase {
 		dbInstance.commitAndCloseSession();
 
 		CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, 2.0f, true);
-		Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, false);
+		CertificateConfig config = CertificateConfig.builder().build();
+		Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, config);
 		dbInstance.commitAndCloseSession();
 		Assert.assertNotNull(certificate);
 		sleep(1000);
@@ -275,7 +278,8 @@ public class CertificationTest extends OlatJerseyTestCase {
 		dbInstance.commitAndCloseSession();
 
 		CertificateInfos certificateInfos = new CertificateInfos(assessedIdentity, 2.0f, true);
-		Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, false);
+		CertificateConfig config = CertificateConfig.builder().build();
+		Certificate certificate = certificatesManager.generateCertificate(certificateInfos, entry, null, config);
 		dbInstance.commitAndCloseSession();
 		Assert.assertNotNull(certificate);
 		sleep(1000);