diff --git a/src/main/java/org/olat/commons/calendar/restapi/CalWebService.java b/src/main/java/org/olat/commons/calendar/restapi/CalWebService.java
index 76dc5ebd9ab22fc69c3a4d8473906fde083c7042..de557eefbd2d26d5b0b01e7aa796713b3f8296d5 100644
--- a/src/main/java/org/olat/commons/calendar/restapi/CalWebService.java
+++ b/src/main/java/org/olat/commons/calendar/restapi/CalWebService.java
@@ -31,7 +31,9 @@ import java.util.Collections;
 import java.util.List;
 import java.util.UUID;
 
+import javax.management.DescriptorKey;
 import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.ApplicationPath;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
 import javax.ws.rs.DefaultValue;
@@ -54,6 +56,19 @@ import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.util.StringHelper;
+import org.olat.restapi.support.vo.RepositoryEntryVO;
+import org.springframework.context.annotation.Description;
+
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.info.License;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.info.Info;
 
 /**
  * 
@@ -61,6 +76,9 @@ import org.olat.core.util.StringHelper;
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
+
+
+@Tag (name = "Calendar")
 public class CalWebService {
 	
 	private final KalendarRenderWrapper calendar;
@@ -71,9 +89,20 @@ public class CalWebService {
 	
 	@GET
 	@Path("events")
+	@Operation(summary = "List events from a calendar.", description = "Returns list of events from a specific calendar.")
+	@ApiResponses({
+			@ApiResponse(responseCode = "200", description = "Request was successful.",
+				content = {
+					@Content(mediaType = "application/json", schema = @Schema(implementation = EventVO.class)),
+					@Content(mediaType = "application/xml", schema = @Schema(implementation = EventVO.class))
+				} 
+			),
+			@ApiResponse(responseCode = "401", description = "Not authorized."),
+			@ApiResponse(responseCode = "404", description = "Not found.")}
+	)	
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
-	public Response getEventsByCalendar(@QueryParam("start") @DefaultValue("0") Integer start,
-			@QueryParam("limit") @DefaultValue("25") Integer limit,
+	public Response getEventsByCalendar(@QueryParam("start")@Parameter(description = "Set the date for the earliest event.") @DefaultValue("0") Integer start,
+			@QueryParam("limit")  @Parameter(description = "Limit the amount of events to be returned.") @DefaultValue("25") Integer limit,
 			@QueryParam("onlyFuture") @DefaultValue("false") Boolean onlyFuture,
 			@Context HttpServletRequest httpRequest, @Context Request request) {
 		
@@ -100,6 +129,7 @@ public class CalWebService {
 	
 	@DELETE
 	@Path("events/{eventId}")
+	@Operation(summary = "Delete specific event.", description = "Deletes a specific event in a calendar.")
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	@Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response deleteEventByCalendar(@PathParam("eventId") String eventId,
@@ -133,6 +163,17 @@ public class CalWebService {
 	
 	@PUT
 	@Path("event")
+	@Operation(summary = "Put a specific event.", description = "Puts a specific event in a specific calendar.")
+	@ApiResponses(value = {
+			@ApiResponse(responseCode = "200",
+				content = {
+					@Content(mediaType = "application/json", schema = @Schema(implementation = EventVO.class)),
+					@Content(mediaType = "application/xml", schema = @Schema(implementation = EventVO.class))
+				}
+			),
+			@ApiResponse(responseCode = "401", description = "Not authorized."),
+			@ApiResponse(responseCode = "404", description = "Not found.")}
+		)
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response putEventByCalendar(EventVO event, @Context HttpServletRequest httpRequest) {
@@ -142,6 +183,17 @@ public class CalWebService {
 	
 	@PUT
 	@Path("events")
+	@Operation(summary = "Put specific events.", description = "Puts specific events in a specific calendar.")
+	@ApiResponses(value = {
+			@ApiResponse(responseCode = "200",
+				content = {
+					@Content(mediaType = "application/json", schema = @Schema(implementation = EventVO[].class)),
+					@Content(mediaType = "application/xml", schema = @Schema(implementation = EventVO[].class))
+				}
+			),
+			@ApiResponse(responseCode = "401", description = "Not authorized."),
+			@ApiResponse(responseCode = "404", description = "Not found.")}
+		)
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response putEventsByCalendar(EventVO[] eventArray, @Context HttpServletRequest httpRequest) {
@@ -154,6 +206,17 @@ public class CalWebService {
 	
 	@POST
 	@Path("event")
+	@Operation(summary = "Post a specific event.", description = "Posts a specific event in a specific calendar.")
+	@ApiResponses(value = {
+			@ApiResponse(responseCode = "200",
+				content = {
+					@Content(mediaType = "application/json", schema = @Schema(implementation = EventVO.class)),
+					@Content(mediaType = "application/xml", schema = @Schema(implementation = EventVO.class))
+				}
+			),
+			@ApiResponse(responseCode = "401", description = "Not authorized."),
+			@ApiResponse(responseCode = "404", description = "Not found.")}
+		)
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	@Consumes({MediaType.APPLICATION_FORM_URLENCODED, MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response postEventByCalendar(EventVO event, @Context HttpServletRequest httpRequest) {
@@ -163,6 +226,17 @@ public class CalWebService {
 	
 	@POST
 	@Path("events")
+	@Operation(summary = "Post specific events.", description = "Posts specific events in a specific calendar.")
+	@ApiResponses(value = {
+			@ApiResponse(responseCode = "200",
+				content = {
+					@Content(mediaType = "application/json", schema = @Schema(implementation = EventVO[].class)),
+					@Content(mediaType = "application/xml", schema = @Schema(implementation = EventVO[].class))
+				}
+			),
+			@ApiResponse(responseCode = "401", description = "Not authorized."),
+			@ApiResponse(responseCode = "404", description = "Not found.")}
+		)
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response postEventsByCalendar(EventVO[] eventArray, @Context HttpServletRequest httpRequest) {
diff --git a/src/main/java/org/olat/commons/calendar/restapi/UserCalendarWebService.java b/src/main/java/org/olat/commons/calendar/restapi/UserCalendarWebService.java
index 46ea4e60d737457dfd4819a67a6ce91321f83b3f..b1e2b9220bbed4a4010bdc8900e466016f43eae9 100644
--- a/src/main/java/org/olat/commons/calendar/restapi/UserCalendarWebService.java
+++ b/src/main/java/org/olat/commons/calendar/restapi/UserCalendarWebService.java
@@ -42,6 +42,7 @@ import javax.ws.rs.core.Request;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 
+import org.apache.logging.log4j.Logger;
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.OrganisationRoles;
 import org.olat.collaboration.CollaborationManager;
@@ -56,7 +57,6 @@ import org.olat.core.gui.UserRequest;
 import org.olat.core.id.Identity;
 import org.olat.core.id.IdentityEnvironment;
 import org.olat.core.id.Roles;
-import org.apache.logging.log4j.Logger;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.nodes.INode;
 import org.olat.core.util.tree.Visitor;
@@ -81,12 +81,21 @@ import org.olat.restapi.security.RestSecurityHelper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  */
+@Tag(name = "Users")
 @Component
