diff --git a/src/main/java/org/olat/commons/calendar/CalendarManager.java b/src/main/java/org/olat/commons/calendar/CalendarManager.java
index e8a02e365a42d0b8037dd8eef749d4e9c8db52d7..01425badb4f4720d399727a3be648b3717c4dda5 100644
--- a/src/main/java/org/olat/commons/calendar/CalendarManager.java
+++ b/src/main/java/org/olat/commons/calendar/CalendarManager.java
@@ -266,6 +266,15 @@ public interface CalendarManager {
 	 * @return true if success
 	 */
 	public boolean addEventTo(Kalendar cal, KalendarEvent kalendarEvent);
+	
+	/**
+	 * Add a list of events to a given calendar and save it.
+	 * 
+	 * @param cal
+	 * @param kalendarEvents
+	 * @return
+	 */
+	public boolean addEventTo(Kalendar cal, List<KalendarEvent> kalendarEvents);
 
 	/**
 	 * Remove an event from given calendar and save calendar.
@@ -283,6 +292,15 @@ public interface CalendarManager {
 	 */
 	public boolean updateEventFrom(Kalendar cal, KalendarEvent kalendarEvent);
 	
+	/**
+	 * Update a list of events fron a given calendar and save it.
+	 * 
+	 * @param cal
+	 * @param kalendarEvent
+	 * @return
+	 */
+	public boolean updateEventsFrom(Kalendar cal, List<KalendarEvent> kalendarEvents);
+	
 	/**
 	 * Update an event of given calendar and save calendar. Use this method if the Kalendar is already in a doInSync.
 	 * @param cal
diff --git a/src/main/java/org/olat/commons/calendar/manager/ICalFileCalendarManager.java b/src/main/java/org/olat/commons/calendar/manager/ICalFileCalendarManager.java
index e675f7a9ab78d4f59ad37eb4e708d03eeb3296a3..c1bc899822387f506ba22c16da5621c799ae230a 100644
--- a/src/main/java/org/olat/commons/calendar/manager/ICalFileCalendarManager.java
+++ b/src/main/java/org/olat/commons/calendar/manager/ICalFileCalendarManager.java
@@ -38,6 +38,7 @@ import java.io.OutputStream;
 import java.net.URISyntaxException;
 import java.text.ParseException;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.Date;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -900,12 +901,19 @@ public class ICalFileCalendarManager implements CalendarManager, InitializingBea
 
 	@Override
 	public boolean addEventTo(final Kalendar cal, final KalendarEvent kalendarEvent) {
+		return addEventTo(cal, Collections.singletonList(kalendarEvent));
+  }
+	
+	@Override
+	public boolean addEventTo(final Kalendar cal, final List<KalendarEvent> kalendarEvents) {
 		OLATResourceable calOres = getOresHelperFor(cal);
 		Boolean persistSuccessful = CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync( calOres, new SyncerCallback<Boolean>() {
 			@Override
 			public Boolean execute() {
 				Kalendar loadedCal = getCalendarFromCache(cal.getType(),cal.getCalendarID());
-				loadedCal.addEvent(kalendarEvent);
+				for(KalendarEvent kalendarEvent:kalendarEvents) {
+					loadedCal.addEvent(kalendarEvent);
+				}
 				boolean successfullyPersist = persistCalendar(loadedCal);
 				return new Boolean(successfullyPersist);
 			}
@@ -913,7 +921,7 @@ public class ICalFileCalendarManager implements CalendarManager, InitializingBea
 		// inform all controller about calendar change for reload
 		CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(new CalendarGUIModifiedEvent(cal), OresHelper.lookupType(CalendarManager.class));
 		return persistSuccessful.booleanValue();
-  }
+	}
 
 	/**
 	 * @see org.olat.commons.calendar.CalendarManager#removeEventFrom(org.olat.commons.calendar.model.Kalendar, org.olat.commons.calendar.model.KalendarEvent)
@@ -949,8 +957,28 @@ public class ICalFileCalendarManager implements CalendarManager, InitializingBea
 		});
 		return updatedSuccessful.booleanValue();
     }
-    
-    /**
+
+    @Override
+	public boolean updateEventsFrom(Kalendar cal, List<KalendarEvent> kalendarEvents) {
+		final OLATResourceable calOres = getOresHelperFor(cal);
+		Boolean updatedSuccessful = CoordinatorManager.getInstance().getCoordinator().getSyncer().doInSync( calOres, new SyncerCallback<Boolean>() {
+			@Override
+			public Boolean execute() {
+				Kalendar loadedCal = getCalendarFromCache(cal.getType(), cal.getCalendarID());
+				for(KalendarEvent kalendarEvent:kalendarEvents) {
+					loadedCal.removeEvent(kalendarEvent); // remove old event
+					loadedCal.addEvent(kalendarEvent); // add changed event
+				}
+				boolean successfullyPersist = persistCalendar(loadedCal);
+				// inform all controller about calendar change for reload
+				CoordinatorManager.getInstance().getCoordinator().getEventBus().fireEventToListenersOf(new CalendarGUIModifiedEvent(cal), OresHelper.lookupType(CalendarManager.class));
+				return successfullyPersist;
+			}
+		});
+		return updatedSuccessful.booleanValue();
+	}
+
+	/**
 	 * @see org.olat.commons.calendar.CalendarManager#updateEventFrom(org.olat.commons.calendar.model.Kalendar, org.olat.commons.calendar.model.KalendarEvent)
 	 */
 	@Override
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 1cf0bddf98fc7b3c0ce257ab9d4614dc5f699764..e3256bf339cd73b56e06ffd94537ed648b908bb5 100644
--- a/src/main/java/org/olat/commons/calendar/restapi/CalWebService.java
+++ b/src/main/java/org/olat/commons/calendar/restapi/CalWebService.java
@@ -27,6 +27,7 @@ import static org.olat.restapi.security.RestSecurityHelper.getUserRequest;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.UUID;
 
@@ -54,6 +55,12 @@ import org.olat.core.CoreSpringFactory;
 import org.olat.core.gui.UserRequest;
 import org.olat.core.util.StringHelper;
 
+/**
+ * 
+ * Initial date: 23.12.2015<br>
+ * @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
+ *
+ */
 public class CalWebService {
 	
 	private final KalendarRenderWrapper calendar;
@@ -125,22 +132,48 @@ public class CalWebService {
 	}
 	
 	@PUT
-	@Path("events")
+	@Path("event")
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
 	public Response putEventByCalendar(EventVO event, @Context HttpServletRequest httpRequest) {
-		return addEventByCalendar(event, httpRequest);
+		List<EventVO> events = Collections.singletonList(event);
+		return addEventsByCalendar(events, httpRequest);
 	}
 	
-	@POST
+	@PUT
 	@Path("events")
 	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
+	@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
+	public Response putEventsByCalendar(EventVOes eventArray, @Context HttpServletRequest httpRequest) {
+		List<EventVO> events = new ArrayList<>();
+		for(EventVO event:eventArray.getEvents()) {
+			events.add(event);
+		}
+		return addEventsByCalendar(events, httpRequest);
+	}
+	
+	@POST
+	@Path("event")
+	@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) {
-		return addEventByCalendar(event, httpRequest);
+		List<EventVO> events = Collections.singletonList(event);
+		return addEventsByCalendar(events, httpRequest);
 	}
 	
-	private Response addEventByCalendar(EventVO event, HttpServletRequest httpRequest) {
+	@POST
+	@Path("events")
+	@Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
+	@Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
+	public Response postEventsByCalendar(EventVOes eventArray, @Context HttpServletRequest httpRequest) {
+		List<EventVO> events = new ArrayList<>();
+		for(EventVO event:eventArray.getEvents()) {
+			events.add(event);
+		}
+		return addEventsByCalendar(events, httpRequest);
+	}
+	
+	private Response addEventsByCalendar(List<EventVO> events, HttpServletRequest httpRequest) {
 		UserRequest ureq = getUserRequest(httpRequest);
 		if(!ureq.getUserSession().isAuthenticated()) {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
@@ -152,28 +185,39 @@ public class CalWebService {
 			return Response.serverError().status(Status.UNAUTHORIZED).build();
 		}
 		
-		KalendarEvent kalEvent;
+		List<KalendarEvent> kalEventToAdd = new ArrayList<>();
+		List<KalendarEvent> kalEventToUpdate = new ArrayList<>();
 		CalendarManager calendarManager = CoreSpringFactory.getImpl(CalendarManager.class);
-		if(!StringHelper.containsNonWhitespace(event.getId())) {
-			String id = UUID.randomUUID().toString();
-			kalEvent = new KalendarEvent(id, event.getSubject(), event.getBegin(), event.getEnd());
-			transfer(event, kalEvent);
-			calendarManager.addEventTo(calendar.getKalendar(), kalEvent);
-		} else {
-			kalEvent = calendar.getKalendar().getEvent(event.getId());
-			if(kalEvent == null) {
-				kalEvent = new KalendarEvent(event.getId(), event.getSubject(), event.getBegin(), event.getEnd());
+		
+		for(EventVO event:events) {
+			KalendarEvent kalEvent;
+			if(!StringHelper.containsNonWhitespace(event.getId())) {
+				String id = UUID.randomUUID().toString();
+				kalEvent = new KalendarEvent(id, event.getSubject(), event.getBegin(), event.getEnd());
 				transfer(event, kalEvent);
-				calendarManager.addEventTo(calendar.getKalendar(), kalEvent);
+				kalEventToAdd.add(kalEvent);
 			} else {
-				kalEvent.setBegin(event.getBegin());
-				kalEvent.setEnd(event.getEnd());
-				kalEvent.setSubject(event.getSubject());
-				transfer(event, kalEvent);
+				kalEvent = calendar.getKalendar().getEvent(event.getId());
+				if(kalEvent == null) {
+					kalEvent = new KalendarEvent(event.getId(), event.getSubject(), event.getBegin(), event.getEnd());
+					transfer(event, kalEvent);
+					kalEventToAdd.add(kalEvent);
+				} else {
+					kalEvent.setBegin(event.getBegin());
+					kalEvent.setEnd(event.getEnd());
+					kalEvent.setSubject(event.getSubject());
+					transfer(event, kalEvent);
+					kalEventToUpdate.add(kalEvent);
+				}
 			}
 		}
-		
-		EventVO vo = new EventVO(kalEvent);
-		return Response.ok(vo).build();
+
+		if(kalEventToAdd.size() > 0) {
+			calendarManager.addEventTo(calendar.getKalendar(), kalEventToAdd);
+		}
+		if(kalEventToUpdate.size() > 0) {
+			calendarManager.updateEventsFrom(calendar.getKalendar(), kalEventToUpdate);
+		}
+		return Response.ok().build();
 	}
 }
diff --git a/src/main/java/org/olat/course/nodes/members/MembersMailController.java b/src/main/java/org/olat/course/nodes/members/MembersMailController.java
index f1e261148e8c7fc2c9a3c9f916baa5d5526d8772..0e1f2eb084bca86152711cd294ae951448a97ee1 100644
--- a/src/main/java/org/olat/course/nodes/members/MembersMailController.java
+++ b/src/main/java/org/olat/course/nodes/members/MembersMailController.java
@@ -351,13 +351,18 @@ public class MembersMailController extends FormBasicController {
 		if(participantEl != null && participantEl.isAtLeastSelected(1)) {
 			participants = null;
 		}
-		selectMemberCtrl = new SelectMembersController(ureq, getWindowControl(), owners, coaches, participants);
-		listenTo(selectMemberCtrl);
 		
-		String title = translate("select.members");
-		cmc = new CloseableModalController(getWindowControl(), translate("close"), selectMemberCtrl.getInitialComponent(), true, title);
-		listenTo(cmc);
-		cmc.activate();
+		if(owners == null || coaches == null && participants == null) {
+			showWarning("already.all.selected");
+		} else {
+			selectMemberCtrl = new SelectMembersController(ureq, getWindowControl(), selectedMembers, owners, coaches, participants);
+			listenTo(selectMemberCtrl);
+			
+			String title = translate("select.members");
+			cmc = new CloseableModalController(getWindowControl(), translate("close"), selectMemberCtrl.getInitialComponent(), true, title);
+			listenTo(cmc);
+			cmc.activate();
+		}
 	}
 	
 	private void doDeleteAttachment(Attachment attachment) {
diff --git a/src/main/java/org/olat/course/nodes/members/SelectMembersController.java b/src/main/java/org/olat/course/nodes/members/SelectMembersController.java
index 79b89c1a2020c9a4fa08e02aa2641041cc601ce5..055d59dfe77cae1f7c8c1b9beba091094a035776 100644
--- a/src/main/java/org/olat/course/nodes/members/SelectMembersController.java
+++ b/src/main/java/org/olat/course/nodes/members/SelectMembersController.java
@@ -41,16 +41,17 @@ import org.olat.core.gui.control.WindowControl;
 public class SelectMembersController extends FormBasicController {
 
 	private MultipleSelectionElement ownerEl, coachEl, participantEl;
-	private final List<Member> ownerList, coachList, participantList;
+	private final List<Member> ownerList, coachList, participantList, preSelectedMembers;
 	
 	private List<Member> selectedMembers = new ArrayList<>();
 	
-	public SelectMembersController(UserRequest ureq, WindowControl wControl,
+	public SelectMembersController(UserRequest ureq, WindowControl wControl, List<Member> preSelectedMembers,
 			List<Member> ownerList, List<Member> coachList, List<Member> participantList) {
 		super(ureq, wControl, LAYOUT_VERTICAL);
 		this.ownerList = ownerList;
 		this.coachList = coachList;
 		this.participantList = participantList;
+		this.preSelectedMembers = preSelectedMembers;
 		initForm(ureq);
 	}
 	
@@ -81,11 +82,22 @@ public class SelectMembersController extends FormBasicController {
 	private MultipleSelectionElement makeSelection(String name, List<Member> members, FormItemContainer formLayout) {
 		String[] keys = new String[members.size()];
 		String[] values = new String[members.size()];
+		
+		List<String> preSelectedOptions = new ArrayList<>();
 		for(int i=members.size(); i-->0; ) {
-			keys[i] = members.get(i).getKey().toString();
-			values[i] = members.get(i).getFullName();
+			Member member = members.get(i);
+			String optionKey = member.getKey().toString();
+			keys[i] = optionKey;
+			values[i] = member.getFullName();
+			if(preSelectedMembers.contains(member)) {
+				preSelectedOptions.add(optionKey);
+			}
+		}
+		MultipleSelectionElement selectionEl = uifactory.addCheckboxesVertical(name, name, formLayout, keys, values, 2);
+		for(String preSelectedOption:preSelectedOptions) {
+			selectionEl.select(preSelectedOption, true);
 		}
-		return uifactory.addCheckboxesVertical(name, name, formLayout, keys, values, 2);
+		return selectionEl;
 	}
 	
 	@Override
diff --git a/src/main/java/org/olat/course/nodes/members/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/course/nodes/members/_i18n/LocalStrings_de.properties
index 9ef7d7b957af111b83ecd0de2ceb25ed24bba369..7a980d60111b5d876a56434ebc2a70fbd3007697 100644
--- a/src/main/java/org/olat/course/nodes/members/_i18n/LocalStrings_de.properties
+++ b/src/main/java/org/olat/course/nodes/members/_i18n/LocalStrings_de.properties
@@ -1,5 +1,6 @@
 #Mon Mar 02 09:54:04 CET 2009
 add.member=Hinzufügen
+already.all.selected=Sie haben schon alle Benutzer ausgewählt.
 contact.attachment=$org.olat.modules.co\:contact.attachment
 contact.attachment.maxsize=$org.olat.modules.co\:contact.attachment.maxsize
 coaches.to=Betreuer von Kurs "{0}"
diff --git a/src/main/java/org/olat/course/nodes/members/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/course/nodes/members/_i18n/LocalStrings_en.properties
index b4326b6ed10d6ea5d8ef52ff2c95b616c5024bcf..9571ad0ca210c7ae324583fbeba485318ffb19eb 100644
--- a/src/main/java/org/olat/course/nodes/members/_i18n/LocalStrings_en.properties
+++ b/src/main/java/org/olat/course/nodes/members/_i18n/LocalStrings_en.properties
@@ -1,5 +1,6 @@
 #Mon May 16 17:20:06 CEST 2011
 add.member=Add
+already.all.selected=You already choose all users.
 contact.attachment=$org.olat.modules.co\:contact.attachment
 contact.attachment.maxsize=$org.olat.modules.co\:contact.attachment.maxsize
 coaches.to=coaches of course "{0}"
diff --git a/src/test/java/org/olat/restapi/CalendarTest.java b/src/test/java/org/olat/restapi/CalendarTest.java
index 7254a87acaa61f0e4a2d50992d73f7933e8ba2cf..7198f633e7e603d836c66ab8929e18171c9fbafa 100644
--- a/src/test/java/org/olat/restapi/CalendarTest.java
+++ b/src/test/java/org/olat/restapi/CalendarTest.java
@@ -373,7 +373,7 @@ public class CalendarTest extends OlatJerseyTestCase {
 	}
 	
 	@Test
-	public void testPutCalendarEvents() throws IOException, URISyntaxException {
+	public void putCalendarEvent() throws IOException, URISyntaxException {
 		RestConnection conn = new RestConnection();
 		assertTrue(conn.login(id2.getName(), "A6B7C8"));
 		
@@ -397,7 +397,7 @@ public class CalendarTest extends OlatJerseyTestCase {
 		event.setSubject(subject);
 
 		URI eventUri = UriBuilder.fromUri(getContextURI()).path("users").path(id2.getKey().toString())
-				.path("calendars").path(calendar.getId()).path("events").build();
+				.path("calendars").path(calendar.getId()).path("event").build();
 		HttpPut putEventMethod = conn.createPut(eventUri, MediaType.APPLICATION_JSON, true);
 		conn.addJsonEntity(putEventMethod, event);
 		HttpResponse putEventResponse = conn.execute(putEventMethod);
@@ -420,7 +420,7 @@ public class CalendarTest extends OlatJerseyTestCase {
 	}
 	
 	@Test
-	public void testPutCalendarEvents_notAuthorized() throws IOException, URISyntaxException {
+	public void putCalendarEvents_notAuthorized() throws IOException, URISyntaxException {
 		RestConnection conn = new RestConnection();
 		assertTrue(conn.login(id2.getName(), "A6B7C8"));
 		
@@ -443,7 +443,7 @@ public class CalendarTest extends OlatJerseyTestCase {
 		event.setSubject(subject);
 
 		URI eventUri = UriBuilder.fromUri(getContextURI()).path("users").path(id2.getKey().toString())
-				.path("calendars").path(calendarCourse_1.getId()).path("events").build();
+				.path("calendars").path(calendarCourse_1.getId()).path("event").build();
 		HttpPut putEventMethod = conn.createPut(eventUri, MediaType.APPLICATION_JSON, true);
 		conn.addJsonEntity(putEventMethod, event);
 		HttpResponse putEventResponse = conn.execute(putEventMethod);
@@ -477,15 +477,12 @@ public class CalendarTest extends OlatJerseyTestCase {
 		event.setSubject(subject);
 
 		URI eventUri = UriBuilder.fromUri(getContextURI()).path("users").path(id2.getKey().toString())
-				.path("calendars").path(calendar.getId()).path("events").build();
+				.path("calendars").path(calendar.getId()).path("event").build();
 		HttpPost postEventMethod = conn.createPost(eventUri, MediaType.APPLICATION_JSON);
 		conn.addJsonEntity(postEventMethod, event);
 		HttpResponse postEventResponse = conn.execute(postEventMethod);
 		assertEquals(200, postEventResponse.getStatusLine().getStatusCode());
-		
-		EventVO newEvent = conn.parse(postEventResponse, EventVO.class);
-		Assert.assertNotNull(newEvent);
-		
+
 		//check if the event is saved
 		KalendarRenderWrapper calendarWrapper = calendarManager.getCourseCalendar(course2);
 		Collection<KalendarEvent> savedEvents = calendarWrapper.getKalendar().getEvents();
@@ -525,7 +522,7 @@ public class CalendarTest extends OlatJerseyTestCase {
 		event.setSubject(subject);
 
 		URI eventUri = UriBuilder.fromUri(getContextURI()).path("users").path(id2.getKey().toString())
-				.path("calendars").path(calendar.getId()).path("events").build();
+				.path("calendars").path(calendar.getId()).path("event").build();
 		HttpPut putEventMethod = conn.createPut(eventUri, MediaType.APPLICATION_JSON, true);
 		conn.addJsonEntity(putEventMethod, event);
 		HttpResponse putEventResponse = conn.execute(putEventMethod);
diff --git a/src/test/java/org/olat/restapi/CourseCalendarTest.java b/src/test/java/org/olat/restapi/CourseCalendarTest.java
index 9b821e52c7d2d6b0ab987f5adfe398ed0c7b444a..2d940912cd71b9e953652532e6b59c8f8ae74863 100644
--- a/src/test/java/org/olat/restapi/CourseCalendarTest.java
+++ b/src/test/java/org/olat/restapi/CourseCalendarTest.java
@@ -54,9 +54,11 @@ import org.codehaus.jackson.type.TypeReference;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
+import org.olat.basesecurity.BaseSecurityManager;
 import org.olat.commons.calendar.CalendarManager;
 import org.olat.commons.calendar.model.KalendarEvent;
 import org.olat.commons.calendar.restapi.EventVO;
+import org.olat.commons.calendar.restapi.EventVOes;
 import org.olat.commons.calendar.ui.components.KalendarRenderWrapper;
 import org.olat.core.CoreSpringFactory;
 import org.olat.core.commons.persistence.DB;
@@ -125,7 +127,7 @@ public class CourseCalendarTest extends OlatJerseyTestCase {
 	}
 	
 	@Test
-	public void testGetCalendarEvents()
+	public void getCalendarEvents()
 	throws IOException, URISyntaxException {
 		RestConnection conn = new RestConnection();
 		assertTrue(conn.login(auth1.getName(), "A6B7C8"));
@@ -143,7 +145,7 @@ public class CourseCalendarTest extends OlatJerseyTestCase {
 	}
 	
 	@Test
-	public void testPutCalendarEvent() throws IOException, URISyntaxException {
+	public void putCalendarEvent() throws IOException, URISyntaxException {
 		RestConnection conn = new RestConnection();
 		assertTrue(conn.login(auth1.getName(), "A6B7C8"));
 
@@ -157,7 +159,7 @@ public class CourseCalendarTest extends OlatJerseyTestCase {
 		event.setSubject(subject);
 
 		URI eventUri = UriBuilder.fromUri(getContextURI()).path("repo").path("courses")
-				.path(course1.getResourceableId().toString()).path("calendar").path("events").build();
+				.path(course1.getResourceableId().toString()).path("calendar").path("event").build();
 		HttpPut putEventMethod = conn.createPut(eventUri, MediaType.APPLICATION_JSON, true);
 		conn.addJsonEntity(putEventMethod, event);
 		HttpResponse putEventResponse = conn.execute(putEventMethod);
@@ -180,7 +182,67 @@ public class CourseCalendarTest extends OlatJerseyTestCase {
 	}
 	
 	@Test
-	public void testDeleteCalendarEvent() throws IOException, URISyntaxException {
+	public void putCalendarEvents() throws IOException, URISyntaxException {
+		RestConnection conn = new RestConnection();
+		Identity admin = BaseSecurityManager.getInstance().findIdentityByName("administrator");
+
+		Assert.assertTrue(conn.login("administrator", "openolat"));
+		CourseConfigVO config = new CourseConfigVO();
+		config.setCalendar(Boolean.TRUE);
+		ICourse course = CoursesWebService.createEmptyCourse(admin, "Course with calendar", "Course with calendar", config);
+		dbInstance.commitAndCloseSession();
+		
+		//create an event
+		EventVO event1 = new EventVO();
+		Calendar cal = Calendar.getInstance();
+		event1.setBegin(cal.getTime());
+		cal.add(Calendar.HOUR_OF_DAY, 1);
+		event1.setEnd(cal.getTime());
+		String subject1 = UUID.randomUUID().toString();
+		event1.setSubject(subject1);
+
+		EventVO event2 = new EventVO();
+		event2.setBegin(cal.getTime());
+		cal.add(Calendar.HOUR_OF_DAY, 1);
+		event2.setEnd(cal.getTime());
+		String subject2 = UUID.randomUUID().toString();
+		event2.setSubject(subject2);
+		
+		EventVO[] newEvents = new EventVO[2];
+		newEvents[0] = event1;
+		newEvents[1] = event2;
+		EventVOes newEventVOes = new EventVOes();
+		newEventVOes.setEvents(newEvents);
+
+		URI eventUri = UriBuilder.fromUri(getContextURI()).path("repo").path("courses")
+				.path(course.getResourceableId().toString()).path("calendar").path("events").build();
+		HttpPut putEventMethod = conn.createPut(eventUri, MediaType.APPLICATION_JSON, true);
+		conn.addJsonEntity(putEventMethod, newEventVOes);
+		HttpResponse putEventResponse = conn.execute(putEventMethod);
+		assertEquals(200, putEventResponse.getStatusLine().getStatusCode());
+		EntityUtils.consume(putEventResponse.getEntity());
+		
+		//check if the event is saved
+		KalendarRenderWrapper calendarWrapper = calendarManager.getCourseCalendar(course);
+		Collection<KalendarEvent> savedEvents = calendarWrapper.getKalendar().getEvents();
+		
+		boolean found1 = false;
+		boolean found2 = false;
+		for(KalendarEvent savedEvent:savedEvents) {
+			if(subject1.equals(savedEvent.getSubject())) {
+				found1 = true;
+			} else if(subject2.equals(savedEvent.getSubject())) {
+				found2 = true;
+			}
+		}
+		Assert.assertTrue(found1);
+		Assert.assertTrue(found2);
+
+		conn.shutdown();
+	}
+	
+	@Test
+	public void deleteCalendarEvent() throws IOException, URISyntaxException {
 		RestConnection conn = new RestConnection();
 		assertTrue(conn.login(auth1.getName(), "A6B7C8"));