diff --git a/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java b/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java
index a5d4b95417189df600d0760f5ebc2f392483bb2d..7a3508fcd312acf6a2421087a931ecd15d28ab1d 100644
--- a/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java
+++ b/src/main/java/org/olat/course/nodes/BasicLTICourseNode.java
@@ -33,9 +33,13 @@ import org.olat.core.gui.components.stack.BreadcrumbPanel;
 import org.olat.core.gui.control.Controller;
 import org.olat.core.gui.control.WindowControl;
 import org.olat.core.gui.control.generic.iframe.DeliveryOptions;
+import org.olat.core.gui.control.generic.messages.MessageUIFactory;
 import org.olat.core.gui.control.generic.tabbable.TabbableController;
+import org.olat.core.gui.translator.Translator;
 import org.olat.core.id.Identity;
+import org.olat.core.id.Roles;
 import org.olat.core.logging.OLATRuntimeException;
+import org.olat.core.util.StringHelper;
 import org.olat.core.util.Util;
 import org.olat.course.ICourse;
 import org.olat.course.assessment.AssessmentManager;
@@ -114,7 +118,26 @@ public class BasicLTICourseNode extends AbstractAccessableCourseNode implements
 	public NodeRunConstructionResult createNodeRunConstructionResult(UserRequest ureq, WindowControl wControl,
 			UserCourseEnvironment userCourseEnv, NodeEvaluation ne, String nodecmd) {
 		updateModuleConfigDefaults(false);
-		LTIRunController runCtrl = new LTIRunController(wControl, getModuleConfiguration(), ureq, this, userCourseEnv);
+		
+		Controller runCtrl;
+		Roles roles = ureq.getUserSession().getRoles();
+		if (roles.isGuestOnly()) {
+			ModuleConfiguration config = getModuleConfiguration();
+			boolean assessable = config.getBooleanSafe(BasicLTICourseNode.CONFIG_KEY_HAS_SCORE_FIELD, false);
+			boolean sendName = config.getBooleanSafe(LTIConfigForm.CONFIG_KEY_SENDNAME, false);
+			boolean sendEmail = config.getBooleanSafe(LTIConfigForm.CONFIG_KEY_SENDEMAIL, false);
+			boolean customValues = StringHelper.containsNonWhitespace(config.getStringValue(LTIConfigForm.CONFIG_KEY_CUSTOM));
+			if(assessable || sendName || sendEmail || customValues) {
+				Translator trans = Util.createPackageTranslator(BasicLTICourseNode.class, ureq.getLocale());
+				String title = trans.translate("guestnoaccess.title");
+				String message = trans.translate("guestnoaccess.message");
+				runCtrl = MessageUIFactory.createInfoMessage(ureq, wControl, title, message);
+			} else {
+				runCtrl = new LTIRunController(wControl, getModuleConfiguration(), ureq, this, userCourseEnv);
+			}
+		} else {
+			runCtrl = new LTIRunController(wControl, getModuleConfiguration(), ureq, this, userCourseEnv);
+		}
 		Controller ctrl = TitledWrapperHelper.getWrapper(ureq, wControl, runCtrl, this, "o_lti_icon");
 		return new NodeRunConstructionResult(ctrl);
 	}