-@Path("users/{identityKey}/calendars")
+@Path("/users/{identityKey}/calendars")
 public class UserCalendarWebService {
 	
 	private static final Logger log = Tracing.createLoggerFor(UserCalendarWebService.class);
@@ -106,6 +115,17 @@ public class UserCalendarWebService {
 	
 	
 	@GET
+	@Tag(name = "Calendar")
+	@Operation(summary = "List calendars of a specific user.", description = "Returns list of calendars of a specific user. Will always return the administrator's calendars for administrators.")
+	@ApiResponses({
+		@ApiResponse(responseCode = "200", description = "Request was successful.",
+			content = {
+				@Content(mediaType = "application/json", schema = @Schema(implementation = CalendarVO.class)),
+				@Content(mediaType = "application/xml", schema = @Schema(implementation = CalendarVO.class))
+			}, links = {}),
+		@ApiResponse(responseCode = "401", description = "Not authorized."),
+		@ApiResponse(responseCode = "404", description = "Not found.")}
+		)
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response getCalendars(@PathParam("identityKey") Long identityKey, @Context HttpServletRequest httpRequest) {
 		UserRequest ureq = getUserRequest(httpRequest);
@@ -153,10 +173,21 @@ public class UserCalendarWebService {
 
 	@GET
 	@Path("events")
+	@Operation(summary = "List all events.", description = "Returns list of all events in for a specific user.")
+	@ApiResponses({
+		@ApiResponse(responseCode = "200", description = "Request was successful.",
+			content = {
+				@Content(mediaType = "application/json", schema = @Schema(implementation = EventVO[].class)),
+				@Content(mediaType = "application/xml", schema = @Schema(implementation = EventVO[].class))
+			} 
+		),
+		@ApiResponse(responseCode = "401", description = "Not authorized."),
+		@ApiResponse(responseCode = "404", description = "Not found.")}
+)	
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response getEvents(@PathParam("identityKey") Long identityKey,
-			@QueryParam("start") @DefaultValue("0") Integer start,
-			@QueryParam("limit") @DefaultValue("25") Integer limit,
+			@QueryParam("start")  @Parameter(description = "Set the date for the earliest event.")@DefaultValue("0") Integer start,
+			@QueryParam("limit")  @Parameter(description = "Limit the amount of events to be returned.") @DefaultValue("25") Integer limit,
 			@QueryParam("onlyFuture") @DefaultValue("false") Boolean onlyFuture,
 			@Context HttpServletRequest httpRequest, @Context Request request) {
 		
diff --git a/src/main/java/org/olat/commons/info/restapi/InfoMessagesWebService.java b/src/main/java/org/olat/commons/info/restapi/InfoMessagesWebService.java
index 1a1f47f4c977783f90a04b6da035d811b5d33cab..6d2cd4639a111f73b45de99ebb3356cf02c5500b 100644
--- a/src/main/java/org/olat/commons/info/restapi/InfoMessagesWebService.java
+++ b/src/main/java/org/olat/commons/info/restapi/InfoMessagesWebService.java
@@ -48,6 +48,8 @@ import org.olat.core.util.resource.OresHelper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Description:<br>
@@ -56,6 +58,7 @@ import org.springframework.stereotype.Component;
  * Initial Date:  29 jul. 2010 <br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  */
+@Tag(name = "Infomessages")
 @Component
 @Path("infomessages")
 public class InfoMessagesWebService {
diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/restapi/Office365WebService.java b/src/main/java/org/olat/core/commons/services/doceditor/office365/restapi/Office365WebService.java
index ff2ec473412eec2055efad719507514f96eba483..7120b931dd7a727c949ba0d69fb821efd87d3293 100644
--- a/src/main/java/org/olat/core/commons/services/doceditor/office365/restapi/Office365WebService.java
+++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/restapi/Office365WebService.java
@@ -55,6 +55,8 @@ import org.springframework.stereotype.Service;
 import com.fasterxml.jackson.core.JsonProcessingException;
 import com.fasterxml.jackson.databind.ObjectMapper;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * The simplest way to test this class is to use the interactice WOPI Validation application.
  * https://wopi.readthedocs.io/en/latest/build_test_ship/validator.html#interactive-wopi-validation
@@ -63,6 +65,7 @@ import com.fasterxml.jackson.databind.ObjectMapper;
  * @author uhensler, urs.hensler@frentix.com, http://www.frentix.com
  *
  */
+@Tag(name = "Office365")
 @Service
 @Path("/office365/wopi/files/{fileId}")
 public class Office365WebService {
diff --git a/src/main/java/org/olat/course/assessment/restapi/EfficiencyStatementWebService.java b/src/main/java/org/olat/course/assessment/restapi/EfficiencyStatementWebService.java
index 5bf1f7f3aed8d204ebcfcc97bb24280667f6a147..52404a8997b712d6ee90c5cbc0f7b68bdbfa38ee 100644
--- a/src/main/java/org/olat/course/assessment/restapi/EfficiencyStatementWebService.java
+++ b/src/main/java/org/olat/course/assessment/restapi/EfficiencyStatementWebService.java
@@ -48,12 +48,15 @@ import org.olat.resource.OLATResourceManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Initial date: 17.11.2014<br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
+@Tag(name = "Repo")
 @Component
 @Path("repo/courses/{resourceKey}/statements")
 public class EfficiencyStatementWebService {
diff --git a/src/main/java/org/olat/course/certificate/restapi/CertificationWebService.java b/src/main/java/org/olat/course/certificate/restapi/CertificationWebService.java
index 79cb582b9d637064c9a43fa7fe074b039814bf8e..985cc063ec81506e0c5244b6cf546f43b228d680 100644
--- a/src/main/java/org/olat/course/certificate/restapi/CertificationWebService.java
+++ b/src/main/java/org/olat/course/certificate/restapi/CertificationWebService.java
@@ -64,12 +64,15 @@ import org.olat.restapi.support.ObjectFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Initial date: 17.11.2014<br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
+@Tag(name = "Repo")
 @Component
 @Path("repo/courses/{resourceKey}/certificates")
 public class CertificationWebService {
diff --git a/src/main/java/org/olat/course/db/restapi/CourseDbWebService.java b/src/main/java/org/olat/course/db/restapi/CourseDbWebService.java
index 6087a1f2844f716d5d09a765a343608321211638..3ad4ae0287fd0a60720484ed5577aefdde8cedff 100644
--- a/src/main/java/org/olat/course/db/restapi/CourseDbWebService.java
+++ b/src/main/java/org/olat/course/db/restapi/CourseDbWebService.java
@@ -54,6 +54,8 @@ import org.olat.restapi.support.vo.KeyValuePair;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * Description:<br>
  * Access the custom dbs of a course
@@ -62,6 +64,7 @@ import org.springframework.stereotype.Component;
  * Initial Date:	 *7 apr. 2010 <br>
  * @author srosse, stephane.rosse@frentix.com
  */
+@Tag(name = "Repo")
 @Component
 @Path("repo/courses/{courseId}/db/{category}")
 public class CourseDbWebService {
diff --git a/src/main/java/org/olat/course/nodes/co/COWebService.java b/src/main/java/org/olat/course/nodes/co/COWebService.java
index 97a616beba4e86ff104d03ad1c21ff5224c3f726..75a3099195bdae6f267d6ee56cfae5075a7ab71a 100755
--- a/src/main/java/org/olat/course/nodes/co/COWebService.java
+++ b/src/main/java/org/olat/course/nodes/co/COWebService.java
@@ -65,6 +65,8 @@ import org.olat.modules.ModuleConfiguration;
 import org.olat.restapi.repository.course.AbstractCourseNodeWebService;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Description:<br>
@@ -75,6 +77,7 @@ import org.springframework.stereotype.Component;
  * @author srosse, stephane.rosse@frentix.com
  * @author Dirk Furrer
  */
+@Tag(name = "Repo")
 @Component
 @Path("repo/courses/{courseId}/elements/contact")
 public class COWebService extends AbstractCourseNodeWebService {
diff --git a/src/main/java/org/olat/course/nodes/en/ENWebService.java b/src/main/java/org/olat/course/nodes/en/ENWebService.java
index cba0972364a642302f7b53133d12b5f30c884971..94dba4481a0297a99032196d0a6a5e57f91e6159 100644
--- a/src/main/java/org/olat/course/nodes/en/ENWebService.java
+++ b/src/main/java/org/olat/course/nodes/en/ENWebService.java
@@ -54,6 +54,8 @@ import org.olat.restapi.support.vo.GroupVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Description:<br>
@@ -63,6 +65,7 @@ import org.springframework.stereotype.Component;
  * Initial Date:  10 mai 2010 <br>
  * @author srosse, stephane.rosse@frentix.com
  */
+@Tag(name = "Repo")
 @Component
 @Path("repo/courses/{courseId}/elements/enrollment")
 public class ENWebService extends AbstractCourseNodeWebService {
diff --git a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementTypesWebService.java b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementTypesWebService.java
index 75d9f689d6ba2af18b9ba29b00ab83d4ca74a98b..503ea870236e1ff357d0cae60c032c6e82a23a63 100644
--- a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementTypesWebService.java
+++ b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumElementTypesWebService.java
@@ -45,6 +45,8 @@ import org.olat.modules.curriculum.model.CurriculumElementTypeRefImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * The security check is done by the curriculums web service.
  * 
@@ -52,6 +54,7 @@ import org.springframework.stereotype.Component;
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
+@Tag(name = "Curriculum")
 @Component
 @Path("curriculum/types")
 public class CurriculumElementTypesWebService {
diff --git a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumsWebService.java b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumsWebService.java
index 0ab4beac467e5578bd3e82c077ee9db8a90657ee..af609ab55d4a0843f0a2d44591f2758f7bda0be1 100644
--- a/src/main/java/org/olat/modules/curriculum/restapi/CurriculumsWebService.java
+++ b/src/main/java/org/olat/modules/curriculum/restapi/CurriculumsWebService.java
@@ -62,12 +62,15 @@ import org.olat.user.restapi.UserVOFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Initial date: 15 mai 2018<br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
+@Tag(name = "Curriculum")
 @Component
 @Path("curriculum")
 public class CurriculumsWebService {
diff --git a/src/main/java/org/olat/modules/docpool/restapi/DocumentPoolModuleWebService.java b/src/main/java/org/olat/modules/docpool/restapi/DocumentPoolModuleWebService.java
index eb85456fd84b10d43eaa519bf29bfcf121560055..8c7a8d3b7575b5bff6097261abdd82f3eca83a3e 100644
--- a/src/main/java/org/olat/modules/docpool/restapi/DocumentPoolModuleWebService.java
+++ b/src/main/java/org/olat/modules/docpool/restapi/DocumentPoolModuleWebService.java
@@ -41,12 +41,15 @@ import org.olat.modules.taxonomy.model.TaxonomyRefImpl;
 import org.olat.modules.taxonomy.restapi.TaxonomyWebService;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Initial date: 5 Oct 2017<br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
+@Tag(name = "Docpool")
 @Component
 @Path("docpool")
 public class DocumentPoolModuleWebService {
diff --git a/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java b/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java
index 4a5d5c3999b19b726d899f626fc523a63f7e5b65..bf00414e0ce0b0f9939843893b9f136166d101d9 100644
--- a/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java
+++ b/src/main/java/org/olat/modules/fo/restapi/ForumCourseNodeWebService.java
@@ -76,6 +76,8 @@ import org.olat.restapi.security.RestSecurityHelper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Description:<br>
@@ -85,6 +87,7 @@ import org.springframework.stereotype.Component;
  * Initial Date:  20.12.2010 <br>
  * @author skoeber
  */
+@Tag(name = "Repo")
 @Component
 @Path("repo/courses/{courseId}/elements/forum")
 public class ForumCourseNodeWebService extends AbstractCourseNodeWebService {
diff --git a/src/main/java/org/olat/modules/fo/restapi/ForumImportWebService.java b/src/main/java/org/olat/modules/fo/restapi/ForumImportWebService.java
index 402cf3e502932e5f41f62aadc4f09b04284de353..5cee8bd66aab542e65e92479eb277eac1b9a9054 100644
--- a/src/main/java/org/olat/modules/fo/restapi/ForumImportWebService.java
+++ b/src/main/java/org/olat/modules/fo/restapi/ForumImportWebService.java
@@ -33,6 +33,9 @@ import org.olat.modules.fo.manager.ForumManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Description:<br>
@@ -42,7 +45,9 @@ import org.springframework.stereotype.Component;
  * Initial Date:  26 aug. 2010 <br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  */
+@Tag(name = "Repo")
 @Component
+
 @Path("repo/forums")
 public class ForumImportWebService {
 	
diff --git a/src/main/java/org/olat/modules/fo/restapi/ForumWebService.java b/src/main/java/org/olat/modules/fo/restapi/ForumWebService.java
index 3b9e58be8acc1c1df43e4ba8e34975c3f3e92013..529992c944852172f5f7c633c28cc6e3414b489a 100644
--- a/src/main/java/org/olat/modules/fo/restapi/ForumWebService.java
+++ b/src/main/java/org/olat/modules/fo/restapi/ForumWebService.java
@@ -60,6 +60,7 @@ import org.apache.commons.io.IOUtils;
 import org.olat.basesecurity.BaseSecurity;
 import org.olat.basesecurity.OrganisationRoles;
 import org.olat.basesecurity.model.IdentityRefImpl;
+import org.olat.commons.calendar.restapi.CalendarVO;
 import org.olat.core.commons.services.vfs.restapi.VFSStreamingOutput;
 import org.olat.core.gui.media.ServletUtil;
 import org.olat.core.id.Identity;
@@ -85,6 +86,13 @@ import org.olat.restapi.support.vo.File64VO;
 import org.olat.restapi.support.vo.FileVO;
 import org.springframework.beans.factory.annotation.Autowired;
 
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Description:<br>
@@ -94,6 +102,8 @@ import org.springframework.beans.factory.annotation.Autowired;
  * Initial Date:  20 apr. 2010 <br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  */
+
+@Tag (name =  "Repo")
 public class ForumWebService {
 	
 	private static final Logger log = Tracing.createLoggerFor(ForumWebService.class);
@@ -154,6 +164,8 @@ public class ForumWebService {
 	 */
 	@GET
 	@Path("threads")
+	@Operation(summary = "Get threads",
+	description = "Retrieves the threads in the forum.")
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response getThreads(@QueryParam("start") @DefaultValue("0") Integer start,
 			@QueryParam("limit") @DefaultValue("25") Integer limit,  @QueryParam("orderBy") @DefaultValue("creationDate") String orderBy,
@@ -197,6 +209,8 @@ public class ForumWebService {
 	 */
 	@POST
 	@Path("threads")
+	@Operation(summary = "Post threads",
+	description = "Creates a new thread in the forum of the course node.")
 	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response newThreadToForumPost(@FormParam("title") String title,
@@ -221,6 +235,8 @@ public class ForumWebService {
 	 */
 	@PUT
 	@Path("threads")
+	@Operation(summary = "Put threads",
+	description = "Creates a new thread in the forum of the course node.")
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response newThreadToForum(@QueryParam("title") String title,
 			@QueryParam("body") String body, @QueryParam("authorKey") Long authorKey,
@@ -258,6 +274,8 @@ public class ForumWebService {
 	 */
 	@GET
 	@Path("posts/{threadKey}")
+	@Operation(summary = "Get posts",
+	description = "Retrieves the messages in the thread.")
 	public Response getMessages( @PathParam("threadKey") Long threadKey, @QueryParam("start") @DefaultValue("0") Integer start,
 			@QueryParam("limit") @DefaultValue("25") Integer limit, @QueryParam("orderBy") @DefaultValue("creationDate") String orderBy,
 			@QueryParam("asc") @DefaultValue("true") Boolean asc, @Context HttpServletRequest httpRequest, @Context UriInfo uriInfo,
@@ -302,6 +320,8 @@ public class ForumWebService {
 	 */
 	@POST
 	@Path("posts/{messageKey}")
+	@Operation(summary = "Post posts",
+	description = "Creates a new reply in the forum of the course node.")
 	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response replyToPostPost(@PathParam("messageKey") Long messageKey, @FormParam("title") String title,
@@ -328,6 +348,8 @@ public class ForumWebService {
 	 */
 	@PUT
 	@Path("posts/{messageKey}")
+	@Operation(summary = "Put posts",
+	description = "Creates a new reply in the forum of the course node.")
 	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response replyToPost(@PathParam("messageKey") Long messageKey, @QueryParam("title") String title,
@@ -352,6 +374,8 @@ public class ForumWebService {
 	 */
 	@PUT
 	@Path("posts/{messageKey}")
+	@Operation(summary = "Put posts",
+	description = "Creates a new reply in the forum of the course node.")
 	@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response replyToPost(@PathParam("messageKey") Long messageKey, ReplyVO reply,
@@ -416,6 +440,8 @@ public class ForumWebService {
 	 */
 	@GET
 	@Path("posts/{messageKey}/attachments")
+	@Operation(summary = "Get attachments",
+	description = "Retrieves the attachments of the message.")
 	@Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
 	public Response getAttachments(@PathParam("messageKey") Long messageKey, @Context UriInfo uriInfo) {
 		//load message
@@ -442,6 +468,8 @@ public class ForumWebService {
 	 * @return The attachment
 	 */
 	@GET
+	@Operation(summary = "Get attachment",
+	description = "Retrieves the attachment of the message.")
 	@Path("posts/{messageKey}/attachments/{filename}")
 	@Produces({"*/*", MediaType.APPLICATION_OCTET_STREAM})
 	public Response getAttachment(@PathParam("messageKey") Long messageKey, @PathParam("filename") String filename, 
@@ -495,6 +523,8 @@ public class ForumWebService {
 	 * @return Ok
 	 */
 	@POST
+	@Operation(summary = "Post attachment",
+	description = "Upload the attachment of a message, as parameter.")
 	@Path("posts/{messageKey}/attachments")
 	@Consumes(MediaType.MULTIPART_FORM_DATA)
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@@ -528,6 +558,8 @@ public class ForumWebService {
 	 * @return Ok
 	 */
 	@POST
+	@Operation(summary = "Post attachment",
+	description = "Upload the attachment of a message.")
 	@Path("posts/{messageKey}/attachments")
 	@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@@ -539,6 +571,8 @@ public class ForumWebService {
 	}
 	
 	@PUT
+	@Operation(summary = "Put attachment",
+	description = "Upload the attachment of a message.")
 	@Path("posts/{messageKey}/attachments")
 	@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
diff --git a/src/main/java/org/olat/modules/fo/restapi/MyForumsWebService.java b/src/main/java/org/olat/modules/fo/restapi/MyForumsWebService.java
index 54cd4d1ba9c72800afb955530c7eef3e6f2a3fa3..d25e60c858fdc6e1abbaceadd855c6bf8e0563d3 100644
--- a/src/main/java/org/olat/modules/fo/restapi/MyForumsWebService.java
+++ b/src/main/java/org/olat/modules/fo/restapi/MyForumsWebService.java
@@ -69,6 +69,8 @@ import org.olat.restapi.group.LearningGroupWebService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Description:<br>
@@ -78,6 +80,7 @@ import org.springframework.stereotype.Component;
  *
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  */
+@Tag(name = "Users")
 @Component
 @Path("users/{identityKey}/forums")
 public class MyForumsWebService {
@@ -103,6 +106,7 @@ public class MyForumsWebService {
 	 * @param request The REST request
 	 * @return The files
 	 */
+
 	@Path("group/{groupKey}")
 	public ForumWebService getGroupForum(@PathParam("groupKey") Long groupKey, @Context HttpServletRequest request) {
 		if(groupKey == null) {
diff --git a/src/main/java/org/olat/modules/lecture/restapi/LectureBlocksRootWebService.java b/src/main/java/org/olat/modules/lecture/restapi/LectureBlocksRootWebService.java
index a5381d53a7cd148424130ab5fc1e0f960a099cdb..aff04053b93cc8bd45002c58f466ad3468d288a0 100644
--- a/src/main/java/org/olat/modules/lecture/restapi/LectureBlocksRootWebService.java
+++ b/src/main/java/org/olat/modules/lecture/restapi/LectureBlocksRootWebService.java
@@ -47,12 +47,15 @@ import org.olat.modules.lecture.model.LecturesBlockSearchParameters;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Initial date: 8 juin 2017<br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
+@Tag(name = "Repo")
 @Component
 @Path("repo/lectures")
 public class LectureBlocksRootWebService {
diff --git a/src/main/java/org/olat/modules/qpool/restapi/QuestionPoolWebService.java b/src/main/java/org/olat/modules/qpool/restapi/QuestionPoolWebService.java
index fd883474b01d90b99ddba12f62432f638e271fa3..b2e36d0529e4a683afb994c971ce72fa2b2c9427 100644
--- a/src/main/java/org/olat/modules/qpool/restapi/QuestionPoolWebService.java
+++ b/src/main/java/org/olat/modules/qpool/restapi/QuestionPoolWebService.java
@@ -58,12 +58,15 @@ import org.olat.user.restapi.UserVO;
 import org.olat.user.restapi.UserVOFactory;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Initial date: 8 sept. 2017<br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
+@Tag(name = "Qpool")
 @Component
 @Path("qpool/items")
 public class QuestionPoolWebService {
diff --git a/src/main/java/org/olat/modules/taxonomy/restapi/TaxonomyModuleWebService.java b/src/main/java/org/olat/modules/taxonomy/restapi/TaxonomyModuleWebService.java
index a93d458f6b61fffb65fa7db17e0617d3d06995af..9d21c2bfafec177ce2f80bb5246be8e15acce942 100644
--- a/src/main/java/org/olat/modules/taxonomy/restapi/TaxonomyModuleWebService.java
+++ b/src/main/java/org/olat/modules/taxonomy/restapi/TaxonomyModuleWebService.java
@@ -36,12 +36,15 @@ import org.olat.modules.taxonomy.TaxonomyService;
 import org.olat.modules.taxonomy.model.TaxonomyRefImpl;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Initial date: 5 Oct 2017<br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
+@Tag(name = "Taxonomy")
 @Path("taxonomy")
 @Component
 public class TaxonomyModuleWebService {
diff --git a/src/main/java/org/olat/modules/vitero/restapi/ViteroWebService.java b/src/main/java/org/olat/modules/vitero/restapi/ViteroWebService.java
index c3e58c97822bb53cc919401cf66d67c3d6b8484b..688e3c72df47c4cf4c65f10e6e1267c09d267b36 100644
--- a/src/main/java/org/olat/modules/vitero/restapi/ViteroWebService.java
+++ b/src/main/java/org/olat/modules/vitero/restapi/ViteroWebService.java
@@ -28,12 +28,15 @@ import org.olat.core.id.OLATResourceable;
 import org.olat.core.util.resource.OresHelper;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Initial date: 06.07.2015<br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
+@Tag(name = "Vitero")
 @Path("vitero")
 @Component
 public class ViteroWebService {
diff --git a/src/main/java/org/olat/modules/wiki/restapi/WikisWebService.java b/src/main/java/org/olat/modules/wiki/restapi/WikisWebService.java
index c953b4645d940b01aef379f35007d23b8130d10f..2dfeb157d5b775b33d51e0892121fa45f05c4e61 100644
--- a/src/main/java/org/olat/modules/wiki/restapi/WikisWebService.java
+++ b/src/main/java/org/olat/modules/wiki/restapi/WikisWebService.java
@@ -44,6 +44,8 @@ import org.olat.repository.model.SearchRepositoryEntryParameters;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * The Wikis Webservice.<br />
@@ -52,6 +54,7 @@ import org.springframework.stereotype.Component;
  * @author strentini, sergio.trentini@frentix.com, http://www.frentix.com
  * 
  */
+@Tag(name = "Repo")
 @Path("repo/wikis")
 @Component
 public class WikisWebService {
diff --git a/src/main/java/org/olat/restapi/_spring/restApiContext.xml b/src/main/java/org/olat/restapi/_spring/restApiContext.xml
index 0d6d34220ad9441f67ef99f31040da1464371f74..89f83d36cdb3d16a7eb957e3c7b6a4c528f227ba 100644
--- a/src/main/java/org/olat/restapi/_spring/restApiContext.xml
+++ b/src/main/java/org/olat/restapi/_spring/restApiContext.xml
@@ -11,6 +11,8 @@
 	<!-- CXF OpenApiFeature -->  
 	<bean id="openApiFeature" class="org.apache.cxf.jaxrs.openapi.OpenApiFeature">
 		<!-- customize some of the properties -->
+		<property name="useContextBasedConfig" value="true"/>
+		<property name="scan" value="false"/>
 	</bean>
 
 	<jaxrs:server address="/" basePackages="org.olat">
diff --git a/src/main/java/org/olat/restapi/api/ApiWebService.java b/src/main/java/org/olat/restapi/api/ApiWebService.java
index 49bd75a22a535ee18c521ef6318a2dedb8577bf6..985b84e17fce1300cf7f819f6ca0782b20410aa4 100644
--- a/src/main/java/org/olat/restapi/api/ApiWebService.java
+++ b/src/main/java/org/olat/restapi/api/ApiWebService.java
@@ -31,6 +31,8 @@ import javax.ws.rs.core.Response.Status;
 
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Description:<br>
@@ -40,6 +42,7 @@ import org.springframework.stereotype.Component;
  * Initial Date:  14 apr. 2010 <br>
  * @author srosse, stephane.rosse@frentix.com
  */
+@Tag(name = "API")
 @Path("api")
 @Component
 public class ApiWebService {
diff --git a/src/main/java/org/olat/restapi/group/LearningGroupWebService.java b/src/main/java/org/olat/restapi/group/LearningGroupWebService.java
index f719b2927aa865fef39f15ce80417034093e11d4..2c54ab08fe88ecd1a8572094903b2ced2f025802 100644
--- a/src/main/java/org/olat/restapi/group/LearningGroupWebService.java
+++ b/src/main/java/org/olat/restapi/group/LearningGroupWebService.java
@@ -85,6 +85,8 @@ import org.olat.user.restapi.UserVO;
 import org.olat.user.restapi.UserVOFactory;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 
 /**
  * Description:<br>
@@ -94,6 +96,7 @@ import org.springframework.stereotype.Component;
  * Initial Date:  23 mar. 2010 <br>
  * @author srosse, stephane.rosse@frentix.com
  */
+@Tag(name = "Groups")
 @Component
 @Path("groups")
 public class LearningGroupWebService {
diff --git a/src/main/java/org/olat/restapi/repository/CatalogWebService.java b/src/main/java/org/olat/restapi/repository/CatalogWebService.java
index 1290c6efc211a2e545cd824c51ee05e4eeec562a..38ed5c9f707374732a442a1f3f6634d818f203e3 100644
--- a/src/main/java/org/olat/restapi/repository/CatalogWebService.java
+++ b/src/main/java/org/olat/restapi/repository/CatalogWebService.java
@@ -77,6 +77,8 @@ import org.olat.user.restapi.UserVOFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * Description:<br>
  * A web service for the catalog
@@ -85,6 +87,7 @@ import org.springframework.stereotype.Component;
  * Initial Date:  5 may 2010 <br>
  * @author srosse, stephane.rosse@frentix.com
  */
+@Tag(name = "Catalog")
 @Component
 @Path("catalog")
 public class CatalogWebService {
diff --git a/src/main/java/org/olat/restapi/repository/RepositoryEntriesWebService.java b/src/main/java/org/olat/restapi/repository/RepositoryEntriesWebService.java
index 645eb712f0ecd50f02be365b5456557dc33b8869..f9f838c973fe1771305aaae766bb1287b7fce818 100644
--- a/src/main/java/org/olat/restapi/repository/RepositoryEntriesWebService.java
+++ b/src/main/java/org/olat/restapi/repository/RepositoryEntriesWebService.java
@@ -79,10 +79,17 @@ import org.olat.restapi.support.vo.RepositoryEntryVOes;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.OpenAPIDefinition;
 import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.info.Contact;
+import io.swagger.v3.oas.annotations.info.Info;
+import io.swagger.v3.oas.annotations.info.License;
 import io.swagger.v3.oas.annotations.media.Content;
 import io.swagger.v3.oas.annotations.media.Schema;
-import io.swagger.v3.oas.annotations.responses.*;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import io.swagger.v3.oas.annotations.responses.ApiResponses;
+import io.swagger.v3.oas.annotations.servers.Server;
+import io.swagger.v3.oas.annotations.tags.Tag;
 
 /**
  * Description:<br>
@@ -93,7 +100,23 @@ import io.swagger.v3.oas.annotations.responses.*;
  * 
  * @author patrickb, srosse, stephane.rosse@frentix.com
  */
+@Tag(name = "Repo")
 @Component
+@OpenAPIDefinition(
+	info = @Info(
+			title = "OpenOlat REST API",
+			description = "This is the documentation of the OpenOlat REST API.",
+			contact = @Contact(
+					name=  "OpenOlat",
+					url = "https://www.openolat.org"
+				),
+			license = @License(
+					name = "Apache 2.0",
+					url = "https://github.com/OpenOLAT/OpenOLAT/blob/master/LICENSE"
+				)
+		),
+	servers = { @Server(url = "/restapi") }
+)
 @Path("repo/entries")
 public class RepositoryEntriesWebService {
 	
diff --git a/src/main/java/org/olat/restapi/repository/RepositoryEntryLifecycleWebService.java b/src/main/java/org/olat/restapi/repository/RepositoryEntryLifecycleWebService.java
index 7e50edeed4b43492ffede41745d6871c35e01bce..9b494995adc098ea20c5df4cf3ddd36227211450 100644
--- a/src/main/java/org/olat/restapi/repository/RepositoryEntryLifecycleWebService.java
+++ b/src/main/java/org/olat/restapi/repository/RepositoryEntryLifecycleWebService.java
@@ -40,12 +40,15 @@ import org.olat.restapi.support.vo.RepositoryEntryLifecycleVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Initial date: 10.06.2013<br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
+@Tag(name = "Repo")
 @Component
 @Path("repo/lifecycle")
 public class RepositoryEntryLifecycleWebService {
diff --git a/src/main/java/org/olat/restapi/repository/SharedFolderWebService.java b/src/main/java/org/olat/restapi/repository/SharedFolderWebService.java
index 715010598c00fcaee68f33b031ada390c48c49ec..1c20e2a3bce1ae66ee5839b4329614c68afb3e98 100644
--- a/src/main/java/org/olat/restapi/repository/SharedFolderWebService.java
+++ b/src/main/java/org/olat/restapi/repository/SharedFolderWebService.java
@@ -56,6 +56,8 @@ import org.olat.restapi.support.vo.LinkVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * Description:<br>
  * A web service for the catalog
@@ -64,6 +66,7 @@ import org.springframework.stereotype.Component;
  * Initial Date:  5 may 2017 <br>
  * @author Stephan Clemenz, VCRP
  */
+@Tag(name = "Repo")
 @Component
 @Path("repo/sharedfolder")
 public class SharedFolderWebService {
diff --git a/src/main/java/org/olat/restapi/repository/course/CourseAssessmentWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseAssessmentWebService.java
index 7bffd3adf46c5d2eff659a1a70b90090d45fe060..eca87b92539ab7a5a1a86aa661980e66dad60860 100644
--- a/src/main/java/org/olat/restapi/repository/course/CourseAssessmentWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CourseAssessmentWebService.java
@@ -87,6 +87,8 @@ import org.olat.restapi.support.vo.AssessableResultsVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Description:<br>
@@ -96,6 +98,7 @@ import org.springframework.stereotype.Component;
  * Initial Date:  7 apr. 2010 <br>
  * @author srosse, stephane.rosse@frentix.com
  */
+@Tag(name = "Repo")
 @Component
 @Path("repo/courses/{courseId}/assessments")
 public class CourseAssessmentWebService {
@@ -191,6 +194,7 @@ public class CourseAssessmentWebService {
 	 * @param request The REST request
 	 * @return
 	 */
+	
 	@GET
 	@Path("users/{identityKey}")
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
diff --git a/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java
index 91463d31951fe0c9805555c5760202ea86bd2368..84939b38ddd3d08741c201ffd1dae50046ab6b8b 100644
--- a/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CourseElementWebService.java
@@ -81,6 +81,8 @@ import org.olat.restapi.support.vo.elements.TaskConfigVO;
 import org.olat.restapi.support.vo.elements.TestConfigVO;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 
 /**
  * This interface provides course building capabilities from our REST API.
@@ -89,6 +91,7 @@ import org.springframework.stereotype.Component;
  * 
  * @author cbuckley, srosse, stephane.rosse@frentix.com
  */
+@Tag(name = "Repo")
 @Component
 @Path("repo/courses/{courseId}/elements")
 public class CourseElementWebService extends AbstractCourseNodeWebService {
diff --git a/src/main/java/org/olat/restapi/repository/course/CourseGroupWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseGroupWebService.java
index 1fc933d17f413be087396a85338618e4adf10c4f..58623e92db679ab9477e65a261041c51ff34b875 100644
--- a/src/main/java/org/olat/restapi/repository/course/CourseGroupWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CourseGroupWebService.java
@@ -65,6 +65,8 @@ import org.olat.restapi.security.RestSecurityHelper;
 import org.olat.restapi.support.ObjectFactory;
 import org.olat.restapi.support.vo.GroupVO;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Description:<br>
@@ -74,6 +76,7 @@ import org.olat.restapi.support.vo.GroupVO;
  * Initial Date:  7 apr. 2010 <br>
  * @author srosse, stephane.rosse@frentix.com
  */
+@Tag(name = "Groups")
 public class CourseGroupWebService {
 	
 	private static final String VERSION = "1.0";
diff --git a/src/main/java/org/olat/restapi/repository/course/CourseResourceFolderWebService.java b/src/main/java/org/olat/restapi/repository/course/CourseResourceFolderWebService.java
index 8cca17de039b259760c1f9e091b227946a34ebf1..8ec2d8cb44945ae0577bf0f8e51945a00429da34 100644
--- a/src/main/java/org/olat/restapi/repository/course/CourseResourceFolderWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CourseResourceFolderWebService.java
@@ -79,6 +79,8 @@ import org.olat.restapi.support.vo.LinkVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Description:<br>
@@ -90,6 +92,7 @@ import org.springframework.stereotype.Component;
  * Initial Date:  26 apr. 2010 <br>
  * @author srosse, stephane.rosse@frentix.com
  */
+@Tag(name = "Repo")
 @Component
 @Path("repo/courses/{courseId}/resourcefolders")
 public class CourseResourceFolderWebService {
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 8a840056a1df2691d4c131c83f30b48aba1283da..e1f4ac3ccf82535b96a6908ad503fe0ee4dd11d9 100644
--- a/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
+++ b/src/main/java/org/olat/restapi/repository/course/CoursesWebService.java
@@ -91,6 +91,8 @@ import org.olat.restapi.support.vo.CourseVOes;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  *
  * Description:<br>
@@ -100,6 +102,7 @@ import org.springframework.stereotype.Component;
  * Initial Date:  27 apr. 2010 <br>
  * @author srosse, stephane.rosse@frentix.com
  */
+@Tag(name = "Repo")
 @Component
 @Path("repo/courses")
 public class CoursesWebService {
diff --git a/src/main/java/org/olat/restapi/support/Ping.java b/src/main/java/org/olat/restapi/support/Ping.java
index 122ef4d22f5e1fd0c10d3783ae94315151757476..6f89f6e97e1cf76f7d6f80be6bff1163a5715bd4 100644
--- a/src/main/java/org/olat/restapi/support/Ping.java
+++ b/src/main/java/org/olat/restapi/support/Ping.java
@@ -27,6 +27,8 @@ import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Description:<br>
@@ -36,6 +38,7 @@ import javax.ws.rs.core.Response;
  * Initial Date:  7 apr. 2010 <br>
  * @author srosse, stephane.rosse@frentix.com
  */
+@Tag(name = "Ping")
 @Path("ping")
 public class Ping {
 	
diff --git a/src/main/java/org/olat/restapi/system/OpenOLATStatisticsWebService.java b/src/main/java/org/olat/restapi/system/OpenOLATStatisticsWebService.java
index 7cc2d308befea44476de0bcaeb5289136c88254d..97f5ab48c75e421b3422957f1c994ba0c9190fa8 100644
--- a/src/main/java/org/olat/restapi/system/OpenOLATStatisticsWebService.java
+++ b/src/main/java/org/olat/restapi/system/OpenOLATStatisticsWebService.java
@@ -48,6 +48,8 @@ import org.olat.restapi.system.vo.SessionsVO;
 import org.olat.restapi.system.vo.TasksVO;
 import org.olat.restapi.system.vo.UserStatisticsVO;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
@@ -87,6 +89,7 @@ public class OpenOLATStatisticsWebService implements Sampler {
 	 * @param request The HTTP request
 	 * @return The statistics about OpenOLAT users
 	 */
+	@Tag(name = "Users")
 	@GET
 	@Path("users")
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
@@ -105,6 +108,7 @@ public class OpenOLATStatisticsWebService implements Sampler {
 	 * @param request The HTTP request
 	 * @return The statistics about the repository
 	 */
+	@Tag(name = "Repo")
 	@GET
 	@Path("repository")
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
diff --git a/src/main/java/org/olat/restapi/system/SystemWebService.java b/src/main/java/org/olat/restapi/system/SystemWebService.java
index 0bf1efd17304fc024904f4ad00a7d886c435816d..3a60b0c90f93e8c8c3573d3e7e6f5276df72e89f 100644
--- a/src/main/java/org/olat/restapi/system/SystemWebService.java
+++ b/src/main/java/org/olat/restapi/system/SystemWebService.java
@@ -45,6 +45,8 @@ import org.olat.restapi.system.vo.EnvironmentInformationsVO;
 import org.olat.restapi.system.vo.ReleaseInfosVO;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * <h3>Description:</h3>
@@ -52,6 +54,7 @@ import org.springframework.stereotype.Component;
  * Initial Date:  18 jun. 2010 <br>
  * @author srosse, stephane.rosse@frentix.com, www.frentix.com
  */
+@Tag(name = "System")
 @Path("system")
 @Component
 public class SystemWebService {
diff --git a/src/main/java/org/olat/user/restapi/OrganisationsWebService.java b/src/main/java/org/olat/user/restapi/OrganisationsWebService.java
index c188eb4d452673450554f518f10e3095c693965c..25973b132ae1a45c57e6c2ad5a41df3482bc27f5 100644
--- a/src/main/java/org/olat/user/restapi/OrganisationsWebService.java
+++ b/src/main/java/org/olat/user/restapi/OrganisationsWebService.java
@@ -61,12 +61,15 @@ import org.olat.restapi.support.vo.RepositoryEntryVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Initial date: 14 mai 2018<br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
+@Tag(name = "Organisations")
 @Component
 @Path("organisations")
 public class OrganisationsWebService {
diff --git a/src/main/java/org/olat/user/restapi/RelationRolesWebService.java b/src/main/java/org/olat/user/restapi/RelationRolesWebService.java
index 873adc72e1a0734f7060966de3ce74ba3207efa4..72469c5366dafc85fb8f2007fd553c92dc22e41e 100644
--- a/src/main/java/org/olat/user/restapi/RelationRolesWebService.java
+++ b/src/main/java/org/olat/user/restapi/RelationRolesWebService.java
@@ -46,12 +46,15 @@ import org.olat.restapi.security.RestSecurityHelper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * 
  * Initial date: 31 janv. 2019<br>
  * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
  *
  */
+@Tag(name = "Users")
 @Component
 @Path("users/relations")
 public class RelationRolesWebService {
diff --git a/src/main/java/org/olat/user/restapi/UserAuthenticationWebService.java b/src/main/java/org/olat/user/restapi/UserAuthenticationWebService.java
index 9a4f6ed2b7e7e54ce928bdc36a930e9b392c8230..ee29e8c124b9ac018405fafcade62a6d2b7f2f39 100644
--- a/src/main/java/org/olat/user/restapi/UserAuthenticationWebService.java
+++ b/src/main/java/org/olat/user/restapi/UserAuthenticationWebService.java
@@ -53,11 +53,14 @@ import org.olat.restapi.support.vo.ErrorVO;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * This web service handles functionalities related to authentication credentials of users.
  * 
  * @author srosse, stephane.rosse@frentix.com
  */
+@Tag(name = "Users")
 @Component
 @Path("users/{username}/auth")
 public class UserAuthenticationWebService {
diff --git a/src/main/java/org/olat/user/restapi/UserWebService.java b/src/main/java/org/olat/user/restapi/UserWebService.java
index 1ceebfc9738727b44b73f515bef106c5bc60b84f..2159fcfcac4aa870bf7af7ac26ca2232bc71ad5a 100644
--- a/src/main/java/org/olat/user/restapi/UserWebService.java
+++ b/src/main/java/org/olat/user/restapi/UserWebService.java
@@ -94,11 +94,15 @@ import org.olat.user.propertyhandlers.UserPropertyHandler;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import io.swagger.v3.oas.annotations.tags.Tag;
+
 /**
  * This web service handles functionalities related to <code>User</code>.
  * 
  * @author srosse, stephane.rosse@frentix.com
  */
+
+@Tag (name = "Users")
 @Path("users")
 @Component
 public class UserWebService {
diff --git a/src/test/java/org/olat/restapi/DataGenerator.java b/src/test/java/org/olat/restapi/DataGenerator.java
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391