diff --git a/src/main/java/de/thm/arsnova/event/AfterCreationEvent.java b/src/main/java/de/thm/arsnova/event/AfterCreationEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f99fd8552ba3b8c5e745c287e2f22c73eb358c6
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/event/AfterCreationEvent.java
@@ -0,0 +1,9 @@
+package de.thm.arsnova.event;
+
+import de.thm.arsnova.model.Entity;
+
+public class AfterCreationEvent<E extends Entity> extends CrudEvent<E> {
+	public AfterCreationEvent(final E source) {
+		super(source);
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/event/AfterDeletionEvent.java b/src/main/java/de/thm/arsnova/event/AfterDeletionEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..67893207a13004fc3bc8e9f0dc49d0dda89e1a68
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/event/AfterDeletionEvent.java
@@ -0,0 +1,9 @@
+package de.thm.arsnova.event;
+
+import de.thm.arsnova.model.Entity;
+
+public class AfterDeletionEvent<E extends Entity> extends CrudEvent<E> {
+	public AfterDeletionEvent(final E source) {
+		super(source);
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/event/AfterPatchEvent.java b/src/main/java/de/thm/arsnova/event/AfterPatchEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..26382107409030433cf7d33afa72b1e1f64fcce1
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/event/AfterPatchEvent.java
@@ -0,0 +1,9 @@
+package de.thm.arsnova.event;
+
+import de.thm.arsnova.model.Entity;
+
+public class AfterPatchEvent<E extends Entity> extends AfterUpdateEvent<E> {
+	public AfterPatchEvent(final E source) {
+		super(source);
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/event/AfterUpdateEvent.java b/src/main/java/de/thm/arsnova/event/AfterUpdateEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..b30f3958a414b4e7e2b1f42f09412a2fb92051be
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/event/AfterUpdateEvent.java
@@ -0,0 +1,9 @@
+package de.thm.arsnova.event;
+
+import de.thm.arsnova.model.Entity;
+
+public class AfterUpdateEvent<E extends Entity> extends CrudEvent<E> {
+	public AfterUpdateEvent(final E source) {
+		super(source);
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/event/BeforeCreationEvent.java b/src/main/java/de/thm/arsnova/event/BeforeCreationEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..42d5524f349374f7613ea7d030e8dc537f7b56a7
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/event/BeforeCreationEvent.java
@@ -0,0 +1,9 @@
+package de.thm.arsnova.event;
+
+import de.thm.arsnova.model.Entity;
+
+public class BeforeCreationEvent<E extends Entity> extends CrudEvent<E> {
+	public BeforeCreationEvent(final E source) {
+		super(source);
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/event/BeforeDeletionEvent.java b/src/main/java/de/thm/arsnova/event/BeforeDeletionEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..0a13bef26ba234ff52e0d9b2fcc7b115592ac670
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/event/BeforeDeletionEvent.java
@@ -0,0 +1,9 @@
+package de.thm.arsnova.event;
+
+import de.thm.arsnova.model.Entity;
+
+public class BeforeDeletionEvent<E extends Entity> extends CrudEvent<E> {
+	public BeforeDeletionEvent(final E source) {
+		super(source);
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/event/BeforePatchEvent.java b/src/main/java/de/thm/arsnova/event/BeforePatchEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..871dc6bfd20ee2db688ca0c688ab799cabb9750f
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/event/BeforePatchEvent.java
@@ -0,0 +1,9 @@
+package de.thm.arsnova.event;
+
+import de.thm.arsnova.model.Entity;
+
+public class BeforePatchEvent<E extends Entity> extends BeforeUpdateEvent<E> {
+	public BeforePatchEvent(final E source) {
+		super(source);
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/event/BeforeUpdateEvent.java b/src/main/java/de/thm/arsnova/event/BeforeUpdateEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..81c74e675a330083d6f381e0a5a689c616a38ef6
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/event/BeforeUpdateEvent.java
@@ -0,0 +1,9 @@
+package de.thm.arsnova.event;
+
+import de.thm.arsnova.model.Entity;
+
+public class BeforeUpdateEvent<E extends Entity> extends CrudEvent<E> {
+	public BeforeUpdateEvent(final E source) {
+		super(source);
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/event/CrudEvent.java b/src/main/java/de/thm/arsnova/event/CrudEvent.java
new file mode 100644
index 0000000000000000000000000000000000000000..bf41ce6ff878825458efe939c5b7f59d22572c3d
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/event/CrudEvent.java
@@ -0,0 +1,15 @@
+package de.thm.arsnova.event;
+
+import de.thm.arsnova.model.Entity;
+import org.springframework.context.ApplicationEvent;
+
+public abstract class CrudEvent<E extends Entity> extends ApplicationEvent {
+	public CrudEvent(final E source) {
+		super(source);
+	}
+
+	@Override
+	public E getSource() {
+		return (E) super.getSource();
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/service/AnswerServiceImpl.java b/src/main/java/de/thm/arsnova/service/AnswerServiceImpl.java
index c7dd6e56127317c99c602a35f4e96a89736aaa51..93e7c1bfd4fb0b990544ed8012a9d724a35b0faf 100644
--- a/src/main/java/de/thm/arsnova/service/AnswerServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/AnswerServiceImpl.java
@@ -37,8 +37,6 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.cache.annotation.CacheEvict;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.ApplicationEventPublisherAware;
 import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -55,14 +53,11 @@ import java.util.concurrent.ConcurrentLinkedQueue;
  * Performs all answer related operations.
  */
 @Service
-public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer>
-		implements AnswerService, ApplicationEventPublisherAware {
+public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer> implements AnswerService {
 	private static final Logger logger = LoggerFactory.getLogger(ContentServiceImpl.class);
 
 	private final Queue<AnswerQueueElement> answerQueue = new ConcurrentLinkedQueue<>();
 
-	private ApplicationEventPublisher publisher;
-
 	private RoomRepository roomRepository;
 	private ContentRepository contentRepository;
 	private AnswerRepository answerRepository;
@@ -104,7 +99,7 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer>
 
 			// Send NewAnswerEvents ...
 			for (AnswerQueueElement e : elements) {
-				this.publisher.publishEvent(new NewAnswerEvent(this, e.getRoom(), e.getAnswer(), e.getUserId(), e.getQuestion()));
+				this.eventPublisher.publishEvent(new NewAnswerEvent(this, e.getRoom(), e.getAnswer(), e.getUserId(), e.getQuestion()));
 			}
 		} catch (final DbAccessException e) {
 			logger.error("Could not bulk save answers from queue.", e);
@@ -379,7 +374,7 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer>
 		answer.setContentId(content.getId());
 		answer.setRoomId(room.getId());
 		answerRepository.save(realAnswer);
-		this.publisher.publishEvent(new NewAnswerEvent(this, room, answer, user.getId(), content));
+		this.eventPublisher.publishEvent(new NewAnswerEvent(this, room, answer, user.getId(), content));
 
 		return answer;
 	}
@@ -399,7 +394,7 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer>
 		}
 		answerRepository.deleteById(answerId);
 
-		this.publisher.publishEvent(new DeleteAnswerEvent(this, room, content));
+		this.eventPublisher.publishEvent(new DeleteAnswerEvent(this, room, content));
 	}
 
 	/*
@@ -447,9 +442,4 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer>
 	public int countPreparationQuestionAnswersInternal(final String roomId) {
 		return answerRepository.countByRoomIdOnlyPreparationVariant(roomRepository.findOne(roomId).getId());
 	}
-
-	@Override
-	public void setApplicationEventPublisher(final ApplicationEventPublisher applicationEventPublisher) {
-		this.publisher = applicationEventPublisher;
-	}
 }
diff --git a/src/main/java/de/thm/arsnova/service/CommentServiceImpl.java b/src/main/java/de/thm/arsnova/service/CommentServiceImpl.java
index 725b1bc35b72dc67a4503060a43461e473a91969..8fbab006cda55003a732131d2f863c3eeeabacee 100644
--- a/src/main/java/de/thm/arsnova/service/CommentServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/CommentServiceImpl.java
@@ -11,8 +11,6 @@ import de.thm.arsnova.web.exceptions.ForbiddenException;
 import de.thm.arsnova.web.exceptions.NotFoundException;
 import de.thm.arsnova.web.exceptions.UnauthorizedException;
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.ApplicationEventPublisherAware;
 import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Service;
@@ -27,15 +25,13 @@ import java.util.Map;
  * Performs all comment related operations.
  */
 @Service
-public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implements CommentService, ApplicationEventPublisherAware {
+public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implements CommentService {
 	private UserService userService;
 
 	private CommentRepository commentRepository;
 
 	private RoomRepository roomRepository;
 
-	private ApplicationEventPublisher publisher;
-
 	public CommentServiceImpl(
 			CommentRepository repository,
 			RoomRepository roomRepository,
@@ -47,11 +43,6 @@ public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implem
 		this.userService = userService;
 	}
 
-	@Override
-	public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
-		this.publisher = applicationEventPublisher;
-	}
-
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public void prepareCreate(final Comment comment) {
@@ -76,7 +67,7 @@ public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implem
 
 		final Room room = roomRepository.findOne(comment.getRoomId());
 		final DeleteCommentEvent event = new DeleteCommentEvent(this, room, comment);
-		this.publisher.publishEvent(event);
+		this.eventPublisher.publishEvent(event);
 	}
 
 	@Override
diff --git a/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java b/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java
index 1b0aee13578d7e734743eb2b82d9acb71e721903..ea65cbe35889a5bc68bea4876eea08b7e770448a 100644
--- a/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java
@@ -34,8 +34,6 @@ import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.cache.annotation.Caching;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.ApplicationEventPublisherAware;
 import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.stereotype.Service;
@@ -54,7 +52,7 @@ import java.util.stream.Collectors;
  * Performs all content related operations.
  */
 @Service
-public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implements ContentService, ApplicationEventPublisherAware {
+public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implements ContentService {
 	private UserService userService;
 
 	private LogEntryRepository dbLogger;
@@ -65,8 +63,6 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 
 	private AnswerRepository answerRepository;
 
-	private ApplicationEventPublisher publisher;
-
 	private static final Logger logger = LoggerFactory.getLogger(ContentServiceImpl.class);
 
 	public ContentServiceImpl(
@@ -201,7 +197,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 		roomRepository.save(room);
 
 		final NewQuestionEvent event = new NewQuestionEvent(this, room, content);
-		this.publisher.publishEvent(event);
+		this.eventPublisher.publishEvent(event);
 	}
 
 	@Override
@@ -301,7 +297,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 		}
 
 		final DeleteQuestionEvent event = new DeleteQuestionEvent(this, room, content);
-		this.publisher.publishEvent(event);
+		this.eventPublisher.publishEvent(event);
 	}
 
 	@PreAuthorize("hasPermission(#session, 'owner')")
@@ -325,7 +321,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 		dbLogger.log("delete", "type", "answer", "answerCount", answerCount);
 
 		final DeleteAllQuestionsEvent event = new DeleteAllQuestionsEvent(this, room);
-		this.publisher.publishEvent(event);
+		this.eventPublisher.publishEvent(event);
 	}
 
 	@Override
@@ -375,7 +371,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 		} else {
 			event = new UnlockVoteEvent(this, room, content);
 		}
-		this.publisher.publishEvent(event);
+		this.eventPublisher.publishEvent(event);
 	}
 
 	@Override
@@ -405,7 +401,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 			} else {
 				event = new UnlockVotesEvent(this, room, list);
 			}
-			this.publisher.publishEvent(event);
+			this.eventPublisher.publishEvent(event);
 		} catch (IOException e) {
 			logger.error("Patching of contents failed", e);
 		}
@@ -506,7 +502,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 		} else {
 			event = new LockQuestionsEvent(this, room, list);
 		}
-		this.publisher.publishEvent(event);
+		this.eventPublisher.publishEvent(event);
 	}
 
 	/* TODO: Split and move answer part to AnswerService */
@@ -525,7 +521,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 		final List<String> contentIds = contents.stream().map(Content::getId).collect(Collectors.toList());
 		answerRepository.deleteAllAnswersForQuestions(contentIds);
 
-		this.publisher.publishEvent(new DeleteAllQuestionsAnswersEvent(this, room));
+		this.eventPublisher.publishEvent(new DeleteAllQuestionsAnswersEvent(this, room));
 	}
 
 	/* TODO: Split and move answer part to AnswerService */
@@ -541,7 +537,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 		final List<String> contentIds = contents.stream().map(Content::getId).collect(Collectors.toList());
 		answerRepository.deleteAllAnswersForQuestions(contentIds);
 
-		this.publisher.publishEvent(new DeleteAllPreparationAnswersEvent(this, room));
+		this.eventPublisher.publishEvent(new DeleteAllPreparationAnswersEvent(this, room));
 	}
 
 	/* TODO: Split and move answer part to AnswerService */
@@ -557,7 +553,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 		final List<String> contentIds = contents.stream().map(Content::getId).collect(Collectors.toList());
 		answerRepository.deleteAllAnswersForQuestions(contentIds);
 
-		this.publisher.publishEvent(new DeleteAllLectureAnswersEvent(this, room));
+		this.eventPublisher.publishEvent(new DeleteAllLectureAnswersEvent(this, room));
 	}
 
 	@Caching(evict = {
@@ -574,9 +570,4 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 		}
 		contentRepository.saveAll(contents);
 	}
-
-	@Override
-	public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
-		this.publisher = publisher;
-	}
 }
diff --git a/src/main/java/de/thm/arsnova/service/DefaultEntityServiceImpl.java b/src/main/java/de/thm/arsnova/service/DefaultEntityServiceImpl.java
index 9f11f884ba0477dc8facf99bd70416357a3bf461..3e1ab77461229d2f4f5247a7ea5b22f197e24c57 100644
--- a/src/main/java/de/thm/arsnova/service/DefaultEntityServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/DefaultEntityServiceImpl.java
@@ -20,9 +20,18 @@ package de.thm.arsnova.service;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectReader;
+import de.thm.arsnova.event.AfterCreationEvent;
+import de.thm.arsnova.event.AfterPatchEvent;
+import de.thm.arsnova.event.AfterUpdateEvent;
+import de.thm.arsnova.event.BeforeCreationEvent;
+import de.thm.arsnova.event.BeforeDeletionEvent;
+import de.thm.arsnova.event.BeforePatchEvent;
+import de.thm.arsnova.event.BeforeUpdateEvent;
 import de.thm.arsnova.model.Entity;
 import de.thm.arsnova.model.serialization.View;
 import de.thm.arsnova.persistence.CrudRepository;
+import org.springframework.context.ApplicationEventPublisher;
+import org.springframework.context.ApplicationEventPublisherAware;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.security.access.prepost.PreFilter;
 
@@ -38,9 +47,10 @@ import java.util.function.Function;
  * @param <T> Entity type
  * @author Daniel Gerhardt
  */
-public class DefaultEntityServiceImpl<T extends Entity> implements EntityService<T> {
+public class DefaultEntityServiceImpl<T extends Entity> implements EntityService<T>, ApplicationEventPublisherAware {
 	protected Class<T> type;
 	protected CrudRepository<T, String> repository;
+	protected ApplicationEventPublisher eventPublisher;
 	private ObjectMapper objectMapper;
 
 	public DefaultEntityServiceImpl(Class<T> type, CrudRepository<T, String> repository, ObjectMapper objectMapper) {
@@ -82,7 +92,9 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 		entity.setCreationTimestamp(new Date());
 
 		prepareCreate(entity);
+		eventPublisher.publishEvent(new BeforeCreationEvent<>(entity));
 		final T createdEntity = repository.save(entity);
+		eventPublisher.publishEvent(new AfterCreationEvent<>(createdEntity));
 		finalizeCreate(entity);
 
 		return createdEntity;
@@ -117,7 +129,9 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 		newEntity.setUpdateTimestamp(new Date());
 
 		prepareUpdate(newEntity);
+		eventPublisher.publishEvent(new BeforeUpdateEvent<>(newEntity));
 		final T updatedEntity = repository.save(newEntity);
+		eventPublisher.publishEvent(new AfterUpdateEvent<>(updatedEntity));
 		finalizeUpdate(updatedEntity);
 
 		return updatedEntity;
@@ -156,8 +170,11 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 		reader.readValue(tree);
 		entity.setUpdateTimestamp(new Date());
 		preparePatch(entity);
+		eventPublisher.publishEvent(new BeforePatchEvent<>(entity));
+		final T patchedEntity = repository.save(entity);
+		eventPublisher.publishEvent(new AfterPatchEvent<>(entity));
 
-		return repository.save(entity);
+		return patchedEntity;
 	}
 
 	@Override
@@ -176,6 +193,7 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 			reader.readValue(tree);
 			entity.setUpdateTimestamp(new Date());
 			preparePatch(entity);
+			eventPublisher.publishEvent(new BeforePatchEvent<>(entity));
 		}
 
 		return repository.saveAll(entities);
@@ -194,7 +212,9 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 	@Override
 	@PreAuthorize("hasPermission(#entity, 'delete')")
 	public void delete(final T entity) {
+		eventPublisher.publishEvent(new BeforeDeletionEvent<>(entity));
 		repository.delete(entity);
+		eventPublisher.publishEvent(new AfterUpdateEvent<>(entity));
 	}
 
 	/**
@@ -209,4 +229,9 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 	public String getTypeName() {
 		return type.getSimpleName().toLowerCase();
 	}
+
+	@Override
+	public void setApplicationEventPublisher(final ApplicationEventPublisher applicationEventPublisher) {
+		this.eventPublisher = applicationEventPublisher;
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/service/RoomServiceImpl.java b/src/main/java/de/thm/arsnova/service/RoomServiceImpl.java
index f5d566f3f05ba6441b1374d7d2713452d00a222e..4f6e2f96e2501c8ded24ab8eb51c7e45ed1f21ec 100644
--- a/src/main/java/de/thm/arsnova/service/RoomServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/RoomServiceImpl.java
@@ -47,8 +47,6 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
 import org.springframework.cache.annotation.Caching;
-import org.springframework.context.ApplicationEventPublisher;
-import org.springframework.context.ApplicationEventPublisherAware;
 import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.security.access.prepost.PreAuthorize;
@@ -67,7 +65,7 @@ import java.util.stream.Collectors;
  * Performs all room related operations.
  */
 @Service
-public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements RoomService, ApplicationEventPublisherAware {
+public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements RoomService {
 	private static final long ROOM_INACTIVITY_CHECK_INTERVAL_MS = 30 * 60 * 1000L;
 
 	private static final Logger logger = LoggerFactory.getLogger(RoomServiceImpl.class);
@@ -96,8 +94,6 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 	@Value("${pp.logofilesize_b}")
 	private int uploadFileSizeByte;
 
-	private ApplicationEventPublisher publisher;
-
 	public RoomServiceImpl(
 			RoomRepository repository,
 			ContentRepository contentRepository,
@@ -407,7 +403,7 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 	public Room setActive(final String id, final Boolean lock) {
 		final Room room = roomRepository.findOne(id);
 		room.setClosed(!lock);
-		this.publisher.publishEvent(new StatusRoomEvent(this, room));
+		this.eventPublisher.publishEvent(new StatusRoomEvent(this, room));
 		roomRepository.save(room);
 
 		return room;
@@ -462,7 +458,7 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 		logger.debug("Deleted room document {} and related data.", room.getId());
 		dbLogger.log("delete", "type", "session", "id", room.getId());
 
-		this.publisher.publishEvent(new DeleteRoomEvent(this, room));
+		this.eventPublisher.publishEvent(new DeleteRoomEvent(this, room));
 
 		return count;
 	}
@@ -511,11 +507,6 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 		return roomRepository.importRoom(user.getId(), temp);
 	}
 
-	@Override
-	public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
-		this.publisher = publisher;
-	}
-
 	@Override
 	@PreAuthorize("hasPermission(#id, 'room', 'read')")
 	public Room.Settings getFeatures(String id) {
@@ -527,7 +518,7 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 	public Room.Settings updateFeatures(String id, Room.Settings settings) {
 		final Room room = roomRepository.findOne(id);
 		room.setSettings(settings);
-		this.publisher.publishEvent(new FeatureChangeEvent(this, room));
+		this.eventPublisher.publishEvent(new FeatureChangeEvent(this, room));
 		roomRepository.save(room);
 
 		return room.getSettings();
@@ -542,7 +533,7 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 		}
 
 		room.getSettings().setFeedbackLocked(lock);
-		this.publisher.publishEvent(new LockFeedbackEvent(this, room));
+		this.eventPublisher.publishEvent(new LockFeedbackEvent(this, room));
 		roomRepository.save(room);
 
 		return room.getSettings().isFeedbackLocked();
@@ -552,7 +543,7 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 	@PreAuthorize("hasPermission(#id, 'room', 'owner')")
 	public boolean flipFlashcards(String id, Boolean flip) {
 		final Room room = roomRepository.findOne(id);
-		this.publisher.publishEvent(new FlipFlashcardsEvent(this, room));
+		this.eventPublisher.publishEvent(new FlipFlashcardsEvent(this, room));
 
 		return flip;
 	}
diff --git a/src/test/java/de/thm/arsnova/service/DefaultEntityServiceImplTest.java b/src/test/java/de/thm/arsnova/service/DefaultEntityServiceImplTest.java
index 7af352356079ee807e99d0cd7ac24183bacc5d4a..90cd9d197c34495a3c83c8ab433531e74bd5cb40 100644
--- a/src/test/java/de/thm/arsnova/service/DefaultEntityServiceImplTest.java
+++ b/src/test/java/de/thm/arsnova/service/DefaultEntityServiceImplTest.java
@@ -12,6 +12,7 @@ import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.test.context.ActiveProfiles;
 import org.springframework.test.context.ContextConfiguration;
@@ -39,6 +40,9 @@ public class DefaultEntityServiceImplTest {
 	@Qualifier("defaultJsonMessageConverter")
 	private MappingJackson2HttpMessageConverter jackson2HttpMessageConverter;
 
+	@Autowired
+	private ApplicationEventPublisher eventPublisher;
+
 	@Autowired
 	private RoomRepository roomRepository;
 
@@ -47,6 +51,7 @@ public class DefaultEntityServiceImplTest {
 	public void testPatch() throws IOException {
 		final ObjectMapper objectMapper = jackson2HttpMessageConverter.getObjectMapper();
 		final DefaultEntityServiceImpl<Room> entityService = new DefaultEntityServiceImpl<>(Room.class, roomRepository, objectMapper);
+		entityService.setApplicationEventPublisher(eventPublisher);
 
 		when(roomRepository.save(any(Room.class))).then(returnsFirstArg());
 
@@ -80,6 +85,7 @@ public class DefaultEntityServiceImplTest {
 	public void testPatchWithList() throws IOException {
 		final ObjectMapper objectMapper = jackson2HttpMessageConverter.getObjectMapper();
 		final DefaultEntityServiceImpl<Room> entityService = new DefaultEntityServiceImpl<>(Room.class, roomRepository, objectMapper);
+		entityService.setApplicationEventPublisher(eventPublisher);
 
 		when(roomRepository.save(any(Room.class))).then(returnsFirstArg());