diff --git a/src/main/java/org/olat/course/nodes/basiclti/LTIConfigForm.java b/src/main/java/org/olat/course/nodes/basiclti/LTIConfigForm.java
index c9b674486392cb821f205666cddf0c44c9478993..e8ba2b12fca914d0e23301e8b95919f416a65520 100644
--- a/src/main/java/org/olat/course/nodes/basiclti/LTIConfigForm.java
+++ b/src/main/java/org/olat/course/nodes/basiclti/LTIConfigForm.java
@@ -218,19 +218,18 @@ public class LTIConfigForm extends FormBasicController {
 		fullURI = getFullURL(proto, host, port, uri, query).toString();
 		
 		sendNameConfig = config.getBooleanEntry(CONFIG_KEY_SENDNAME);
-    if (sendNameConfig == null) sendNameConfig = Boolean.FALSE;
+		if (sendNameConfig == null) sendNameConfig = Boolean.FALSE;
 
 		sendEmailConfig = config.getBooleanEntry(CONFIG_KEY_SENDEMAIL);
-    if (sendEmailConfig == null) sendEmailConfig = Boolean.FALSE;
+		if (sendEmailConfig == null) sendEmailConfig = Boolean.FALSE;
 
-		
 		doDebugConfig = config.getBooleanEntry(CONFIG_KEY_DEBUG);
-    if (doDebugConfig == null) doDebugConfig = Boolean.FALSE;
+		if (doDebugConfig == null) doDebugConfig = Boolean.FALSE;
     
-    Boolean assessable = config.getBooleanEntry(BasicLTICourseNode.CONFIG_KEY_HAS_SCORE_FIELD);
-    isAssessable = assessable == null ? false : assessable.booleanValue();
+		Boolean assessable = config.getBooleanEntry(BasicLTICourseNode.CONFIG_KEY_HAS_SCORE_FIELD);
+		isAssessable = assessable == null ? false : assessable.booleanValue();
 
-    initForm(ureq);
+		initForm(ureq);
 	}
 	
 	@Override
@@ -417,15 +416,15 @@ public class LTIConfigForm extends FormBasicController {
 	}
 	
 	private void udpateRoles(MultipleSelectionElement roleEl, String configKey, String defaultRoles) {
-    Object configRoles = config.get(configKey);
-    String roles = defaultRoles;
-    if(configRoles instanceof String) {
-    	roles = (String)configRoles;
-    }
-    String[] roleArr = roles.split(",");
-    for(String role:roleArr) {
-    	roleEl.select(role, true);
-    }
+		Object configRoles = config.get(configKey);
+		String roles = defaultRoles;
+		if(configRoles instanceof String) {
+			roles = (String)configRoles;
+		}
+		String[] roleArr = roles.split(",");
+		for(String role:roleArr) {
+			roleEl.select(role, true);
+		}
 	}
 	
 	private String getRoles(MultipleSelectionElement roleEl) {
diff --git a/src/main/java/org/olat/course/nodes/basiclti/LTIRunController.java b/src/main/java/org/olat/course/nodes/basiclti/LTIRunController.java
index 8c997aeab5179f31527f7538f0c8ff790b09705d..5fb36006db0469f6c6945333459b1282ed13df25 100644
--- a/src/main/java/org/olat/course/nodes/basiclti/LTIRunController.java
+++ b/src/main/java/org/olat/course/nodes/basiclti/LTIRunController.java
@@ -206,11 +206,20 @@ public class LTIRunController extends BasicController {
 		final User user = getIdentity().getUser();
 		//user data
 		if (config.getBooleanSafe(LTIConfigForm.CONFIG_KEY_SENDNAME, false)) {
-			userData.put("lastName", user.getProperty(UserConstants.LASTNAME, getLocale()));
-			userData.put("firstName", user.getProperty(UserConstants.FIRSTNAME, getLocale()));
+			String lastName = user.getProperty(UserConstants.LASTNAME, getLocale());
+			if(StringHelper.containsNonWhitespace(lastName)) {
+				userData.put("lastName", lastName);
+			}
+			String firstName = user.getProperty(UserConstants.FIRSTNAME, getLocale());
+			if(StringHelper.containsNonWhitespace(firstName)) {
+				userData.put("firstName", firstName);
+			}
 		}
 		if (config.getBooleanSafe(LTIConfigForm.CONFIG_KEY_SENDEMAIL, false)) {
-			userData.put("email", user.getProperty(UserConstants.EMAIL, getLocale()));
+			String email = user.getProperty(UserConstants.EMAIL, getLocale());
+			if(StringHelper.containsNonWhitespace(email)) {
+				userData.put("email", email);
+			}
 		}
 		// customUserData
 		String custom = (String)config.get(LTIConfigForm.CONFIG_KEY_CUSTOM);