diff --git a/src/main/java/org/olat/core/gui/control/winmgr/WindowManagerImpl.java b/src/main/java/org/olat/core/gui/control/winmgr/WindowManagerImpl.java
index 475c62353cd1d7a1b708c1c6ad49d76fc30109e1..3f7e8eeb36575d3ca90bb7ffb5fef83507d72650 100644
--- a/src/main/java/org/olat/core/gui/control/winmgr/WindowManagerImpl.java
+++ b/src/main/java/org/olat/core/gui/control/winmgr/WindowManagerImpl.java
@@ -39,8 +39,6 @@ import org.olat.core.gui.WindowManager;
 import org.olat.core.gui.WindowSettings;
 import org.olat.core.gui.components.Component;
 import org.olat.core.gui.components.ComponentRenderer;
-import org.olat.core.gui.components.velocity.VelocityContainer;
-import org.olat.core.gui.components.velocity.VelocityContainerRenderer;
 import org.olat.core.gui.control.ChiefController;
 import org.olat.core.gui.control.ContentableChiefController;
 import org.olat.core.gui.control.WindowBackOffice;
diff --git a/src/main/java/org/olat/restapi/repository/course/CourseWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseWebService.java
index 5f749765c5a43be4789353183df83b146c2d963b..3f453cc533251d7551e0aa172c60eb8f630fbd42 100644
--- a/src/main/java/org/olat/restapi/repository/course/CourseWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CourseWebService.java
@@ -41,7 +41,6 @@ import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
-import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.CacheControl;
 import javax.ws.rs.core.Context;
 import javax.ws.rs.core.MediaType;
@@ -60,19 +59,15 @@ import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.media.MediaResource;
-import org.olat.core.helpers.Settings;
 import org.olat.core.id.Identity;
-import org.olat.core.id.OLATResourceable;
 import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.StringHelper;
 import org.olat.core.util.coordinate.LockResult;
 import org.olat.core.util.mail.MailPackage;
-import org.olat.core.util.resource.OresHelper;
 import org.olat.core.util.vfs.VFSItem;
 import org.olat.core.util.xml.XStreamHelper;
 import org.olat.course.CourseFactory;
-import org.olat.course.CourseModule;
 import org.olat.course.ICourse;
 import org.olat.course.config.CourseConfig;
 import org.olat.course.nodes.cal.CourseCalendars;
@@ -104,7 +99,6 @@ import com.thoughtworks.xstream.XStream;
  * Initial Date:  27 apr. 2010 <br>
  * @author srosse, stephane.rosse@frentix.com
  */
