diff --git a/pom.xml b/pom.xml
index 110ab748185563912765df04968cc37fe9afd475..49fc034ed45737e3f13fab4d09f05fae277b6258 100644
--- a/pom.xml
+++ b/pom.xml
@@ -2548,6 +2548,12 @@
 			<artifactId>arquillian-drone-impl</artifactId>
 			<scope>test</scope>
 		</dependency>
+		<dependency>
+			<groupId>org.eu.ingwar.tools</groupId>
+			<artifactId>arquillian-suite-extension</artifactId>
+			<version>1.1.4</version>
+			<scope>test</scope>
+		</dependency>
 		<dependency>
 			<groupId>com.google.guava</groupId>
 			<artifactId>guava</artifactId>
diff --git a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java
index 1d2543f165bbec08debd507c3c82c0266fa7fc11..21436f3c320868c9d7d02db67eb77e9a21caa2e3 100644
--- a/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java
+++ b/src/main/java/org/olat/modules/lecture/ui/TeacherRollCallController.java
@@ -572,8 +572,8 @@ public class TeacherRollCallController extends FormBasicController {
 					Integer.toString(index), lectureBlock, rollCall, lectureBlock.getEntry(), row.getIdentity(), getIdentity());
 		}
 		row.setRollCall(rollCall);
