diff --git a/NOTICE.TXT b/NOTICE.TXT
index ee6bd8fe3adbe21c23026bd59253ab561cd64f0b..979fc0ee23b367a9daa5b49ee1e8c90124f7060b 100644
--- a/NOTICE.TXT
+++ b/NOTICE.TXT
@@ -129,6 +129,7 @@ This produce uses software based on the MIT License
 * html5shiv (MIT License / GPL2) [https://github.com/aFarkas/html5shiv]
 * respond.js (MIT License) [https://github.com/scottjehl/Respond]
 * Fuel UX (MIT License) [http://exacttarget.github.io/fuelux]
+* mediaelementjs (MIT License) [http://mediaelementjs.com]
 
 -----------------------------------------------------------------------
 This product uses software based on the BSD License
diff --git a/src/main/java/org/olat/admin/landingpages/model/Rule.java b/src/main/java/org/olat/admin/landingpages/model/Rule.java
index 53fbf2e4b48cb531d637b02773c6abfe5ccf13e6..63330fc3f86dfd8bf36750d6e5af2096fdfc8284 100644
--- a/src/main/java/org/olat/admin/landingpages/model/Rule.java
+++ b/src/main/java/org/olat/admin/landingpages/model/Rule.java
@@ -77,6 +77,8 @@ public class Rule {
 	}
 	
 	public boolean match(UserSession userSession) {
+		if(userSession == null || userSession.getRoles() == null) return false;
+		
 		boolean match = true;
 		
 		//match the role?
diff --git a/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementController.java b/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementController.java
index af693b611f63c8b2eb7a88aa3ddf723f5e8ad877..784f7425cc664b5a004f570f5a28653353aa2a17 100644
--- a/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementController.java
+++ b/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementController.java
@@ -56,8 +56,6 @@ import org.olat.core.util.mail.ContactList;
 import org.olat.core.util.mail.ContactMessage;
 import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.VFSContainer;
-import org.olat.course.CourseFactory;
-import org.olat.course.ICourse;
 import org.olat.course.assessment.EfficiencyStatement;
 import org.olat.course.assessment.EfficiencyStatementManager;
 import org.olat.course.assessment.IdentityAssessmentEditController;
@@ -66,6 +64,8 @@ import org.olat.course.assessment.portfolio.EfficiencyStatementArtefact;
 import org.olat.course.certificate.Certificate;
 import org.olat.course.certificate.CertificatesManager;
 import org.olat.group.BusinessGroup;
+import org.olat.group.BusinessGroupService;
+import org.olat.group.model.SearchBusinessGroupParams;
 import org.olat.modules.co.ContactFormController;
 import org.olat.portfolio.EPArtefactHandler;
 import org.olat.portfolio.PortfolioModule;
@@ -111,6 +111,8 @@ public class CertificateAndEfficiencyStatementController extends BasicController
 	private PortfolioModule portfolioModule;
 	@Autowired
 	private CertificatesManager certificatesManager;
+	@Autowired
+	private BusinessGroupService businessGroupService;
 	
 	/**
 	 * The constructor shows the efficiency statement given as parameter for the current user
@@ -152,8 +154,8 @@ public class CertificateAndEfficiencyStatementController extends BasicController
 		this.businessGroup = businessGroup;
 
 		if(businessGroup == null && courseRepo != null) {
-			ICourse course = CourseFactory.loadCourse(courseRepo.getOlatResource());
-			List<BusinessGroup> groups = course.getCourseEnvironment().getCourseGroupManager().getParticipatingBusinessGroups(statementOwner);
+			SearchBusinessGroupParams params = new SearchBusinessGroupParams(statementOwner, false, true);
+			List<BusinessGroup> groups = businessGroupService.findBusinessGroups(params, courseRepo, 0, -1);
 			if(groups.size() > 0) {
 				businessGroup = groups.get(0);
 			}
diff --git a/src/main/java/org/olat/course/editor/EditorMainController.java b/src/main/java/org/olat/course/editor/EditorMainController.java
index 4316d59f0a13d5be79d09cb3717f4e4400f28905..e994980326935398a2fedf26b3f5a6b636a9b325 100644
--- a/src/main/java/org/olat/course/editor/EditorMainController.java
+++ b/src/main/java/org/olat/course/editor/EditorMainController.java
@@ -87,6 +87,7 @@ import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.tree.TreeVisitor;
 import org.olat.core.util.tree.Visitor;
 import org.olat.core.util.vfs.VFSContainer;
+import org.olat.course.CorruptedCourseException;
 import org.olat.course.CourseFactory;
 import org.olat.course.DisposedCourseRestartController;
 import org.olat.course.ICourse;
@@ -338,10 +339,14 @@ public class EditorMainController extends MainLayoutBasicController implements G
 	@Override
 	public boolean requestForClose(UserRequest ureq) {
 		boolean immediateClose = true;
-		ICourse course = CourseFactory.loadCourse(ores.getResourceableId());
-		if(hasPublishableChanges(course)) {
-			doQuickPublish(ureq, course);
-			immediateClose = false;
+		try {
+			ICourse course = CourseFactory.loadCourse(ores.getResourceableId());
+			if(hasPublishableChanges(course)) {
+				doQuickPublish(ureq, course);
+				immediateClose = false;
+			}
+		} catch (CorruptedCourseException e) {
+			logError("", e);
 		}
 		return immediateClose;
 	}
diff --git a/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java b/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java
index aabfa6a074c12af89e4fd06eff6b486d2df87e59..ea57e9b5a75005db7751ba0a90d33b7fabe1ff5c 100644
--- a/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java
+++ b/src/main/java/org/olat/ims/qti/editor/QTIEditorMainController.java
@@ -91,6 +91,7 @@ import org.olat.core.util.vfs.VFSContainer;
 import org.olat.core.util.vfs.callbacks.FullAccessWithQuotaCallback;
 import org.olat.core.util.vfs.callbacks.VFSSecurityCallback;
 import org.olat.core.util.xml.XStreamHelper;
+import org.olat.course.CorruptedCourseException;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
 import org.olat.course.nodes.CourseNode;
@@ -133,6 +134,7 @@ import org.olat.repository.RepositoryManager;
 import org.olat.repository.RepositoryService;
 import org.olat.resource.references.ReferenceImpl;
 import org.olat.user.UserManager;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * Description: <br>
@@ -254,24 +256,37 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 	private StepsMainRunController importTableWizard;
 	private InsertNodeController moveCtrl, copyCtrl, insertCtrl;
 
-	private final UserManager userManager;
-	private final QTIQPoolServiceProvider qtiQpoolServiceProvider;
+	@Autowired
+	private UserManager userManager;
+	@Autowired
+	private QTIResultManager qtiResultManager;
+	@Autowired
+	private RepositoryManager repositoryManager;
+	@Autowired
+	private QTIQPoolServiceProvider qtiQpoolServiceProvider;
 	
-	public QTIEditorMainController(List<ReferenceImpl> referencees, UserRequest ureq, WindowControl wControl, FileResource fileResource) {
+	public QTIEditorMainController(UserRequest ureq, WindowControl wControl, RepositoryEntry qtiEntry, List<ReferenceImpl> referencees, FileResource fileResource) {
 		super(ureq, wControl);
-		
-		qtiQpoolServiceProvider = (QTIQPoolServiceProvider)CoreSpringFactory.getBean("qtiPoolServiceProvider");
-		userManager = CoreSpringFactory.getImpl(UserManager.class);
 
 		for(Iterator<ReferenceImpl> iter = referencees.iterator(); iter.hasNext(); ) {
 			ReferenceImpl ref = iter.next();
 			if ("CourseModule".equals(ref.getSource().getResourceableTypeName())) {
-				ICourse course = CourseFactory.loadCourse(ref.getSource().getResourceableId());
-				CourseNode courseNode = course.getEditorTreeModel().getCourseNode(ref.getUserdata());
-				String repositorySoftKey = (String) courseNode.getModuleConfiguration().get(IQEditController.CONFIG_KEY_REPOSITORY_SOFTKEY);
-				Long repKey = RepositoryManager.getInstance().lookupRepositoryEntryBySoftkey(repositorySoftKey, true).getKey();
-				restrictedEdit = ((CoordinatorManager.getInstance().getCoordinator().getLocker().isLocked(course, null))
-						|| QTIResultManager.getInstance().countResults(course.getResourceableId(), courseNode.getIdent(), repKey) > 0) ? true : false;
+				try {
+					ICourse course = CourseFactory.loadCourse(ref.getSource().getResourceableId());
+					CourseNode courseNode = course.getEditorTreeModel().getCourseNode(ref.getUserdata());
+					String repositorySoftKey = (String) courseNode.getModuleConfiguration().get(IQEditController.CONFIG_KEY_REPOSITORY_SOFTKEY);
+					//check softly that the setting if ok
+					if(qtiEntry.getSoftkey().equals(repositorySoftKey)) {
+						restrictedEdit = ((CoordinatorManager.getInstance().getCoordinator().getLocker().isLocked(course, null))
+							|| qtiResultManager.countResults(course.getResourceableId(), courseNode.getIdent(), qtiEntry.getKey()) > 0) ? true : false;
+					} else {
+						logError("The course node soft key doesn't match the test/survey sotf key. Course resourceable id: "
+					      + course.getResourceableId() + " (" + course.getCourseTitle() + ") course node: " + courseNode.getIdent() + " (" + courseNode.getShortTitle() + " )"
+					      + " soft key of test/survey in course: " + repositorySoftKey + "  test/survey soft key: " + qtiEntry.getSoftkey(), null);
+					}
+				} catch(CorruptedCourseException e) {
+					logError("", e);
+				}
 			}
 			if(restrictedEdit) {
 				break;
@@ -1198,10 +1213,17 @@ public class QTIEditorMainController extends MainLayoutBasicController implement
 		for (Iterator<ReferenceImpl> iter = referencees.iterator(); iter.hasNext();) {
 			ReferenceImpl element = iter.next();
 			if ("CourseModule".equals(element.getSource().getResourceableTypeName())) {
-				ICourse course = CourseFactory.loadCourse(element.getSource().getResourceableId());
-				if(course == null) {
+				ICourse course = null;
+				try {
+					course = CourseFactory.loadCourse(element.getSource().getResourceableId());
+					if(course == null) {
+						continue;
+					}
+				} catch(CorruptedCourseException ex) {
+					logError("", ex);
 					continue;
 				}
+				
 				String courseTitle = course.getCourseTitle();
 				StringBuilder stakeHolders = new StringBuilder();
 				
diff --git a/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java b/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java
index ba3b52ff81d1527c4cb4abd41750986dd0c0dc60..8bffea598ddcd81191fb3f8f779e6c48d99ef2d9 100644
--- a/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java
+++ b/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java
@@ -172,11 +172,8 @@ public class QTISurveyHandler extends QTIHandler {
 		fr.overrideResourceableId(res.getResourceableId());
 		
 		//check if we can edit in restricted mode -> only typos 
-		ReferenceManager refM = ReferenceManager.getInstance();
-		List<ReferenceImpl> referencees = refM.getReferencesTo(res);
-		//String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale());
-		//boolean restrictedEdit = referencesSummary != null;
-		QTIEditorMainController editor =  new QTIEditorMainController(referencees,ureq, wControl, fr);
+		List<ReferenceImpl> referencees = ReferenceManager.getInstance().getReferencesTo(res);
+		QTIEditorMainController editor =  new QTIEditorMainController(ureq, wControl, re, referencees, fr);
 		if (editor.isLockedSuccessfully()) {
 			return editor;
 		} else {
diff --git a/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java b/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java
index a96e631b124eccd352320d11565dd9e6b0f0451a..f2ec2b249755c20a932e8e5a4110cf458849a789 100644
--- a/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java
+++ b/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java
@@ -173,11 +173,8 @@ public class QTITestHandler extends QTIHandler {
 		fr.overrideResourceableId(res.getResourceableId());
 		
 		//check if we can edit in restricted mode -> only typos 
-		ReferenceManager refM = ReferenceManager.getInstance();
-		List<ReferenceImpl> referencees = refM.getReferencesTo(res);
-		//String referencesSummary = refM.getReferencesToSummary(res, ureq.getLocale());
-		//boolean restrictedEdit = referencesSummary != null;
-		QTIEditorMainController editor =  new QTIEditorMainController(referencees,ureq, wControl, fr);
+		List<ReferenceImpl> referencees = ReferenceManager.getInstance().getReferencesTo(res);
+		QTIEditorMainController editor =  new QTIEditorMainController(ureq, wControl, re, referencees, fr);
 		if (editor.isLockedSuccessfully()) {
 			return editor;
 		} else {
diff --git a/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java b/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java
index 586ccd980c3f86db427eb98db15240e4985713a2..c78a5a308eeee3e02dfd4e257d40dad5e10bb9e1 100644
--- a/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java
+++ b/src/main/java/org/olat/modules/coach/ui/EfficiencyStatementDetailsController.java
@@ -23,7 +23,6 @@ import java.util.Collections;
 import java.util.List;
 
 import org.olat.basesecurity.BaseSecurity;
-import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.link.Link;
@@ -40,6 +39,7 @@ import org.olat.core.gui.control.generic.dtabs.Activateable2;
 import org.olat.core.id.Identity;
 import org.olat.core.id.context.ContextEntry;
 import org.olat.core.id.context.StateEntry;
+import org.olat.course.CorruptedCourseException;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
 import org.olat.course.assessment.EfficiencyStatement;
@@ -49,6 +49,7 @@ import org.olat.course.assessment.UserEfficiencyStatement;
 import org.olat.course.certificate.ui.CertificateAndEfficiencyStatementController;
 import org.olat.modules.coach.model.EfficiencyStatementEntry;
 import org.olat.repository.RepositoryEntry;
+import org.springframework.beans.factory.annotation.Autowired;
 
 /**
  * 
@@ -62,8 +63,8 @@ import org.olat.repository.RepositoryEntry;
 public class EfficiencyStatementDetailsController extends BasicController implements Activateable2 {
 	
 	private final VelocityContainer mainVC;
-	private final SegmentViewComponent segmentView;
-	private final Link efficiencyStatementLink, assessmentLink;
+	private SegmentViewComponent segmentView;
+	private Link assessmentLink,  efficiencyStatementLink;
 	
 	private boolean hasChanged;
 	private EfficiencyStatementEntry statementEntry;
@@ -72,40 +73,41 @@ public class EfficiencyStatementDetailsController extends BasicController implem
 	
 	private final Identity assessedIdentity;
 	
-	private final BaseSecurity securityManager;
-	private final EfficiencyStatementManager efficiencyStatementManager;
+	@Autowired
+	private BaseSecurity securityManager;
+	@Autowired
+	private EfficiencyStatementManager efficiencyStatementManager;
 	
 	public EfficiencyStatementDetailsController(UserRequest ureq, WindowControl wControl,
 			EfficiencyStatementEntry statementEntry) {
 		super(ureq, wControl);
-		
-		efficiencyStatementManager = EfficiencyStatementManager.getInstance();
-		securityManager = CoreSpringFactory.getImpl(BaseSecurity.class);
 
 		mainVC = createVelocityContainer("efficiency_details");
 		this.statementEntry = statementEntry;
 
-		segmentView = SegmentViewFactory.createSegmentView("segments", mainVC, this);
-		efficiencyStatementLink = LinkFactory.createLink("details.statement", mainVC, this);
-		segmentView.addSegment(efficiencyStatementLink, true);
-		
-		assessmentLink = LinkFactory.createLink("details.assessment", mainVC, this);
-		segmentView.addSegment(assessmentLink, false);
-
 		RepositoryEntry entry = statementEntry.getCourse();
 		assessedIdentity = securityManager.loadIdentityByKey(statementEntry.getStudentKey());
 		statementCtrl = createEfficiencyStatementController(ureq);
 		listenTo(statementCtrl);
+		mainVC.put("segmentCmp", statementCtrl.getInitialComponent());
 		
-		if(entry == null) {
-			assessmentLink.setEnabled(false);
-		} else {
-			ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
-			assessmentCtrl = new IdentityAssessmentEditController(wControl, ureq, null, assessedIdentity, course, true, false);
-			listenTo(assessmentCtrl);
+		if(entry != null) {
+			try {
+				ICourse course = CourseFactory.loadCourse(entry.getOlatResource());
+				assessmentCtrl = new IdentityAssessmentEditController(wControl, ureq, null, assessedIdentity, course, true, false);
+				listenTo(assessmentCtrl);
+				
+				segmentView = SegmentViewFactory.createSegmentView("segments", mainVC, this);
+				efficiencyStatementLink = LinkFactory.createLink("details.statement", mainVC, this);
+				segmentView.addSegment(efficiencyStatementLink, true);
+				
+				assessmentLink = LinkFactory.createLink("details.assessment", mainVC, this);
+				segmentView.addSegment(assessmentLink, false);
+			} catch(CorruptedCourseException e) {
+				logError("", e);
+			}
 		}
 
-		mainVC.put("segmentCmp", statementCtrl.getInitialComponent());
 		putInitialPanel(mainVC);
 	}
 	
@@ -117,6 +119,11 @@ public class EfficiencyStatementDetailsController extends BasicController implem
 	protected void doDispose() {
 		//
 	}
+	
+	@Override
+	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
+		//
+	}
 
 	@Override
 	protected void event(UserRequest ureq, Controller source, Event event) {
@@ -136,7 +143,7 @@ public class EfficiencyStatementDetailsController extends BasicController implem
 	protected void event(UserRequest ureq, Component source, Event event) {
 		if(source == segmentView && event instanceof SegmentViewEvent) {
 			SegmentViewEvent sve = (SegmentViewEvent)event;
-			if(efficiencyStatementLink.getComponentName().equals(sve.getComponentName())) {
+			if(efficiencyStatementLink != null && efficiencyStatementLink.getComponentName().equals(sve.getComponentName())) {
 				if(hasChanged) {
 					//reload
 					removeAsListenerAndDispose(statementCtrl);
@@ -145,16 +152,11 @@ public class EfficiencyStatementDetailsController extends BasicController implem
 					hasChanged = false;
 				}
 				mainVC.put("segmentCmp", statementCtrl.getInitialComponent());
-			} else if(assessmentLink.getComponentName().equals(sve.getComponentName())) {
+			} else if(assessmentLink != null && assessmentLink.getComponentName().equals(sve.getComponentName())) {
 				mainVC.put("segmentCmp", assessmentCtrl.getInitialComponent());
 			}
 		}
 	}
-
-	@Override
-	public void activate(UserRequest ureq, List<ContextEntry> entries, StateEntry state) {
-		//
-	}
 	
 	private CertificateAndEfficiencyStatementController createEfficiencyStatementController(UserRequest ureq) {
 		RepositoryEntry entry = statementEntry.getCourse();
diff --git a/src/main/java/org/olat/modules/coach/ui/_content/efficiency_details.html b/src/main/java/org/olat/modules/coach/ui/_content/efficiency_details.html
index 9ff4dd926a6b594d85191c90dfd90c53aed8bf73..68aded09baafdff1e55944fdc6471d435e744d96 100644
--- a/src/main/java/org/olat/modules/coach/ui/_content/efficiency_details.html
+++ b/src/main/java/org/olat/modules/coach/ui/_content/efficiency_details.html
@@ -1,4 +1,6 @@
-$r.render("segments")
+#if($r.available("segments"))
+	$r.render("segments")
+#end
 #if($r.available("segmentCmp"))
 	$r.render("segmentCmp")
 #end
\ No newline at end of file
diff --git a/src/main/webapp/static/movie/README b/src/main/webapp/static/movie/README
new file mode 100644
index 0000000000000000000000000000000000000000..34aa7872f556f615dbb98befde3982a98bc09eef
--- /dev/null
+++ b/src/main/webapp/static/movie/README
@@ -0,0 +1,6 @@
+The main library is MediaElement.js, there is a fallback the JWPlayer for some
+rtmp streams.
+
+mediaelement-and-player.min.js is slightly modified. At the beginning of the
+file, search for "audio/mp3","audio/m4a" and after add "audio/aac" to support
+AAC files
\ No newline at end of file