-@Path("repo/courses/{courseId}")
 public class CourseWebService {
 
 	private static final OLog log = Tracing.createLoggerFor(CourseWebService.class);
@@ -128,9 +122,9 @@ public class CourseWebService {
 
 	/**
 	 * The version of the Course Web Service
-   * @response.representation.200.mediaType text/plain
-   * @response.representation.200.doc The version of this specific Web Service
-   * @response.representation.200.example 1.0
+	 * @response.representation.200.mediaType text/plain
+	 * @response.representation.200.doc The version of this specific Web Service
+	 * @response.representation.200.example 1.0
 	 * @return
 	 */
 	@GET
@@ -141,13 +135,9 @@ public class CourseWebService {
 	}
 	
 	@Path("groups")
-	public CourseGroupWebService getCourseGroupWebService(@PathParam("courseId") Long courseId) {
-		OLATResource ores = getCourseOLATResource(courseId);
-		if(ores == null) {
-			throw new WebApplicationException(Response.serverError().status(Status.NOT_FOUND).build());
-		}
-		RepositoryEntry re = getCourseEntry(ores);
-		return new CourseGroupWebService(re, ores);
+	public CourseGroupWebService getCourseGroupWebService() {
+		RepositoryEntry re = RepositoryManager.getInstance().lookupRepositoryEntry(courseOres, false);
+		return new CourseGroupWebService(re, courseOres);
 	}
 	
 	@Path("calendar")
@@ -163,12 +153,11 @@ public class CourseWebService {
 	/**
 	 * Publish the course.
 	 * @response.representation.200.qname {http://www.example.com}courseVO
-   * @response.representation.200.mediaType application/xml, application/json
-   * @response.representation.200.doc The metadatas of the created course
-   * @response.representation.200.example {@link org.olat.restapi.support.vo.Examples#SAMPLE_COURSEVO}
+	 * @response.representation.200.mediaType application/xml, application/json
+	 * @response.representation.200.doc The metadatas of the created course
+	 * @response.representation.200.example {@link org.olat.restapi.support.vo.Examples#SAMPLE_COURSEVO}
 	 * @response.representation.401.doc The roles of the authenticated user are not sufficient
-   * @response.representation.404.doc The course not found
-	 * @param courseId The course resourceable's id
+	 * @response.representation.404.doc The course not found
 	 * @param locale The course locale
 	 * @param request The HTTP request
 	 * @return It returns the metadatas of the published course.
@@ -176,7 +165,7 @@ public class CourseWebService {
 	@POST
 	@Path("publish")
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
-	public Response publishCourse(@PathParam("courseId") Long courseId, @QueryParam("locale") Locale locale,
+	public Response publishCourse(@QueryParam("locale") Locale locale,
 			@QueryParam("access") Integer access, @QueryParam("membersOnly") Boolean membersOnly,
 			@Context HttpServletRequest request) {
 		if(!isAuthor(request)) {
@@ -184,10 +173,7 @@ public class CourseWebService {
 		}
 
 		UserRequest ureq = getUserRequest(request);
-		ICourse course = loadCourse(courseId);
-		if(course == null) {
-			return Response.serverError().status(Status.NOT_FOUND).build();
-		} else if (!isAuthorEditor(course, request)) {
+		if (!isAuthorEditor(course, request)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
@@ -197,56 +183,42 @@ public class CourseWebService {
 		CourseVO vo = ObjectFactory.get(course);
 		return Response.ok(vo).build();
 	}
-	
-
 
 	/**
 	 * Get the metadatas of the course by id
 	 * @response.representation.200.qname {http://www.example.com}courseVO
-   * @response.representation.200.mediaType application/xml, application/json
-   * @response.representation.200.doc The metadatas of the created course
-   * @response.representation.200.example {@link org.olat.restapi.support.vo.Examples#SAMPLE_COURSEVO}
-   * @response.representation.404.doc The course not found
-	 * @param courseId The course resourceable's id
+	 * @response.representation.200.mediaType application/xml, application/json
+	 * @response.representation.200.doc The metadatas of the created course
+	 * @response.representation.200.example {@link org.olat.restapi.support.vo.Examples#SAMPLE_COURSEVO}
+	 * @response.representation.404.doc The course not found
 	 * @return It returns the <code>CourseVO</code> object representing the course.
 	 */
 	@GET
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
-	public Response findById(@PathParam("courseId") Long courseId, @Context HttpServletRequest httpRequest) {
-		ICourse course = loadCourse(courseId);
-		if(course == null) {
-			return Response.serverError().status(Status.NOT_FOUND).build();
-		} else if (!isCourseAccessible(course, false, httpRequest)) {
+	public Response findById(@Context HttpServletRequest httpRequest) {
+		if (!isCourseAccessible(course, false, httpRequest)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		CourseVO vo = ObjectFactory.get(course);
 		return Response.ok(vo).build();
 	}
 	
-  /**
-   * Export the course
-   * @response.representation.200.mediaType application/zip
-   * @response.representation.200.doc The course as a ZIP file
-   * @response.representation.401.doc Not authorized to export the course
-   * @response.representation.404.doc The course not found
-   * @param courseId The course resourceable's id
+	/**
+	 * Export the course
+	 * @response.representation.200.mediaType application/zip
+	 * @response.representation.200.doc The course as a ZIP file
+	 * @response.representation.401.doc Not authorized to export the course
+	 * @response.representation.404.doc The course not found
 	 * @return It returns the <code>CourseVO</code> object representing the course.
 	 */
-
-	
 	@GET
 	@Path("file")
 	@Produces({ "application/zip", MediaType.APPLICATION_OCTET_STREAM })
-	public Response getRepoFileById(@PathParam("courseId") Long courseId, @Context HttpServletRequest request) {
+	public Response getRepoFileById(@Context HttpServletRequest request) {
 		if(!isAuthor(request)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
-		
-		ICourse course = loadCourse(courseId);
-		if(course == null) {
-			return Response.serverError().status(Status.NOT_FOUND).build();
-		}
-		
+
 		RepositoryManager rm = RepositoryManager.getInstance();
 		RepositoryService rs = CoreSpringFactory.getImpl(RepositoryService.class);
 		RepositoryEntry re = rm.lookupRepositoryEntry(course, true);
@@ -299,47 +271,37 @@ public class CourseWebService {
 
 	/**
 	 * Delete a course by id
-   * @response.representation.200.doc The metadatas of the created course
+	 * @response.representation.200.doc The metadatas of the created course
 	 * @response.representation.401.doc The roles of the authenticated user are not sufficient
-   * @response.representation.404.doc The course not found
-	 * @param courseId The course resourceable's id
+	 * @response.representation.404.doc The course not found
 	 * @param request The HTTP request
 	 * @return It returns the XML representation of the <code>Structure</code>
 	 *         object representing the course.
 	 */
 	@DELETE
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
-	public Response deleteCourse(@PathParam("courseId") Long courseId, @Context HttpServletRequest request) {
+	public Response deleteCourse(@Context HttpServletRequest request) {
 		if(!isAuthor(request)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
-		}
-		
-		ICourse course = loadCourse(courseId);
-		if(course == null) {
-			return Response.serverError().status(Status.NOT_FOUND).build();
 		} else if (!isAuthorEditor(course, request)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		UserRequest ureq = getUserRequest(request);
-		
-		//fxdiff
 		ErrorWindowControl error = new ErrorWindowControl();
 		RepositoryManager rm = RepositoryManager.getInstance();
 		RepositoryEntry re = rm.lookupRepositoryEntry(course, true);
 		rm.deleteRepositoryEntryWithAllData(ureq, error, re);
-		
 		return Response.ok().build();
 	}
 	
 	/**
 	 * Get the configuration of the course
 	 * @response.representation.200.qname {http://www.example.com}courseConfigVO
-   * @response.representation.200.mediaType application/xml, application/json
-   * @response.representation.200.doc The configuration of the course
-   * @response.representation.200.example {@link org.olat.restapi.support.vo.Examples#SAMPLE_COURSECONFIGVO}
-   * @response.representation.401.doc The roles of the authenticated user are not sufficient
-   * @response.representation.404.doc The course not found
-	 * @param courseId The course resourceable's id
+	 * @response.representation.200.mediaType application/xml, application/json
+	 * @response.representation.200.doc The configuration of the course
+	 * @response.representation.200.example {@link org.olat.restapi.support.vo.Examples#SAMPLE_COURSECONFIGVO}
+	 * @response.representation.401.doc The roles of the authenticated user are not sufficient
+	 * @response.representation.404.doc The course not found
 	 * @param request The HTTP request
 	 * @return It returns the XML representation of the <code>Structure</code>
 	 *         object representing the course.
@@ -347,14 +309,9 @@ public class CourseWebService {
 	@GET
 	@Path("configuration")
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
-	public Response getConfiguration(@PathParam("courseId") Long courseId, @Context HttpServletRequest request) {
+	public Response getConfiguration(@Context HttpServletRequest request) {
 		if(!isAuthor(request)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
-		}
-		
-		ICourse course = loadCourse(courseId);
-		if(course == null) {
-			return Response.serverError().status(Status.NOT_FOUND).build();
 		} else if (!isAuthorEditor(course, request)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
@@ -425,11 +382,10 @@ public class CourseWebService {
 	
 	/**
 	 * Get the runstructure of the course by id
-   * @response.representation.200.mediaType application/xml
-   * @response.representation.200.doc The run structure of the course
+	 * @response.representation.200.mediaType application/xml
+	 * @response.representation.200.doc The run structure of the course
 	 * @response.representation.401.doc The roles of the authenticated user are not sufficient
-   * @response.representation.404.doc The course not found
-	 * @param courseId The course resourceable's id
+	 * @response.representation.404.doc The course not found
 	 * @param httpRequest The HTTP request
 	 * @param request The REST request
 	 * @return It returns the XML representation of the <code>Structure</code>
@@ -438,20 +394,13 @@ public class CourseWebService {
 	@GET
 	@Path("runstructure")
 	@Produces(MediaType.APPLICATION_XML)
-	public Response findRunStructureById(@PathParam("courseId") Long courseId, @Context HttpServletRequest httpRequest, @Context Request request) {
-		if(!isAuthor(httpRequest)) {
+	public Response findRunStructureById(@Context HttpServletRequest httpRequest, @Context Request request) {
+		if (!isAuthorEditor(course, httpRequest)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
-		ICourse course = loadCourse(courseId);
-		if(course == null) {
-			return Response.serverError().status(Status.NOT_FOUND).build();
-		} else if (!isAuthorEditor(course, httpRequest)) {
-			return Response.serverError().status(Status.UNAUTHORIZED).build();
-		}
 		VFSItem runStructureItem = course.getCourseBaseContainer().resolve("runstructure.xml");
 		Date lastModified = new Date(runStructureItem.getLastModified());
-		
 		Response.ResponseBuilder response = request.evaluatePreconditions(lastModified);
 		if(response == null) {
 			return Response.ok(myXStream.toXML(course.getRunStructure())).build();
@@ -461,11 +410,10 @@ public class CourseWebService {
 	
 	/**
 	 * Get the editor tree model of the course by id
-   * @response.representation.200.mediaType application/xml
-   * @response.representation.200.doc The editor tree model of the course
+	 * @response.representation.200.mediaType application/xml
+	 * @response.representation.200.doc The editor tree model of the course
 	 * @response.representation.401.doc The roles of the authenticated user are not sufficient
-   * @response.representation.404.doc The course not found
-	 * @param courseId The course resourceable's id
+	 * @response.representation.404.doc The course not found
 	 * @param httpRequest The HTTP request
 	 * @param request The REST request
 	 * @return It returns the XML representation of the <code>Editor model</code>
@@ -474,15 +422,8 @@ public class CourseWebService {
 	@GET
 	@Path("editortreemodel")
 	@Produces(MediaType.APPLICATION_XML)
-	public Response findEditorTreeModelById(@PathParam("courseId") Long courseId, @Context HttpServletRequest httpRequest, @Context Request request) {
-		if(!isAuthor(httpRequest)) {
-			return Response.serverError().status(Status.UNAUTHORIZED).build();
-		}
-		
-		ICourse course = loadCourse(courseId);
-		if(course == null) {
-			return Response.serverError().status(Status.NOT_FOUND).build();
-		} else if (!isAuthorEditor(course, httpRequest)) {
+	public Response findEditorTreeModelById(@Context HttpServletRequest httpRequest, @Context Request request) {
+		if (!isAuthorEditor(course, httpRequest)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		VFSItem editorModelItem = course.getCourseBaseContainer().resolve("editortreemodel.xml");
@@ -498,26 +439,18 @@ public class CourseWebService {
 	/**
 	 * Get all owners and authors of the course
 	 * @response.representation.200.qname {http://www.example.com}userVO
-   * @response.representation.200.mediaType application/xml, application/json
-   * @response.representation.200.doc The array of authors
+	 * @response.representation.200.mediaType application/xml, application/json
+	 * @response.representation.200.doc The array of authors
 	 * @response.representation.401.doc The roles of the authenticated user are not sufficient
-   * @response.representation.404.doc The course not found
-	 * @param courseId The course resourceable's id
+	 * @response.representation.404.doc The course not found
 	 * @param httpRequest The HTTP request
 	 * @return It returns an array of <code>UserVO</code>
 	 */
 	@GET
 	@Path("authors")
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
-	public Response getAuthors(@PathParam("courseId") Long courseId, @Context HttpServletRequest httpRequest) {
-		if(!isAuthor(httpRequest)) {
-			return Response.serverError().status(Status.UNAUTHORIZED).build();
-		}
-		
-		OLATResourceable course = getCourseOLATResource(courseId);
-		if(course == null) {
-			return Response.serverError().status(Status.NOT_FOUND).build();
-		} else if (!isAuthorEditor(course, httpRequest)) {
+	public Response getAuthors(@Context HttpServletRequest httpRequest) {
+		if (!isAuthorEditor(course, httpRequest)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
@@ -539,11 +472,10 @@ public class CourseWebService {
 	/**
 	 * Get this specific author and owner of the course
 	 * @response.representation.200.qname {http://www.example.com}userVO
-   * @response.representation.200.mediaType application/xml, application/json
-   * @response.representation.200.doc The author
+	 * @response.representation.200.mediaType application/xml, application/json
+	 * @response.representation.200.doc The author
 	 * @response.representation.401.doc The roles of the authenticated user are not sufficient
-   * @response.representation.404.doc The course not found or the user is not an onwer or author of the course
-	 * @param courseId The course resourceable's id
+	 * @response.representation.404.doc The course not found or the user is not an onwer or author of the course
 	 * @param identityKey The user identifier
 	 * @param httpRequest The HTTP request
 	 * @return It returns an <code>UserVO</code>
@@ -551,23 +483,15 @@ public class CourseWebService {
 	@GET
 	@Path("authors/{identityKey}")
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
-	public Response getAuthor(@PathParam("courseId") Long courseId, @PathParam("identityKey") Long identityKey,
+	public Response getAuthor(@PathParam("identityKey") Long identityKey,
 			@Context HttpServletRequest httpRequest) {
-		if(!isAuthor(httpRequest)) {
-			return Response.serverError().status(Status.UNAUTHORIZED).build();
-		}
-		
-		OLATResourceable course = getCourseOLATResource(courseId);
-		if(course == null) {
-			return Response.serverError().status(Status.NOT_FOUND).build();
-		} else if (!isAuthorEditor(course, httpRequest)) {
+		if (!isAuthorEditor(course, httpRequest)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
 		RepositoryManager rm = RepositoryManager.getInstance();
 		RepositoryService repositoryService = CoreSpringFactory.getImpl(RepositoryService.class);
 		RepositoryEntry repositoryEntry = rm.lookupRepositoryEntry(course, true);
-
 		
 		BaseSecurity securityManager = BaseSecurityManager.getInstance();
 		SecurityGroup authorGroup = securityManager.findSecurityGroupByName(Constants.GROUP_AUTHORS);
@@ -583,26 +507,18 @@ public class CourseWebService {
 	
 	/**
 	 * Add an owner and author to the course
-   * @response.representation.200.doc The user is an author and owner of the course
+	 * @response.representation.200.doc The user is an author and owner of the course
 	 * @response.representation.401.doc The roles of the authenticated user are not sufficient
-   * @response.representation.404.doc The course or the user not found
-	 * @param courseId The course resourceable's id
+	 * @response.representation.404.doc The course or the user not found
 	 * @param identityKey The user identifier
 	 * @param httpRequest The HTTP request
 	 * @return It returns 200  if the user is added as owner and author of the course
 	 */
 	@PUT
 	@Path("authors/{identityKey}")
-	public Response addAuthor(@PathParam("courseId") Long courseId, @PathParam("identityKey") Long identityKey,
+	public Response addAuthor(@PathParam("identityKey") Long identityKey,
 			@Context HttpServletRequest httpRequest) {
-		if(!isAuthor(httpRequest)) {
-			return Response.serverError().status(Status.UNAUTHORIZED).build();
-		}
-		
-		OLATResourceable course = getCourseOLATResource(courseId);
-		if(course == null) {
-			return Response.serverError().status(Status.NOT_FOUND).build();
-		}  else if (!isAuthorEditor(course, httpRequest)) {
+		if (!isAuthorEditor(course, httpRequest)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 
@@ -634,10 +550,9 @@ public class CourseWebService {
 	
 	/**
 	 * Remove an owner and author to the course
-   * @response.representation.200.doc The user was successfully removed as owner of the course
+	 * @response.representation.200.doc The user was successfully removed as owner of the course
 	 * @response.representation.401.doc The roles of the authenticated user are not sufficient
-   * @response.representation.404.doc The course or the user not found
-	 * @param courseId The course resourceable's id
+	 * @response.representation.404.doc The course or the user not found
 	 * @param identityKey The user identifier
 	 * @param httpRequest The HTTP request
 	 * @return It returns 200  if the user is removed as owner of the course
@@ -645,16 +560,9 @@ public class CourseWebService {
 	@DELETE
 	@Path("authors/{identityKey}")
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
-	public Response removeAuthor(@PathParam("courseId") Long courseId, @PathParam("identityKey") Long identityKey,
+	public Response removeAuthor(@PathParam("identityKey") Long identityKey,
 			@Context HttpServletRequest httpRequest) {
-		if(!isAuthor(httpRequest)) {
-			return Response.serverError().status(Status.UNAUTHORIZED).build();
-		}
-		
-		OLATResourceable course = getCourseOLATResource(courseId);
-		if(course == null) {
-			return Response.serverError().status(Status.NOT_FOUND).build();
-		} else if (!isAuthorEditor(course, httpRequest)) {
+		if (!isAuthorEditor(course, httpRequest)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
@@ -677,26 +585,18 @@ public class CourseWebService {
 	
 	/**
 	 * Add a coach to the course
-   * @response.representation.200.doc The user is a coach of the course
+	 * @response.representation.200.doc The user is a coach of the course
 	 * @response.representation.401.doc The roles of the authenticated user are not sufficient
-   * @response.representation.404.doc The course or the user not found
-	 * @param courseId The course resourceable's id
+	 * @response.representation.404.doc The course or the user not found
 	 * @param identityKey The user identifier
 	 * @param httpRequest The HTTP request
 	 * @return It returns 200  if the user is added as coach of the course
 	 */
 	@PUT
 	@Path("tutors/{identityKey}")
-	public Response addCoach(@PathParam("courseId") Long courseId, @PathParam("identityKey") Long identityKey,
+	public Response addCoach(@PathParam("identityKey") Long identityKey,
 			@Context HttpServletRequest httpRequest) {
-		if(!isAuthor(httpRequest)) {
-			return Response.serverError().status(Status.UNAUTHORIZED).build();
-		}
-		
-		OLATResourceable course = getCourseOLATResource(courseId);
-		if(course == null) {
-			return Response.serverError().status(Status.NOT_FOUND).build();
-		}  else if (!isAuthorEditor(course, httpRequest)) {
+		if (!isAuthorEditor(course, httpRequest)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 
@@ -721,26 +621,18 @@ public class CourseWebService {
 	
 	/**
 	 * Add an participant to the course
-   * @response.representation.200.doc The user is a participant of the course
+	 * @response.representation.200.doc The user is a participant of the course
 	 * @response.representation.401.doc The roles of the authenticated user are not sufficient
-   * @response.representation.404.doc The course or the user not found
-	 * @param courseId The course resourceable's id
+	 * @response.representation.404.doc The course or the user not found
 	 * @param identityKey The user identifier
 	 * @param httpRequest The HTTP request
 	 * @return It returns 200  if the user is added as owner and author of the course
 	 */
 	@PUT
 	@Path("participants/{identityKey}")
-	public Response addParticipant(@PathParam("courseId") Long courseId, @PathParam("identityKey") Long identityKey,
+	public Response addParticipant(@PathParam("identityKey") Long identityKey,
 			@Context HttpServletRequest httpRequest) {
-		if(!isAuthor(httpRequest)) {
-			return Response.serverError().status(Status.UNAUTHORIZED).build();
-		}
-		
-		OLATResourceable course = getCourseOLATResource(courseId);
-		if(course == null) {
-			return Response.serverError().status(Status.NOT_FOUND).build();
-		}  else if (!isAuthorEditor(course, httpRequest)) {
+		if (!isAuthorEditor(course, httpRequest)) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 
@@ -763,21 +655,10 @@ public class CourseWebService {
 		return Response.ok().build();
 	}
 	
-	private OLATResource getCourseOLATResource(Long courseId) {
-		String typeName = OresHelper.calculateTypeName(CourseModule.class);
-		OLATResource ores = OLATResourceManager.getInstance().findResourceable(courseId, typeName);
-		if(ores == null && Settings.isJUnitTest()) {
-			//hack for the BGContextManagerImpl which load the course
-			ores = OLATResourceManager.getInstance().findResourceable(courseId, "junitcourse");
-		}
-		return ores;
-	}
-	
-	private RepositoryEntry getCourseEntry(OLATResource courseResource) {
-		return RepositoryManager.getInstance().lookupRepositoryEntry(courseResource, false);
-	}
-	
 	public static boolean isCourseAccessible(ICourse course, boolean authorRightsMandatory, HttpServletRequest request) {
+		if(isAdmin(request)) {
+			return true;
+		}
 		if(authorRightsMandatory && !isAuthor(request)) {
 			return false;
 		}
@@ -791,14 +672,4 @@ public class CourseWebService {
 		}
 		return false;
 	}
-	
-	public static ICourse loadCourse(Long courseId) {
-		try {
-			ICourse course = CourseFactory.loadCourse(courseId);
-			return course;
-		} catch(Exception ex) {
-			log.error("cannot load course with id: " + courseId, ex);
-			return null;
-		}
-	}
 }
diff --git a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
index 0d2516d4cc53170956532dd690fca544a6a99dfd..78151affb0949b4a6bc750000531d0eb60c973b7 100644
--- a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
@@ -50,7 +50,6 @@ import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.persistence.DBFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.gui.control.Controller;
-import org.olat.core.helpers.Settings;
 import org.olat.core.id.Identity;
 import org.olat.core.id.OLATResourceable;
 import org.olat.core.id.Roles;
@@ -147,7 +146,6 @@ public class CoursesWebService {
 			@Context HttpServletRequest httpRequest, @Context Request request) {
 		RepositoryManager rm = RepositoryManager.getInstance();
 
-		//fxdiff VCRP-1,2: access control of resources
 		Roles roles = getRoles(httpRequest);
 		Identity identity = getIdentity(httpRequest);
 		SearchRepositoryEntryParameters params = new SearchRepositoryEntryParameters(identity, roles, CourseModule.getCourseTypeName());
@@ -180,7 +178,7 @@ public class CoursesWebService {
 		int count=0;
 		for (RepositoryEntry repoEntry : repoEntries) {
 			try {
-				ICourse course = CourseWebService.loadCourse(repoEntry.getOlatResource().getResourceableId());
+				ICourse course = loadCourse(repoEntry.getOlatResource().getResourceableId());
 				voList.add(ObjectFactory.get(repoEntry, course));
 				if(count % 33 == 0) {
 					DBFactory.getInstance().commitAndCloseSession();
@@ -197,13 +195,10 @@ public class CoursesWebService {
 	
 	@Path("{courseId}")
 	public CourseWebService getCourse(@PathParam("courseId") Long courseId) {
-		OLATResource ores = getCourseOLATResource(courseId);
-		if(ores == null) return null;
-		ICourse course = CourseFactory.loadCourse(courseId);
+		ICourse course = loadCourse(courseId);
 		if(course == null) return null;
-		CourseWebService courseWs = new CourseWebService(ores, course);
-		
-		return courseWs;
+		OLATResource ores = course.getCourseEnvironment().getCourseGroupManager().getCourseResource();
+		return new CourseWebService(ores, course);
 	}
 
 	/**
@@ -328,16 +323,6 @@ public class CoursesWebService {
 		return Response.ok(vo).build();
 	}
 	
-	private OLATResource getCourseOLATResource(Long courseId) {
-		String typeName = OresHelper.calculateTypeName(CourseModule.class);
-		OLATResource ores = OLATResourceManager.getInstance().findResourceable(courseId, typeName);
-		if(ores == null && Settings.isJUnitTest()) {
-			//hack for the BGContextManagerImpl which load the course
-			ores = OLATResourceManager.getInstance().findResourceable(courseId, "junitcourse");
-		}
-		return ores;
-	}
-	
 	public static boolean isCourseAccessible(ICourse course, boolean authorRightsMandatory, HttpServletRequest request) {
 		if(authorRightsMandatory && !isAuthor(request)) {
 			return false;
@@ -363,7 +348,6 @@ public class CoursesWebService {
 		}
 	}
 	
-	
 	public static ICourse importCourse(UserRequest ureq, Identity identity, File fCourseImportZIP,
 			String displayName, String softKey, int access, boolean membersOnly) {