-		if(authorizedAbsenceEnabled) {
-			if(rollCall.getAbsenceAuthorized() != null && rollCall.getAbsenceAuthorized().booleanValue()) {
+		if(authorizedAbsenceEnabled && row.getAuthorizedAbsence() != null) {
+			if(rollCall.getAbsenceAuthorized().booleanValue()) {
 				row.getAuthorizedAbsence().select(onKeys[0], true);
 			} else {
 				row.getAuthorizedAbsence().uncheckAll();
diff --git a/src/main/java/org/olat/modules/lecture/ui/_content/participant_list_overview.html b/src/main/java/org/olat/modules/lecture/ui/_content/participant_list_overview.html
index f6667d070f56bc7d932bd933c797d7c3e526f74c..dd40fbc684594d67c37a5fbcf6d8c81efde73627 100644
--- a/src/main/java/org/olat/modules/lecture/ui/_content/participant_list_overview.html
+++ b/src/main/java/org/olat/modules/lecture/ui/_content/participant_list_overview.html
@@ -16,4 +16,6 @@ function print() {
 	$r.contextHelpWithWrapper("Lectures and absences")
 #end
 </div>
-$r.render("table")
\ No newline at end of file
+<div class="o_sel_lecture_participants_overview">
+$r.render("table")
+</div>
\ No newline at end of file
diff --git a/src/main/java/org/olat/modules/lecture/ui/component/LectureBlockRollCallStatusComponent.java b/src/main/java/org/olat/modules/lecture/ui/component/LectureBlockRollCallStatusComponent.java
index be8445e9e28f3f2fd5f0856da018bb9ff1c53b06..5d25b38f57113b98e54fecb5391cb25300f30376 100644
--- a/src/main/java/org/olat/modules/lecture/ui/component/LectureBlockRollCallStatusComponent.java
+++ b/src/main/java/org/olat/modules/lecture/ui/component/LectureBlockRollCallStatusComponent.java
@@ -22,6 +22,7 @@ package org.olat.modules.lecture.ui.component;
 import org.olat.core.gui.components.ComponentRenderer;
 import org.olat.core.gui.components.form.flexible.impl.FormBaseComponentImpl;
 import org.olat.core.gui.translator.Translator;
+import org.olat.modules.lecture.LectureBlockRollCall;
 import org.olat.modules.lecture.ui.TeacherRollCallRow;
 
 /**
@@ -74,7 +75,12 @@ public class LectureBlockRollCallStatusComponent extends FormBaseComponentImpl {
 	}
 	
 	public boolean isLecturesAuthorizedAbsent() {
-		return rollCall.getAuthorizedAbsence().isAtLeastSelected(1);
+		if(rollCall.getAuthorizedAbsence() != null) {
+			rollCall.getAuthorizedAbsence().isAtLeastSelected(1);
+		}
+		LectureBlockRollCall call = rollCall.getRollCall();
+		return call == null || call.getAbsenceAuthorized() == null
+				? false : call.getAbsenceAuthorized().booleanValue(); 
 	}
 	
 	public int getLecturesAttendedNumber() {
diff --git a/src/test/java/org/olat/selenium/AssessmentTest.java b/src/test/java/org/olat/selenium/AssessmentTest.java
index fe5fb84938deb81a1eb35c601cad4fa3f14635ba..69e21c7f118955b20fa562f8e1deea3ef8ae5f66 100644
--- a/src/test/java/org/olat/selenium/AssessmentTest.java
+++ b/src/test/java/org/olat/selenium/AssessmentTest.java
@@ -27,14 +27,12 @@ import java.util.Calendar;
 import java.util.Date;
 import java.util.UUID;
 
-import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.container.test.api.RunAsClient;
 import org.jboss.arquillian.drone.api.annotation.Drone;
 import org.jboss.arquillian.graphene.page.InitialPage;
 import org.jboss.arquillian.graphene.page.Page;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.arquillian.test.api.ArquillianResource;
-import org.jboss.shrinkwrap.api.spec.WebArchive;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -75,12 +73,7 @@ import org.openqa.selenium.WebElement;
  *
  */
 @RunWith(Arquillian.class)
-public class AssessmentTest {
-
-	@Deployment(testable = false)
-	public static WebArchive createDeployment() {
-		return ArquillianDeployments.createDeployment();
-	}
+public class AssessmentTest extends Deployments {
 
 	@Drone
 	private WebDriver browser;
diff --git a/src/test/java/org/olat/selenium/BusinessGroupTest.java b/src/test/java/org/olat/selenium/BusinessGroupTest.java
index 1e1e815b7b8ec00ee747bb8e388ea2d967933caf..ca6f172de2312406a3f995c9b55da2cc2e1ff229 100644
--- a/src/test/java/org/olat/selenium/BusinessGroupTest.java
+++ b/src/test/java/org/olat/selenium/BusinessGroupTest.java
@@ -26,14 +26,12 @@ import java.util.ArrayList;
 import java.util.List;
 import java.util.UUID;
 
-import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.container.test.api.RunAsClient;
 import org.jboss.arquillian.drone.api.annotation.Drone;
 import org.jboss.arquillian.graphene.page.InitialPage;
 import org.jboss.arquillian.graphene.page.Page;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.arquillian.test.api.ArquillianResource;
-import org.jboss.shrinkwrap.api.spec.WebArchive;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -55,7 +53,6 @@ import org.olat.selenium.page.graphene.OOGraphene;
 import org.olat.selenium.page.group.GroupPage;
 import org.olat.selenium.page.group.MembersWizardPage;
 import org.olat.selenium.page.repository.RepositoryAccessPage.UserAccess;
-import org.olat.test.ArquillianDeployments;
 import org.olat.test.rest.UserRestClient;
 import org.olat.user.restapi.UserVO;
 import org.openqa.selenium.By;
@@ -69,12 +66,7 @@ import org.openqa.selenium.WebElement;
  *
  */
 @RunWith(Arquillian.class)
-public class BusinessGroupTest {
-	
-	@Deployment(testable = false)
-	public static WebArchive createDeployment() {
-		return ArquillianDeployments.createDeployment();
-	}
+public class BusinessGroupTest extends Deployments {
 
 	@Drone
 	private WebDriver browser;
diff --git a/src/test/java/org/olat/selenium/CourseElementTest.java b/src/test/java/org/olat/selenium/CourseElementTest.java
index e404b946e5ecaa2e9de01b54171bd616c52e1979..ebb53d8c0b32d5f73d1836ae2fdff5cad56a05d1 100644
--- a/src/test/java/org/olat/selenium/CourseElementTest.java
+++ b/src/test/java/org/olat/selenium/CourseElementTest.java
@@ -25,14 +25,12 @@ import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.UUID;
 
-import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.container.test.api.RunAsClient;
 import org.jboss.arquillian.drone.api.annotation.Drone;
 import org.jboss.arquillian.graphene.page.InitialPage;
 import org.jboss.arquillian.graphene.page.Page;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.arquillian.test.api.ArquillianResource;
-import org.jboss.shrinkwrap.api.spec.WebArchive;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -57,13 +55,12 @@ import org.olat.selenium.page.course.ParticipantFolderPage;
 import org.olat.selenium.page.forum.ForumPage;
 import org.olat.selenium.page.graphene.OOGraphene;
 import org.olat.selenium.page.repository.AuthoringEnvPage;
+import org.olat.selenium.page.repository.AuthoringEnvPage.ResourceType;
 import org.olat.selenium.page.repository.FeedPage;
+import org.olat.selenium.page.repository.RepositoryAccessPage.UserAccess;
 import org.olat.selenium.page.repository.RepositoryEditDescriptionPage;
 import org.olat.selenium.page.repository.ScormPage;
-import org.olat.selenium.page.repository.AuthoringEnvPage.ResourceType;
-import org.olat.selenium.page.repository.RepositoryAccessPage.UserAccess;
 import org.olat.selenium.page.user.UserToolsPage;
-import org.olat.test.ArquillianDeployments;
 import org.olat.test.JunitTestHelper;
 import org.olat.test.rest.UserRestClient;
 import org.olat.user.restapi.UserVO;
@@ -78,12 +75,7 @@ import org.openqa.selenium.WebElement;
  *
  */
 @RunWith(Arquillian.class)
-public class CourseElementTest {
-	
-	@Deployment(testable = false)
-	public static WebArchive createDeployment() {
-		return ArquillianDeployments.createDeployment();
-	}
+public class CourseElementTest extends Deployments {
 
 	@Drone
 	private WebDriver browser;
diff --git a/src/test/java/org/olat/selenium/CourseTest.java b/src/test/java/org/olat/selenium/CourseTest.java
index b60c7d017177405b01e085e623acd2515afeb7d0..156140ae182b4a994d828916106005eeffd605b9 100644
--- a/src/test/java/org/olat/selenium/CourseTest.java
+++ b/src/test/java/org/olat/selenium/CourseTest.java
@@ -29,14 +29,12 @@ import java.util.List;
 import java.util.Locale;
 import java.util.UUID;
 
-import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.container.test.api.RunAsClient;
 import org.jboss.arquillian.drone.api.annotation.Drone;
 import org.jboss.arquillian.graphene.page.InitialPage;
 import org.jboss.arquillian.graphene.page.Page;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.arquillian.test.api.ArquillianResource;
-import org.jboss.shrinkwrap.api.spec.WebArchive;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -61,18 +59,12 @@ import org.olat.selenium.page.course.MembersPage;
 import org.olat.selenium.page.course.PublisherPageFragment;
 import org.olat.selenium.page.course.RemindersPage;
 import org.olat.selenium.page.graphene.OOGraphene;
-import org.olat.selenium.page.lecture.LectureListRepositoryPage;
-import org.olat.selenium.page.lecture.LectureRepositoryAdminPage;
-import org.olat.selenium.page.lecture.RollCallInterceptorPage;
-import org.olat.selenium.page.lecture.TeacherRollCallPage;
 import org.olat.selenium.page.repository.AuthoringEnvPage;
 import org.olat.selenium.page.repository.AuthoringEnvPage.ResourceType;
 import org.olat.selenium.page.repository.CPPage;
 import org.olat.selenium.page.repository.RepositoryAccessPage;
 import org.olat.selenium.page.repository.RepositoryAccessPage.UserAccess;
 import org.olat.selenium.page.repository.RepositoryEditDescriptionPage;
-import org.olat.selenium.page.user.UserToolsPage;
-import org.olat.test.ArquillianDeployments;
 import org.olat.test.JunitTestHelper;
 import org.olat.test.rest.UserRestClient;
 import org.olat.user.restapi.UserVO;
@@ -87,12 +79,7 @@ import org.openqa.selenium.WebElement;
  *
  */
 @RunWith(Arquillian.class)
-public class CourseTest {
-	
-	@Deployment(testable = false)
-	public static WebArchive createDeployment() {
-		return ArquillianDeployments.createDeployment();
-	}
+public class CourseTest extends Deployments {
 
 	@Drone
 	private WebDriver browser;
@@ -1478,240 +1465,4 @@ public class CourseTest {
 			.uploadResource(zipTitle, zipFile)
 			.assertOnResourceType();
 	}
-	
-	/**
-	 * An author create a course, enable the absence management,
-	 * create a lecture block, add a coach and two participants.<br>
-	 * The coach login in, see the interceptor to start the roll call.
-	 * It starts the roll call, set an absence and close.<br>
-	 * The participant with an absence log in, use the lectures user's
-	 * tool to see that it has an absence.
-	 * 
-	 * @param authorLoginPage
-	 * @throws IOException
-	 * @throws URISyntaxException
-	 */
-	@Test
-	@RunAsClient
-	public void lecturesRollCall(@InitialPage LoginPage authorLoginPage,
-			@Drone @User WebDriver coachBrowser, @Drone @Participant WebDriver participantBrowser)
-	throws IOException, URISyntaxException {
-		UserVO author = new UserRestClient(deploymentUrl).createAuthor();
-		UserVO coach = new UserRestClient(deploymentUrl).createRandomUser("Rei");
-		UserVO participant1 = new UserRestClient(deploymentUrl).createRandomUser("Kanu");
-		UserVO participant2 = new UserRestClient(deploymentUrl).createRandomUser("Rymou");
-		
-		authorLoginPage.loginAs(author.getLogin(), author.getPassword());
-		
-		//go to authoring
-		AuthoringEnvPage authoringEnv = navBar
-			.assertOnNavigationPage()
-			.openAuthoringEnvironment();
-		
-		String title = "Lecture " + UUID.randomUUID();
-		//create course
-		authoringEnv
-			.openCreateDropDown()
-			.clickCreate(ResourceType.course)
-			.fillCreateForm(title)
-			.assertOnGeneralTab()
-			.clickToolbarBack();
-		
-		//set access
-		CoursePageFragment course = new CoursePageFragment(browser);
-		course
-			.accessConfiguration()
-			.setUserAccess(UserAccess.registred)
-			.clickToolbarBack();
-		
-		//add a coach
-		course
-			.members()
-			.addMember()	
-			.searchMember(coach, true)
-			.nextUsers()
-			.nextOverview()
-			.selectRepositoryEntryRole(false, true, false)
-			.nextPermissions()
-			.finish();
-		//add the participants
-		course
-			.members()
-			.importMembers()
-			.setMembers(participant1, participant2)
-			.nextUsers()
-			.nextOverview()
-			.nextPermissions()
-			.finish();
-		
-		//enable the lectures
-		LectureRepositoryAdminPage lecturesAdmin = course
-			.lecturesAdministration();
-		lecturesAdmin
-			.settings()
-			.enableLectures()
-			.overrideDefaultSettings()
-			.saveSettings();
-		
-		LectureListRepositoryPage lectureList = lecturesAdmin
-			.lectureList();
-		
-		Calendar cal = Calendar.getInstance();
-		int today = cal.get(Calendar.DATE);
-		int hour = cal.get(Calendar.HOUR_OF_DAY);
-		String lectureTitle = "1. Lecture";
-		lectureList
-			.newLectureBlock()
-			.setTitle(lectureTitle)
-			.setTeacher(coach)
-			.setDate(today, hour, 0, hour, 59)
-			.save();
-		
-		//coach at work
-		LoginPage coachLoginPage = LoginPage.getLoginPage(coachBrowser, deploymentUrl);
-		coachLoginPage
-			.loginAs(coach);
-		new RollCallInterceptorPage(coachBrowser)
-			.start()
-			.setAbsence(participant1, "1")
-			.closeRollCall()
-			.confirmCloseRollCall()
-			.assertOnClosedTable();
-		
-		//participant check it roll call
-		LoginPage participantLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl);
-		participantLoginPage
-			.loginAs(participant1)
-			.resume();
-		UserToolsPage participantUserTools = new UserToolsPage(participantBrowser);
-		participantUserTools
-			.openUserToolsMenu()
-			.openLectures()
-			.assertOnParticipantLecturesList()
-			.selectCourseAsParticipant(title)
-			.assertOnParticipantLectureBlocks()
-			.assertOnParticipantLectureBlockAbsent(coach, lectureTitle, title);
-	}
-	
-
-	/**
-	 * An author create a course, enable the absence management,
-	 * create a lecture block, add a coach and two participants.<br>
-	 * The coach login in, see the interceptor to start the roll call
-	 * version mobile.<br>
-	 * It starts the roll call, set an absence and close.<br>
-	 * The participant with an absence log in, use the lectures user's
-	 * tool to see that it has an absence.
-	 * 
-	 * @param authorLoginPage
-	 * @throws IOException
-	 * @throws URISyntaxException
-	 */
-	@Test
-	@RunAsClient
-	public void lectureMobileRollCall(@InitialPage LoginPage authorLoginPage,
-			@Drone @User WebDriver coachBrowser, @Drone @User WebDriver participantBrowser)
-	throws IOException, URISyntaxException {
-		UserVO author = new UserRestClient(deploymentUrl).createAuthor();
-		UserVO coach = new UserRestClient(deploymentUrl).createRandomUser("Rei");
-		UserVO participant1 = new UserRestClient(deploymentUrl).createRandomUser("Kanu");
-		UserVO participant2 = new UserRestClient(deploymentUrl).createRandomUser("Rymou");
-		
-		authorLoginPage.loginAs(author.getLogin(), author.getPassword());
-		
-		//go to authoring
-		AuthoringEnvPage authoringEnv = navBar
-			.assertOnNavigationPage()
-			.openAuthoringEnvironment();
-		
-		String title = "Lecture " + UUID.randomUUID();
-		//create course
-		authoringEnv
-			.openCreateDropDown()
-			.clickCreate(ResourceType.course)
-			.fillCreateForm(title)
-			.assertOnGeneralTab()
-			.clickToolbarBack();
-		
-		//set access
-		CoursePageFragment course = new CoursePageFragment(browser);
-		course
-			.accessConfiguration()
-			.setUserAccess(UserAccess.registred)
-			.clickToolbarBack();
-		
-		//add a coach
-		course
-			.members()
-			.addMember()	
-			.searchMember(coach, true)
-			.nextUsers()
-			.nextOverview()
-			.selectRepositoryEntryRole(false, true, false)
-			.nextPermissions()
-			.finish();
-		//add the participants
-		course
-			.members()
-			.importMembers()
-			.setMembers(participant1, participant2)
-			.nextUsers()
-			.nextOverview()
-			.nextPermissions()
-			.finish();
-		
-		//enable the lectures
-		LectureRepositoryAdminPage lecturesAdmin = course
-			.lecturesAdministration();
-		lecturesAdmin
-			.settings()
-			.enableLectures()
-			.overrideDefaultSettings()
-			.saveSettings();
-		
-		LectureListRepositoryPage lectureList = lecturesAdmin
-			.lectureList();
-		
-		Calendar cal = Calendar.getInstance();
-		int today = cal.get(Calendar.DATE);
-		int hour = cal.get(Calendar.HOUR_OF_DAY);
-		String lectureTitle = "2.Lecture";
-		lectureList
-			.newLectureBlock()
-			.setTitle(lectureTitle)
-			.setTeacher(coach)
-			.setDate(today, hour, 0, hour, 59)
-			.save();
-		
-		//coach at work
-		LoginPage coachLoginPage = LoginPage.getLoginPage(coachBrowser, deploymentUrl);
-		coachLoginPage
-			.loginAs(coach);
-		new RollCallInterceptorPage(coachBrowser)
-			.startMobile()
-			.setAbsence("1")
-			.saveAndNext()
-			.setAbsence("1")
-			.setAbsence("2")
-			.saveAndNext()
-			.closeRollCall();
-		//check that a roll call at least is closed
-		new TeacherRollCallPage(coachBrowser)
-			.assertOnClosedTable();
-		
-		
-		//participant check it roll call
-		LoginPage participantLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl);
-		participantLoginPage
-			.loginAs(participant1)
-			.resume();
-		UserToolsPage participantUserTools = new UserToolsPage(participantBrowser);
-		participantUserTools
-			.openUserToolsMenu()
-			.openLectures()
-			.assertOnParticipantLecturesList()
-			.selectCourseAsParticipant(title)
-			.assertOnParticipantLectureBlocks()
-			.assertOnParticipantLectureBlockAbsent(coach, lectureTitle, title);
-	}
 }
diff --git a/src/test/java/org/olat/selenium/Deployments.java b/src/test/java/org/olat/selenium/Deployments.java
new file mode 100644
index 0000000000000000000000000000000000000000..a5116a41f670bb74e0c576163de876bcceba6447
--- /dev/null
+++ b/src/test/java/org/olat/selenium/Deployments.java
@@ -0,0 +1,41 @@
+/**
+ * <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.selenium;
+
+import org.eu.ingwar.tools.arquillian.extension.suite.annotations.ArquillianSuiteDeployment;
+import org.jboss.arquillian.container.test.api.Deployment;
+import org.jboss.shrinkwrap.api.spec.WebArchive;
+import org.olat.test.ArquillianDeployments;
+
+/**
+ * 
+ * Initial date: 12 nov. 2017<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+@ArquillianSuiteDeployment
+public class Deployments {
+	
+	@Deployment(testable = false)
+	public static WebArchive createDeployment() {
+		return ArquillianDeployments.createDeployment();
+	}
+
+}
diff --git a/src/test/java/org/olat/selenium/ImsQTI21Test.java b/src/test/java/org/olat/selenium/ImsQTI21Test.java
index 5184d1ae6f95b396e2a4193816a6877b1a5f0b77..523e5fddde3629803bdebd1079e71cce1a021a71 100644
--- a/src/test/java/org/olat/selenium/ImsQTI21Test.java
+++ b/src/test/java/org/olat/selenium/ImsQTI21Test.java
@@ -25,14 +25,12 @@ import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.UUID;
 
-import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.container.test.api.RunAsClient;
 import org.jboss.arquillian.drone.api.annotation.Drone;
 import org.jboss.arquillian.graphene.page.InitialPage;
 import org.jboss.arquillian.graphene.page.Page;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.arquillian.test.api.ArquillianResource;
-import org.jboss.shrinkwrap.api.spec.WebArchive;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -58,7 +56,6 @@ import org.olat.selenium.page.qti.QTI21Page;
 import org.olat.selenium.page.qti.QTI21SingleChoiceEditorPage;
 import org.olat.selenium.page.repository.RepositoryAccessPage.UserAccess;
 import org.olat.selenium.page.user.UserToolsPage;
-import org.olat.test.ArquillianDeployments;
 import org.olat.test.JunitTestHelper;
 import org.olat.test.rest.UserRestClient;
 import org.olat.user.restapi.UserVO;
@@ -76,12 +73,7 @@ import uk.ac.ed.ph.jqtiplus.value.Cardinality;
  *
  */
 @RunWith(Arquillian.class)
-public class ImsQTI21Test {
-	
-	@Deployment(testable = false)
-	public static WebArchive createDeployment() {
-		return ArquillianDeployments.createDeployment();
-	}
+public class ImsQTI21Test extends Deployments {
 
 	@Drone
 	private WebDriver browser;
diff --git a/src/test/java/org/olat/selenium/LecturesTest.java b/src/test/java/org/olat/selenium/LecturesTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..57ac82b5f4cc5cd3db0cb382c54bca60a839f2d5
--- /dev/null
+++ b/src/test/java/org/olat/selenium/LecturesTest.java
@@ -0,0 +1,436 @@
+/**
+ * <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.selenium;
+
+import java.io.IOException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.Calendar;
+import java.util.UUID;
+
+import org.jboss.arquillian.container.test.api.RunAsClient;
+import org.jboss.arquillian.drone.api.annotation.Drone;
+import org.jboss.arquillian.graphene.page.InitialPage;
+import org.jboss.arquillian.graphene.page.Page;
+import org.jboss.arquillian.junit.Arquillian;
+import org.jboss.arquillian.test.api.ArquillianResource;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.olat.selenium.page.LoginPage;
+import org.olat.selenium.page.NavigationPage;
+import org.olat.selenium.page.Participant;
+import org.olat.selenium.page.User;
+import org.olat.selenium.page.course.CoursePageFragment;
+import org.olat.selenium.page.lecture.LectureRepositoryAdminListPage;
+import org.olat.selenium.page.lecture.LectureRepositoryAdminPage;
+import org.olat.selenium.page.lecture.LecturesRepositoryPage;
+import org.olat.selenium.page.lecture.RollCallInterceptorPage;
+import org.olat.selenium.page.lecture.TeacherRollCallPage;
+import org.olat.selenium.page.repository.AuthoringEnvPage;
+import org.olat.selenium.page.repository.AuthoringEnvPage.ResourceType;
+import org.olat.selenium.page.repository.RepositoryAccessPage.UserAccess;
+import org.olat.selenium.page.user.UserToolsPage;
+import org.olat.test.rest.UserRestClient;
+import org.olat.user.restapi.UserVO;
+import org.openqa.selenium.WebDriver;
+
+/**
+ * Test suite for the lectures / absence management feature.
+ * 
+ * Initial date: 7 nov. 2017<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+@RunWith(Arquillian.class)
+public class LecturesTest extends Deployments {
+
+	@Drone
+	private WebDriver browser;
+	@ArquillianResource
+	private URL deploymentUrl;
+	@Page
+	private NavigationPage navBar;
+	
+	/**
+	 * An author create a course, enable the absence management,
+	 * create a lecture block, add a coach and two participants.<br>
+	 * The coach login in, see the interceptor to start the roll call.
+	 * It starts the roll call, set an absence and close.<br>
+	 * The participant with an absence log in, use the lectures user's
+	 * tool to see that it has an absence.
+	 * 
+	 * @param loginPage
+	 * @throws IOException
+	 * @throws URISyntaxException
+	 */
+	@Test
+	@RunAsClient
+	public void lecturesRollCall_authorizedAbsence(@InitialPage LoginPage loginPage,
+			@Drone @User WebDriver coachBrowser, @Drone @Participant WebDriver participantBrowser)
+	throws IOException, URISyntaxException {
+		
+		// configure the lectures module
+		loginPage
+			.loginAs("administrator", "openolat")
+			.resume();
+		new NavigationPage(browser)
+			.openAdministration()
+			.openLecturesSettings()
+			.configure(true, false)
+			.save();
+		
+		// start the test with authorized absence on
+		UserVO author = new UserRestClient(deploymentUrl).createAuthor();
+		UserVO coach = new UserRestClient(deploymentUrl).createRandomUser("Rei");
+		UserVO participant1 = new UserRestClient(deploymentUrl).createRandomUser("Kanu");
+		UserVO participant2 = new UserRestClient(deploymentUrl).createRandomUser("Rymou");
+
+		LoginPage
+			.getLoginPage(browser, deploymentUrl)
+			.loginAs(author.getLogin(), author.getPassword());
+		
+		//go to authoring
+		AuthoringEnvPage authoringEnv = navBar
+			.assertOnNavigationPage()
+			.openAuthoringEnvironment();
+		
+		String title = "Lecture " + UUID.randomUUID();
+		//create course
+		authoringEnv
+			.openCreateDropDown()
+			.clickCreate(ResourceType.course)
+			.fillCreateForm(title)
+			.assertOnGeneralTab()
+			.clickToolbarBack();
+		
+		//set access
+		CoursePageFragment course = new CoursePageFragment(browser);
+		course
+			.accessConfiguration()
+			.setUserAccess(UserAccess.registred)
+			.clickToolbarBack();
+		
+		//add a coach
+		course
+			.members()
+			.addMember()	
+			.searchMember(coach, true)
+			.nextUsers()
+			.nextOverview()
+			.selectRepositoryEntryRole(false, true, false)
+			.nextPermissions()
+			.finish();
+		//add the participants
+		course
+			.members()
+			.importMembers()
+			.setMembers(participant1, participant2)
+			.nextUsers()
+			.nextOverview()
+			.nextPermissions()
+			.finish();
+		
+		//enable the lectures
+		LectureRepositoryAdminPage lecturesAdmin = course
+			.lecturesAdministration();
+		lecturesAdmin
+			.settings()
+			.enableLectures()
+			.overrideDefaultSettings()
+			.saveSettings();
+		
+		LectureRepositoryAdminListPage lectureList = lecturesAdmin
+			.lectureList();
+		
+		Calendar cal = Calendar.getInstance();
+		int today = cal.get(Calendar.DATE);
+		int hour = cal.get(Calendar.HOUR_OF_DAY);
+		String lectureTitle = "1. Lecture";
+		lectureList
+			.newLectureBlock()
+			.setTitle(lectureTitle)
+			.setTeacher(coach)
+			.setDate(today, hour, 0, hour, 59)
+			.save();
+		
+		//coach at work
+		LoginPage coachLoginPage = LoginPage.getLoginPage(coachBrowser, deploymentUrl);
+		coachLoginPage
+			.loginAs(coach);
+		new RollCallInterceptorPage(coachBrowser)
+			.start()
+			.setAbsence(participant1, "1")
+			.closeRollCall()
+			.confirmCloseRollCall()
+			.assertOnClosedTable();
+		
+		//participant check it roll call
+		LoginPage participantLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl);
+		participantLoginPage
+			.loginAs(participant1)
+			.resume();
+		UserToolsPage participantUserTools = new UserToolsPage(participantBrowser);
+		participantUserTools
+			.openUserToolsMenu()
+			.openLectures()
+			.assertOnParticipantLecturesList()
+			.selectCourseAsParticipant(title)
+			.assertOnParticipantLectureBlocks()
+			.assertOnParticipantLectureBlockAbsent(coach, lectureTitle, title);
+	}
+	
+
+	/**
+	 * An author create a course, enable the absence management,
+	 * create a lecture block, add a coach and two participants.<br>
+	 * The coach login in, see the interceptor to start the roll call
+	 * version mobile.<br>
+	 * It starts the roll call, set an absence and close.<br>
+	 * The participant with an absence log in, use the lectures user's
+	 * tool to see that it has an absence.
+	 * 
+	 * @param loginPage
+	 * @throws IOException
+	 * @throws URISyntaxException
+	 */
+	@Test
+	@RunAsClient
+	public void lectureMobileRollCall_authorizedAbsence(@InitialPage LoginPage loginPage,
+			@Drone @User WebDriver coachBrowser, @Drone @User WebDriver participantBrowser)
+	throws IOException, URISyntaxException {
+		
+		// configure the lectures module
+		loginPage
+			.loginAs("administrator", "openolat")
+			.resume();
+		new NavigationPage(browser)
+			.openAdministration()
+			.openLecturesSettings()
+			.configure(true, false)
+			.save();
+		
+		// start the test with authorized absence on
+		UserVO author = new UserRestClient(deploymentUrl).createAuthor();
+		UserVO coach = new UserRestClient(deploymentUrl).createRandomUser("Rei");
+		UserVO participant1 = new UserRestClient(deploymentUrl).createRandomUser("Kanu");
+		UserVO participant2 = new UserRestClient(deploymentUrl).createRandomUser("Rymou");
+		
+		LoginPage
+			.getLoginPage(browser, deploymentUrl)
+			.loginAs(author.getLogin(), author.getPassword());
+		
+		//go to authoring
+		AuthoringEnvPage authoringEnv = navBar
+			.assertOnNavigationPage()
+			.openAuthoringEnvironment();
+		
+		String title = "Lecture " + UUID.randomUUID();
+		//create course
+		authoringEnv
+			.openCreateDropDown()
+			.clickCreate(ResourceType.course)
+			.fillCreateForm(title)
+			.assertOnGeneralTab()
+			.clickToolbarBack();
+		
+		//set access
+		CoursePageFragment course = new CoursePageFragment(browser);
+		course
+			.accessConfiguration()
+			.setUserAccess(UserAccess.registred)
+			.clickToolbarBack();
+		
+		//add a coach
+		course
+			.members()
+			.addMember()	
+			.searchMember(coach, true)
+			.nextUsers()
+			.nextOverview()
+			.selectRepositoryEntryRole(false, true, false)
+			.nextPermissions()
+			.finish();
+		//add the participants
+		course
+			.members()
+			.importMembers()
+			.setMembers(participant1, participant2)
+			.nextUsers()
+			.nextOverview()
+			.nextPermissions()
+			.finish();
+		
+		//enable the lectures
+		LectureRepositoryAdminPage lecturesAdmin = course
+			.lecturesAdministration();
+		lecturesAdmin
+			.settings()
+			.enableLectures()
+			.overrideDefaultSettings()
+			.saveSettings();
+		
+		LectureRepositoryAdminListPage lectureList = lecturesAdmin
+			.lectureList();
+		
+		Calendar cal = Calendar.getInstance();
+		int today = cal.get(Calendar.DATE);
+		int hour = cal.get(Calendar.HOUR_OF_DAY);
+		String lectureTitle = "2.Lecture";
+		lectureList
+			.newLectureBlock()
+			.setTitle(lectureTitle)
+			.setTeacher(coach)
+			.setDate(today, hour, 0, hour, 59)
+			.save();
+		
+		//coach at work
+		LoginPage coachLoginPage = LoginPage.getLoginPage(coachBrowser, deploymentUrl);
+		coachLoginPage
+			.loginAs(coach);
+		new RollCallInterceptorPage(coachBrowser)
+			.startMobile()
+			.setAbsence("1")
+			.saveAndNext()
+			.setAbsence("1")
+			.setAbsence("2")
+			.saveAndNext()
+			.closeRollCall();
+		//check that a roll call at least is closed
+		new TeacherRollCallPage(coachBrowser)
+			.assertOnClosedTable();
+		
+		//participant check it roll call
+		LoginPage participantLoginPage = LoginPage.getLoginPage(participantBrowser, deploymentUrl);
+		participantLoginPage
+			.loginAs(participant1)
+			.resume();
+		UserToolsPage participantUserTools = new UserToolsPage(participantBrowser);
+		participantUserTools
+			.openUserToolsMenu()
+			.openLectures()
+			.assertOnParticipantLecturesList()
+			.selectCourseAsParticipant(title)
+			.assertOnParticipantLectureBlocks()
+			.assertOnParticipantLectureBlockAbsent(coach, lectureTitle, title);
+	}
+	
+	/**
+	 * An author create a course to use the absence management
+	 * without authorized absence.
+	 * 
+	 * @param loginPage
+	 * @throws IOException
+	 * @throws URISyntaxException
+	 */
+	@Test
+	@RunAsClient
+	public void lecturesRollCall(@InitialPage LoginPage loginPage)
+	throws IOException, URISyntaxException {
+
+		// configure the lectures module
+		loginPage
+			.loginAs("administrator", "openolat")
+			.resume();
+		new NavigationPage(browser)
+			.openAdministration()
+			.openLecturesSettings()
+			.configure(false, false)
+			.save();
+		
+		//start
+		UserVO author = new UserRestClient(deploymentUrl).createAuthor();
+		UserVO participant1 = new UserRestClient(deploymentUrl).createRandomUser("Kanu");
+		UserVO participant2 = new UserRestClient(deploymentUrl).createRandomUser("Rymou");
+		
+		LoginPage authorLoginPage = LoginPage.getLoginPage(browser, deploymentUrl);
+		authorLoginPage.loginAs(author.getLogin(), author.getPassword());
+		
+		//go to authoring
+		AuthoringEnvPage authoringEnv = navBar
+			.assertOnNavigationPage()
+			.openAuthoringEnvironment();
+		
+		String title = "Lecture " + UUID.randomUUID();
+		//create course
+		authoringEnv
+			.openCreateDropDown()
+			.clickCreate(ResourceType.course)
+			.fillCreateForm(title)
+			.assertOnGeneralTab()
+			.clickToolbarBack();
+
+		CoursePageFragment course = new CoursePageFragment(browser);
+		//add a coach
+		course
+			.members()
+			.quickAdd(author, true, true);
+		//add the participants
+		course
+			.members()
+			.quickImport(participant1, participant2);
+		
+		//enable the lectures
+		LectureRepositoryAdminPage lecturesAdmin = course
+			.lecturesAdministration();
+		lecturesAdmin
+			.settings()
+			.enableLectures()
+			.overrideDefaultSettings()
+			.saveSettings();
+		
+		//add a lecture
+		LectureRepositoryAdminListPage lectureList = lecturesAdmin
+			.lectureList();
+		
+		Calendar cal = Calendar.getInstance();
+		int today = cal.get(Calendar.DATE);
+		int hour = cal.get(Calendar.HOUR_OF_DAY);
+		String lectureTitle = "2.Lecture";
+		lectureList
+			.newLectureBlock()
+			.setTitle(lectureTitle)
+			.setTeacher(author)
+			.setDate(today, hour, 0, hour, 59)
+			.save();
+		
+		//go to the lectures list as "teacher"
+		LecturesRepositoryPage teachersLectures = lecturesAdmin
+			.clickToolbarRootCrumb()
+			.lectures();
+		teachersLectures
+			.openRollCall(lectureTitle)
+			.setAbsence(participant1, "1")
+			.setAbsence(participant1, "2")
+			.setAbsence(participant1, "3")
+			.closeRollCall()
+			.confirmCloseRollCall()
+			.assertOnClosedTable();
+		
+		//go to the lecture administration in the course
+		lecturesAdmin = teachersLectures
+			.clickToolbarRootCrumb()
+			.lecturesAdministration();
+		lecturesAdmin
+			.participantList()
+			.assertOnParticipantLectureBlockAbsent(participant1, 3)
+			.assertOnParticipantLectureBlockAbsent(participant2, 0);
+	}
+
+}
diff --git a/src/test/java/org/olat/selenium/LoginTest.java b/src/test/java/org/olat/selenium/LoginTest.java
index 99f759c3c505adc3340b615bb9b5165f00c13822..951a10a4e85f90ed057b6dd4cbe737ef7365c21f 100644
--- a/src/test/java/org/olat/selenium/LoginTest.java
+++ b/src/test/java/org/olat/selenium/LoginTest.java
@@ -24,13 +24,11 @@ import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.UUID;
 
-import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.container.test.api.RunAsClient;
 import org.jboss.arquillian.drone.api.annotation.Drone;
 import org.jboss.arquillian.graphene.page.InitialPage;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.arquillian.test.api.ArquillianResource;
-import org.jboss.shrinkwrap.api.spec.WebArchive;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.olat.selenium.page.LoginPage;
@@ -38,7 +36,6 @@ import org.olat.selenium.page.NavigationPage;
 import org.olat.selenium.page.Participant;
 import org.olat.selenium.page.Student;
 import org.olat.selenium.page.core.AdministrationMessagesPage;
-import org.olat.test.ArquillianDeployments;
 import org.olat.test.rest.UserRestClient;
 import org.olat.user.restapi.UserVO;
 import org.openqa.selenium.WebDriver;
@@ -50,12 +47,7 @@ import org.openqa.selenium.WebDriver;
  *
  */
 @RunWith(Arquillian.class)
-public class LoginTest {
-
-	@Deployment(testable = false)
-	public static WebArchive createDeployment() {
-		return ArquillianDeployments.createDeployment();
-	}
+public class LoginTest extends Deployments {
 
 	@Drone
 	private WebDriver browser;
diff --git a/src/test/java/org/olat/selenium/PortfolioV2Test.java b/src/test/java/org/olat/selenium/PortfolioV2Test.java
index f30b9cbee33ec47419a9b6c95cd30703c29fab02..22f6f5edf3d904b7f8468326bd3b7f6115767424 100644
--- a/src/test/java/org/olat/selenium/PortfolioV2Test.java
+++ b/src/test/java/org/olat/selenium/PortfolioV2Test.java
@@ -25,14 +25,12 @@ import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.UUID;
 
-import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.container.test.api.RunAsClient;
 import org.jboss.arquillian.drone.api.annotation.Drone;
 import org.jboss.arquillian.graphene.page.InitialPage;
 import org.jboss.arquillian.graphene.page.Page;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.arquillian.test.api.ArquillianResource;
-import org.jboss.shrinkwrap.api.spec.WebArchive;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.olat.selenium.page.LoginPage;
@@ -59,7 +57,6 @@ import org.olat.selenium.page.repository.FeedPage;
 import org.olat.selenium.page.repository.RepositoryAccessPage.UserAccess;
 import org.olat.selenium.page.user.UserToolsPage;
 import org.olat.selenium.page.wiki.WikiPage;
-import org.olat.test.ArquillianDeployments;
 import org.olat.test.JunitTestHelper;
 import org.olat.test.rest.UserRestClient;
 import org.olat.user.restapi.UserVO;
@@ -74,12 +71,7 @@ import org.openqa.selenium.WebDriver;
  *
  */
 @RunWith(Arquillian.class)
-public class PortfolioV2Test {
-	
-	@Deployment(testable = false)
-	public static WebArchive createDeployment() {
-		return ArquillianDeployments.createDeployment();
-	}
+public class PortfolioV2Test extends Deployments {
 
 	@Drone
 	private WebDriver browser;
diff --git a/src/test/java/org/olat/selenium/UserTest.java b/src/test/java/org/olat/selenium/UserTest.java
index 67533c7dc6baa472c348e40bdc2f894bbd898135..9369a14091ee7b099db7cc962d9ebc141ed714a9 100644
--- a/src/test/java/org/olat/selenium/UserTest.java
+++ b/src/test/java/org/olat/selenium/UserTest.java
@@ -25,14 +25,12 @@ import java.net.URL;
 import java.util.List;
 import java.util.UUID;
 
-import org.jboss.arquillian.container.test.api.Deployment;
 import org.jboss.arquillian.container.test.api.RunAsClient;
 import org.jboss.arquillian.drone.api.annotation.Drone;
 import org.jboss.arquillian.graphene.page.InitialPage;
 import org.jboss.arquillian.graphene.page.Page;
 import org.jboss.arquillian.junit.Arquillian;
 import org.jboss.arquillian.test.api.ArquillianResource;
-import org.jboss.shrinkwrap.api.spec.WebArchive;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -54,7 +52,6 @@ import org.olat.selenium.page.user.UserPreferencesPageFragment.ResumeOption;
 import org.olat.selenium.page.user.UserProfilePage;
 import org.olat.selenium.page.user.UserToolsPage;
 import org.olat.selenium.page.user.VisitingCardPage;
-import org.olat.test.ArquillianDeployments;
 import org.olat.test.rest.RepositoryRestClient;
 import org.olat.test.rest.UserRestClient;
 import org.olat.user.restapi.UserVO;
@@ -69,12 +66,7 @@ import org.openqa.selenium.WebElement;
  *
  */
 @RunWith(Arquillian.class)
-public class UserTest {
-	
-	@Deployment(testable = false)
-	public static WebArchive createDeployment() {
-		return ArquillianDeployments.createDeployment();
-	}
+public class UserTest extends Deployments {
 
 	@Drone
 	private WebDriver browser;
diff --git a/src/test/java/org/olat/selenium/page/course/AssessmentCEConfigurationPage.java b/src/test/java/org/olat/selenium/page/course/AssessmentCEConfigurationPage.java
index ec2605e83bca689c00187ce3967a8ef675b2e396..4bc628edbe0aacc48c508ddac4d2e99a7758afe8 100644
--- a/src/test/java/org/olat/selenium/page/course/AssessmentCEConfigurationPage.java
+++ b/src/test/java/org/olat/selenium/page/course/AssessmentCEConfigurationPage.java
@@ -72,6 +72,7 @@ public class AssessmentCEConfigurationPage {
 		
 		By saveBy = By.cssSelector(".o_sel_course_ms_form button.btn.btn-primary");
 		OOGraphene.click(saveBy, browser);
+		OOGraphene.waitBusy(browser);
 		return this;
 	}
 	
diff --git a/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java b/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java
index 7bdf574c818efd523c13434003be3aec01a9cd0f..a36d641bcecb8af3a01862e0d71574396ea6362a 100644
--- a/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java
+++ b/src/test/java/org/olat/selenium/page/course/CoursePageFragment.java
@@ -28,6 +28,7 @@ import org.olat.selenium.page.core.BookingPage;
 import org.olat.selenium.page.core.MenuTreePageFragment;
 import org.olat.selenium.page.graphene.OOGraphene;
 import org.olat.selenium.page.lecture.LectureRepositoryAdminPage;
+import org.olat.selenium.page.lecture.LecturesRepositoryPage;
 import org.olat.selenium.page.repository.RepositoryAccessPage;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
@@ -283,6 +284,16 @@ public class CoursePageFragment {
 				.assertOnAdminPage();
 	}
 	
+	public LecturesRepositoryPage lectures() {
+		By lecturesBy = By.xpath("//li[contains(@class,'o_tool')]/a[contains(@onclick,'command.lectures')]");
+		OOGraphene.waitElement(lecturesBy, browser);
+		browser.findElement(lecturesBy).click();
+		
+		By teacherOverviewBy = By.cssSelector("div.o_lectures_teacher_overview");
+		OOGraphene.waitElement(teacherOverviewBy, browser);
+		return new LecturesRepositoryPage(browser);
+	}
+	
 	public BookingPage bookingTool() {
 		if(!browser.findElement(toolsMenu).isDisplayed()) {
 			openToolsMenu();
diff --git a/src/test/java/org/olat/selenium/page/course/MembersPage.java b/src/test/java/org/olat/selenium/page/course/MembersPage.java
index 13edd6fe77e4100ae3c05f2a8e23f1822605cc3d..53e4cd595fe918c274f77641c8d4a969d0a24d96 100644
--- a/src/test/java/org/olat/selenium/page/course/MembersPage.java
+++ b/src/test/java/org/olat/selenium/page/course/MembersPage.java
@@ -137,6 +137,37 @@ public class MembersPage {
 			.finish();
 	}
 	
+	/**
+	 * Add a user by username with the specified roles.
+	 * 
+	 * @param user The user to add
+	 * @param owner true if the user will be owner
+	 * @param coach true if the user will be coach
+	 */
+	public void quickAdd(UserVO user, boolean owner, boolean coach) {
+		addMember()	
+			.searchMember(user, true)
+			.nextUsers()
+			.nextOverview()
+			.selectRepositoryEntryRole(owner, coach, false)
+			.nextPermissions()
+			.finish();
+	}
+	
+	/**
+	 * Import the specified users as participants.
+	 * 
+	 * @param users Users to import
+	 */
+	public void quickImport(UserVO... users) {
+		importMembers()
+			.setMembers(users)
+			.nextUsers()
+			.nextOverview()
+			.nextPermissions()
+			.finish();
+	}
+	
 	/**
 	 * Check if the user with the specified first name is in the member list.
 	 * @param user
diff --git a/src/test/java/org/olat/selenium/page/lecture/LectureAdminSettingsPage.java b/src/test/java/org/olat/selenium/page/lecture/LectureAdminSettingsPage.java
index 311036c558e4148af0e1c60cbda9695fb0de9519..05d931c7bbcd60a51d94f7102535e352971409e6 100644
--- a/src/test/java/org/olat/selenium/page/lecture/LectureAdminSettingsPage.java
+++ b/src/test/java/org/olat/selenium/page/lecture/LectureAdminSettingsPage.java
@@ -39,23 +39,56 @@ public class LectureAdminSettingsPage {
 	}
 	
 	/**
-	 * Set some configurations of the lecture module.
+	 * Set of options.
 	 * 
-	 * @param authorizedAbsence Enable/disable authorized absence
+	 * @param authorizedAbsence Enable or not the option "Authorized absences"
+	 * @param teacherCanAutorizeAbsence Enable or not the option "Coaches can authorize absences"
+	 * @return
+	 */
+	public LectureAdminSettingsPage configure(boolean authorizedAbsence, boolean teacherCanAutorizeAbsence) {
+		setAuthorizedAbsence(authorizedAbsence);
+		if(authorizedAbsence) {
+			setTeacherCanAuthorizeAbsence(teacherCanAutorizeAbsence);
+		}
+		return this;
+	}
+	
+	/**
+	 * Set the option "Coaches can authorize absences". Only available
+	 * with the authorized absences enabled.
+	 * 
+	 * @param teacherCanAuthorizeAbsence Enable/disable the hability for coaches to excuse absences
 	 * @return Itself
 	 */
-	public LectureAdminSettingsPage set(boolean authorizedAbsence) {		
-		By authorizedAbsenceLabelBy = By.xpath("//label[input[@name='lecture.authorized.absence.enabled' and @value='on']]");
-		By authorizedAbsenceCheckBy = By.xpath("//label/input[@name='lecture.authorized.absence.enabled' and @value='on']");
+	public LectureAdminSettingsPage setTeacherCanAuthorizeAbsence(boolean teacherCanAuthorizeAbsence) {	
+		String checkName = "lecture.teacher.can.authorize.absence";
+		return set(checkName, teacherCanAuthorizeAbsence);
+	}
+	
+	/**
+	 * Set the option "Authorized absences"
+	 * 
+	 * @param authorizedAbsence Enable/disable authorized absences
+	 * @return Itself
+	 */
+	public LectureAdminSettingsPage setAuthorizedAbsence(boolean authorizedAbsence) {		
+		String checkName = "lecture.authorized.absence.enabled";
+		return set(checkName, authorizedAbsence);
+	}
+	
+	private LectureAdminSettingsPage set(String name, boolean enable) {
+		By enableLabelBy = By.xpath("//label[input[@name='" + name + "' and @value='on']]");
+		By enableCheckBy = By.xpath("//label/input[@name='" + name + "' and @value='on']");
 		
-		OOGraphene.waitElement(authorizedAbsenceLabelBy, browser);
-		OOGraphene.scrollTo(authorizedAbsenceLabelBy, browser);
+		OOGraphene.waitElement(enableLabelBy, browser);
+		OOGraphene.scrollTo(enableLabelBy, browser);
 		
-		WebElement authorizedAbsenceLabelEl = browser.findElement(authorizedAbsenceLabelBy);
-		WebElement authorizedAbsenceCheckEl = browser.findElement(authorizedAbsenceCheckBy);
-		OOGraphene.check(authorizedAbsenceLabelEl, authorizedAbsenceCheckEl, new Boolean(authorizedAbsence));
+		WebElement enableLabelEl = browser.findElement(enableLabelBy);
+		WebElement enableCheckEl = browser.findElement(enableCheckBy);
+		OOGraphene.check(enableLabelEl, enableCheckEl, new Boolean(enable));
 		OOGraphene.waitBusy(browser);
 		return this;
+		
 	}
 	
 	public LectureAdminSettingsPage save() {
diff --git a/src/test/java/org/olat/selenium/page/lecture/LectureListRepositoryPage.java b/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryAdminListPage.java
similarity index 90%
rename from src/test/java/org/olat/selenium/page/lecture/LectureListRepositoryPage.java
rename to src/test/java/org/olat/selenium/page/lecture/LectureRepositoryAdminListPage.java
index 8088354b914745ab6fa4cd0a338f2ec5096b0c52..ecd7d9c6a7ea17e66a15ff55cf6c8d7ccd59f513 100644
--- a/src/test/java/org/olat/selenium/page/lecture/LectureListRepositoryPage.java
+++ b/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryAdminListPage.java
@@ -29,15 +29,15 @@ import org.openqa.selenium.WebDriver;
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
-public class LectureListRepositoryPage {
+public class LectureRepositoryAdminListPage {
 	
 	private WebDriver browser;
 	
-	public LectureListRepositoryPage(WebDriver browser) {
+	public LectureRepositoryAdminListPage(WebDriver browser) {
 		this.browser = browser;
 	}
 	
-	public LectureListRepositoryPage asssertOnLectureList() {
+	public LectureRepositoryAdminListPage asssertOnLectureList() {
 		By lecturesBy = By.cssSelector("div.o_sel_repo_lectures_list");
 		OOGraphene.waitElement(lecturesBy, browser);
 		return this;
diff --git a/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryAdminPage.java b/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryAdminPage.java
index 5663601c75308efc49b8d23e5e45b30e8bf1bfdf..9f64841517c5afc03fe1a344b51a267193ff89e5 100644
--- a/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryAdminPage.java
+++ b/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryAdminPage.java
@@ -21,6 +21,7 @@ package org.olat.selenium.page.lecture;
 
 import java.util.List;
 
+import org.olat.selenium.page.course.CoursePageFragment;
 import org.olat.selenium.page.graphene.OOGraphene;
 import org.openqa.selenium.By;
 import org.openqa.selenium.WebDriver;
@@ -58,13 +59,33 @@ public class LectureRepositoryAdminPage {
 		return new LectureRepositorySettingsPage(browser);
 	}
 	
-	public LectureListRepositoryPage lectureList() {
+	public LectureRepositoryAdminListPage lectureList() {
 		By lecturesBy = By.xpath("//div[contains(@class,'o_sel_repo_lectures_admin')]//a[contains(@onclick,'repo.lectures.block')]");
 		browser.findElement(lecturesBy).click();
 		OOGraphene.waitBusy(browser);
-		return new LectureListRepositoryPage(browser)
+		return new LectureRepositoryAdminListPage(browser)
 				.asssertOnLectureList();
 	}
+	
+	public LectureRepositoryParticipantsPage participantList() {
+		By lecturesBy = By.xpath("//div[contains(@class,'o_sel_repo_lectures_admin')]//a[contains(@onclick,'repo.participants')]");
+		browser.findElement(lecturesBy).click();
+		OOGraphene.waitBusy(browser);
+		return new LectureRepositoryParticipantsPage(browser)
+				.assertOnParticipantLectureBlocks();
+	}
 
+	/**
+	 * Click back to the course
+	 * 
+	 * @return
+	 */
+	public CoursePageFragment clickToolbarRootCrumb() {
+		OOGraphene.closeBlueMessageWindow(browser);
+		By toolbarBackBy = By.xpath("//li[contains(@class,'o_breadcrumb_back')]/following-sibling::li/a");
+		browser.findElement(toolbarBackBy).click();
+		OOGraphene.waitBusy(browser);
+		return new CoursePageFragment(browser);
+	}
 
 }
diff --git a/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryParticipantsPage.java b/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryParticipantsPage.java
new file mode 100644
index 0000000000000000000000000000000000000000..f6f1e7f486f74b28c6b25cb7992f7daf9fd18230
--- /dev/null
+++ b/src/test/java/org/olat/selenium/page/lecture/LectureRepositoryParticipantsPage.java
@@ -0,0 +1,52 @@
+/**
+ * <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.selenium.page.lecture;
+
+import org.olat.selenium.page.graphene.OOGraphene;
+import org.olat.user.restapi.UserVO;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+/**
+ * 
+ * Initial date: 7 nov. 2017<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class LectureRepositoryParticipantsPage {
+	
+	private WebDriver browser;
+	
+	public LectureRepositoryParticipantsPage(WebDriver browser) {
+		this.browser = browser;
+	}
+	
+	public LectureRepositoryParticipantsPage assertOnParticipantLectureBlocks() {
+		By blocks = By.cssSelector("div.o_sel_repo_lectures_admin table");
+		OOGraphene.waitElement(blocks, browser);
+		return this;
+	}
+	
+	public LectureRepositoryParticipantsPage assertOnParticipantLectureBlockAbsent(UserVO participant, int absence) {
+		By blocks = By.xpath("//div[contains(@class,'o_sel_lecture_participants_overview')]//table//tr[td[contains(text(),'" + participant.getFirstName() + "')]][td[contains(text(),'" + absence + "')]]");
+		OOGraphene.waitElement(blocks, browser);
+		return this;
+	}
+}
diff --git a/src/test/java/org/olat/selenium/page/lecture/LecturesRepositoryPage.java b/src/test/java/org/olat/selenium/page/lecture/LecturesRepositoryPage.java
new file mode 100644
index 0000000000000000000000000000000000000000..c52158fb4e8396a2d3bcfc1e5e4d3fc0d576d2de
--- /dev/null
+++ b/src/test/java/org/olat/selenium/page/lecture/LecturesRepositoryPage.java
@@ -0,0 +1,64 @@
+/**
+ * <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.selenium.page.lecture;
+
+import org.olat.selenium.page.course.CoursePageFragment;
+import org.olat.selenium.page.graphene.OOGraphene;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+
+/**
+ * 
+ * The tool in course for teachers.
+ * 
+ * Initial date: 7 nov. 2017<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
+public class LecturesRepositoryPage {
+	
+	private final WebDriver browser;
+	
+	public LecturesRepositoryPage(WebDriver browser) {
+		this.browser = browser;
+	}
+	
+	public TeacherRollCallPage openRollCall(String lectureBlockTitle) {
+		By selectBy = By.xpath("//table//tr[td[contains(text(),'" + lectureBlockTitle + "')]]/td/a[contains(@href,'details')]");
+		browser.findElement(selectBy).click();
+		return new TeacherRollCallPage(browser)
+				.assertOnRollCall();
+	}
+	
+	/**
+	 * Click back to the course
+	 * 
+	 * @return
+	 */
+	public CoursePageFragment clickToolbarRootCrumb() {
+		OOGraphene.closeBlueMessageWindow(browser);
+		By toolbarBackBy = By.xpath("//li[contains(@class,'o_breadcrumb_back')]/following-sibling::li/a");
+		browser.findElement(toolbarBackBy).click();
+		OOGraphene.waitBusy(browser);
+		return new CoursePageFragment(browser);
+	}
+	
+
+}
diff --git a/src/test/java/org/olat/selenium/page/repository/FeedPage.java b/src/test/java/org/olat/selenium/page/repository/FeedPage.java
index 66a706b403de8c1d782f59b572c65e6a43f563d2..286e277ed6557e9ffb775caf96c5e008190c3136 100644
--- a/src/test/java/org/olat/selenium/page/repository/FeedPage.java
+++ b/src/test/java/org/olat/selenium/page/repository/FeedPage.java
@@ -125,7 +125,7 @@ public class FeedPage {
 		//click the button to create a feed
 		By feedButton = By.xpath("//div[contains(@class,'o_blog_no_posts')]//a[contains(@href,'feed.make.internal')]");
 		browser.findElement(feedButton).click();
-		OOGraphene.waitBusy(browser);
+		OOGraphene.waitModalDialog(browser);
 		return this;
 	}