diff --git a/src/main/java/de/thm/arsnova/cache/CacheBusterImpl.java b/src/main/java/de/thm/arsnova/cache/CacheBusterImpl.java
index 719a3ed968597f83517aadce83e2b397e5c49886..32f2b858b699fb432601668b1ec160def3d1ef84 100644
--- a/src/main/java/de/thm/arsnova/cache/CacheBusterImpl.java
+++ b/src/main/java/de/thm/arsnova/cache/CacheBusterImpl.java
@@ -19,6 +19,7 @@ package de.thm.arsnova.cache;
 
 import de.thm.arsnova.event.*;
 import org.springframework.cache.annotation.CacheEvict;
+import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Component;
 
 /**
@@ -26,105 +27,29 @@ import org.springframework.stereotype.Component;
  * caches, e.g, for a specific session.
  */
 @Component
-public class CacheBusterImpl implements CacheBuster, ArsnovaEventVisitor {
+public class CacheBusterImpl implements CacheBuster {
 
 	@CacheEvict(value = "statistics", allEntries = true)
-	@Override
-	public void visit(NewCommentEvent event) { }
+	@EventListener
+	public void handleNewComment(NewCommentEvent event) { }
 
 	@CacheEvict(value = "statistics", allEntries = true)
-	@Override
-	public void visit(DeleteCommentEvent event) { }
-
-	@Override
-	public void visit(NewQuestionEvent event) { }
-
-	@Override
-	public void visit(UnlockQuestionEvent event) { }
-
-	@Override
-	public void visit(UnlockQuestionsEvent newQuestionsEvent) { }
-
-	@Override
-	public void visit(LockQuestionEvent lockQuestionEvent) { }
-
-	@Override
-	public void visit(LockQuestionsEvent lockQuestionsEvent) { }
+	@EventListener
+	public void handleDeleteComment(DeleteCommentEvent event) { }
 
 	@CacheEvict(value = "answerlists", key = "#event.content.id")
-	@Override
-	public void visit(NewAnswerEvent event) { }
-
-	@Override
-	public void visit(DeleteAnswerEvent event) { }
-
-	@Override
-	public void visit(DeleteQuestionEvent event) { }
-
-	@Override
-	public void visit(DeleteAllQuestionsEvent event) { }
-
-	@Override
-	public void visit(DeleteAllQuestionsAnswersEvent event) { }
-
-	@Override
-	public void visit(DeleteAllPreparationAnswersEvent event) { }
-
-	@Override
-	public void visit(DeleteAllLectureAnswersEvent event) { }
-
-	@Override
-	public void visit(NewFeedbackEvent event) { }
-
-	@Override
-	public void visit(DeleteFeedbackForRoomsEvent event) { }
-
-	@Override
-	public void visit(StatusRoomEvent event) { }
+	@EventListener
+	public void handleNewAnswer(NewAnswerEvent event) { }
 
 	@CacheEvict(value = "statistics", allEntries = true)
-	@Override
-	public void visit(ChangeScoreEvent changeLearningProgress) { }
-
-	@Override
-	public void visit(PiRoundDelayedStartEvent piRoundDelayedStartEvent) { }
-
-	@Override
-	public void visit(PiRoundEndEvent piRoundEndEvent) { }
-
-	@Override
-	public void visit(PiRoundCancelEvent piRoundCancelEvent) { }
-
-	@Override
-	public void visit(PiRoundResetEvent piRoundResetEvent) { }
+	@EventListener
+	public void handleChangeScore(ChangeScoreEvent changeLearningProgress) { }
 
 	@CacheEvict(value = "statistics", allEntries = true)
-	@Override
-	public void visit(NewRoomEvent newSessionEvent) { }
+	@EventListener
+	public void handleewRoom(NewRoomEvent newSessionEvent) { }
 
 	@CacheEvict(value = "statistics", allEntries = true)
-	@Override
-	public void visit(DeleteRoomEvent deleteSessionEvent) { }
-
-	@Override
-	public void visit(LockVoteEvent lockVoteEvent) { }
-
-	@Override
-	public void visit(LockVotesEvent lockVotesEvent) { }
-
-	@Override
-	public void visit(UnlockVoteEvent unlockVoteEvent) { }
-
-	@Override
-	public void visit(UnlockVotesEvent unlockVotesEvent) { }
-
-	@Override
-	public void visit(FeatureChangeEvent featureChangeEvent) { }
-
-	@Override
-	public void visit(LockFeedbackEvent lockFeedbackEvent) { }
-
-	@Override
-	public void visit(FlipFlashcardsEvent flipFlashcardsEvent) { }
-
+	@EventListener
+	public void handleDeleteRoom(DeleteRoomEvent deleteSessionEvent) { }
 }
diff --git a/src/main/java/de/thm/arsnova/cache/CacheBusterListener.java b/src/main/java/de/thm/arsnova/cache/CacheBusterListener.java
deleted file mode 100644
index 07baa649958ad208a6b5b4157a24810638113e5a..0000000000000000000000000000000000000000
--- a/src/main/java/de/thm/arsnova/cache/CacheBusterListener.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * This file is part of ARSnova Backend.
- * Copyright (C) 2012-2018 The ARSnova Team and Contributors
- *
- * ARSnova Backend is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * ARSnova Backend is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package de.thm.arsnova.cache;
-
-import de.thm.arsnova.event.ArsnovaEvent;
-import de.thm.arsnova.event.ArsnovaEventVisitor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationListener;
-import org.springframework.stereotype.Component;
-
-/**
- * Listener registration for the cache buster.
- *
- * Note that this class is necessary in order for the annotations to work.
- */
-@Component
-public class CacheBusterListener implements ApplicationListener<ArsnovaEvent> {
-
-	@Autowired
-	private CacheBuster cacheBuster;
-
-	@Override
-	public void onApplicationEvent(ArsnovaEvent event) {
-		event.accept((ArsnovaEventVisitor) cacheBuster);
-	}
-
-}
diff --git a/src/main/java/de/thm/arsnova/config/AppConfig.java b/src/main/java/de/thm/arsnova/config/AppConfig.java
index 2df34dc2e72064282d4b9e439f31db0ef4506207..5b333883359dcc97dabd364adce5ebede952d4af 100644
--- a/src/main/java/de/thm/arsnova/config/AppConfig.java
+++ b/src/main/java/de/thm/arsnova/config/AppConfig.java
@@ -34,7 +34,6 @@ import de.thm.arsnova.web.PathApiVersionContentNegotiationStrategy;
 import de.thm.arsnova.web.ResponseInterceptorHandler;
 import de.thm.arsnova.websocket.ArsnovaSocketioServer;
 import de.thm.arsnova.websocket.ArsnovaSocketioServerImpl;
-import de.thm.arsnova.websocket.ArsnovaSocketioServerListener;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.beans.factory.config.PropertiesFactoryBean;
@@ -275,11 +274,6 @@ public class AppConfig implements WebMvcConfigurer {
 		return socketioServer;
 	}
 
-	@Bean
-	public ArsnovaSocketioServerListener arsnovaSocketListener() {
-		return new ArsnovaSocketioServerListener();
-	}
-
 	@Bean
 	public CacheManager cacheManager() {
 		return new ConcurrentMapCacheManager();
diff --git a/src/main/java/de/thm/arsnova/event/ArsnovaEvent.java b/src/main/java/de/thm/arsnova/event/ArsnovaEvent.java
index 8c5ac9498433190c1b722cf73a3363016c82405e..f6d6f6e795258f5fee8d36c03fa16743567e8b2f 100644
--- a/src/main/java/de/thm/arsnova/event/ArsnovaEvent.java
+++ b/src/main/java/de/thm/arsnova/event/ArsnovaEvent.java
@@ -30,6 +30,4 @@ public abstract class ArsnovaEvent extends ApplicationEvent {
 		super(source);
 	}
 
-	public abstract void accept(ArsnovaEventVisitor visitor);
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/ArsnovaEventVisitor.java b/src/main/java/de/thm/arsnova/event/ArsnovaEventVisitor.java
deleted file mode 100644
index 4587c4284920c0038a4a3a4f410a9fb913321899..0000000000000000000000000000000000000000
--- a/src/main/java/de/thm/arsnova/event/ArsnovaEventVisitor.java
+++ /dev/null
@@ -1,86 +0,0 @@
-/*
- * This file is part of ARSnova Backend.
- * Copyright (C) 2012-2018 The ARSnova Team and Contributors
- *
- * ARSnova Backend is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * ARSnova Backend is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package de.thm.arsnova.event;
-
-/**
- * Listeners wanting to receive ARSnova's internal events should implement this interface.
- */
-public interface ArsnovaEventVisitor {
-
-	void visit(NewCommentEvent newCommentEvent);
-
-	void visit(DeleteCommentEvent deleteCommentEvent);
-
-	void visit(NewQuestionEvent newQuestionEvent);
-
-	void visit(UnlockQuestionEvent unlockQuestionEvent);
-
-	void visit(UnlockQuestionsEvent newQuestionsEvent);
-
-	void visit(LockQuestionEvent lockQuestionEvent);
-
-	void visit(LockQuestionsEvent lockQuestionsEvent);
-
-	void visit(NewAnswerEvent newAnswerEvent);
-
-	void visit(DeleteAnswerEvent deleteAnswerEvent);
-
-	void visit(DeleteQuestionEvent deleteQuestionEvent);
-
-	void visit(DeleteAllQuestionsEvent deleteAllQuestionsEvent);
-
-	void visit(DeleteAllQuestionsAnswersEvent deleteAllAnswersEvent);
-
-	void visit(DeleteAllPreparationAnswersEvent deleteAllPreparationAnswersEvent);
-
-	void visit(DeleteAllLectureAnswersEvent deleteAllLectureAnswersEvent);
-
-	void visit(NewFeedbackEvent newFeedbackEvent);
-
-	void visit(DeleteFeedbackForRoomsEvent deleteFeedbackEvent);
-
-	void visit(StatusRoomEvent statusSessionEvent);
-
-	void visit(ChangeScoreEvent changeLearningProgress);
-
-	void visit(PiRoundDelayedStartEvent piRoundDelayedStartEvent);
-
-	void visit(PiRoundEndEvent piRoundEndEvent);
-
-	void visit(PiRoundCancelEvent piRoundCancelEvent);
-
-	void visit(PiRoundResetEvent piRoundResetEvent);
-
-	void visit(NewRoomEvent newSessionEvent);
-
-	void visit(DeleteRoomEvent deleteSessionEvent);
-
-	void visit(LockVoteEvent lockVoteEvent);
-
-	void visit(LockVotesEvent lockVotesEvent);
-
-	void visit(UnlockVoteEvent unlockVoteEvent);
-
-	void visit(UnlockVotesEvent unlockVotesEvent);
-
-	void visit(FeatureChangeEvent featureChangeEvent);
-
-	void visit(LockFeedbackEvent lockFeedbackEvent);
-
-	void visit(FlipFlashcardsEvent flipFlashcardsEvent);
-}
diff --git a/src/main/java/de/thm/arsnova/event/ChangeScoreEvent.java b/src/main/java/de/thm/arsnova/event/ChangeScoreEvent.java
index e67fc341e88ff29f1307420f4c4324610f9d1007..46cbaf639c533957e6b98b6c6adb4f267a8af75b 100644
--- a/src/main/java/de/thm/arsnova/event/ChangeScoreEvent.java
+++ b/src/main/java/de/thm/arsnova/event/ChangeScoreEvent.java
@@ -30,9 +30,4 @@ public class ChangeScoreEvent extends RoomEvent {
 		super(source, room);
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/DeleteAllLectureAnswersEvent.java b/src/main/java/de/thm/arsnova/event/DeleteAllLectureAnswersEvent.java
index 210ede956a073bcec5187689831ca07fa8b623a9..3ed09bb704b4ebaa347e8ef6c1e909e51f327522 100644
--- a/src/main/java/de/thm/arsnova/event/DeleteAllLectureAnswersEvent.java
+++ b/src/main/java/de/thm/arsnova/event/DeleteAllLectureAnswersEvent.java
@@ -30,9 +30,4 @@ public class DeleteAllLectureAnswersEvent extends RoomEvent {
 		super(source, room);
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/DeleteAllPreparationAnswersEvent.java b/src/main/java/de/thm/arsnova/event/DeleteAllPreparationAnswersEvent.java
index 94d7a67c445e2ae7840853496b752879ea4a19ef..a85f12e2f988013b1e0e170b48d794fbb24c6392 100644
--- a/src/main/java/de/thm/arsnova/event/DeleteAllPreparationAnswersEvent.java
+++ b/src/main/java/de/thm/arsnova/event/DeleteAllPreparationAnswersEvent.java
@@ -29,9 +29,4 @@ public class DeleteAllPreparationAnswersEvent extends RoomEvent {
 	public DeleteAllPreparationAnswersEvent(Object source, Room room) {
 		super(source, room);
 	}
-
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/DeleteAllQuestionsAnswersEvent.java b/src/main/java/de/thm/arsnova/event/DeleteAllQuestionsAnswersEvent.java
index eb587c21300acfb74c21367a55670e2b6d8b6287..bf7142ed628ab77fa9bb6d2b2196b42730bc509f 100644
--- a/src/main/java/de/thm/arsnova/event/DeleteAllQuestionsAnswersEvent.java
+++ b/src/main/java/de/thm/arsnova/event/DeleteAllQuestionsAnswersEvent.java
@@ -29,9 +29,4 @@ public class DeleteAllQuestionsAnswersEvent extends RoomEvent {
 	public DeleteAllQuestionsAnswersEvent(Object source, Room room) {
 		super(source, room);
 	}
-
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/DeleteAllQuestionsEvent.java b/src/main/java/de/thm/arsnova/event/DeleteAllQuestionsEvent.java
index 7dd76e612659c55ee4fcf9f43feefafe3428a44f..a6cd9558a2adeab4c0d9b89e283a072c60bbb805 100644
--- a/src/main/java/de/thm/arsnova/event/DeleteAllQuestionsEvent.java
+++ b/src/main/java/de/thm/arsnova/event/DeleteAllQuestionsEvent.java
@@ -31,9 +31,4 @@ public class DeleteAllQuestionsEvent extends RoomEvent {
 		super(source, room);
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/DeleteAnswerEvent.java b/src/main/java/de/thm/arsnova/event/DeleteAnswerEvent.java
index eb9f816bffc8a8db93820c77ef0f69ad47e9ebc9..8a7aa4ba1a3cf2ffc752fedd71b7be19f7cb9eec 100644
--- a/src/main/java/de/thm/arsnova/event/DeleteAnswerEvent.java
+++ b/src/main/java/de/thm/arsnova/event/DeleteAnswerEvent.java
@@ -34,11 +34,6 @@ public class DeleteAnswerEvent extends RoomEvent {
 		this.content = content;
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 	public Content getQuestion() {
 		return content;
 	}
diff --git a/src/main/java/de/thm/arsnova/event/DeleteCommentEvent.java b/src/main/java/de/thm/arsnova/event/DeleteCommentEvent.java
index f62f3c64e39bb1cd39b583208ed7f3154fdc72f1..82ba83d101334b36facfb53fe06b0070771780e5 100644
--- a/src/main/java/de/thm/arsnova/event/DeleteCommentEvent.java
+++ b/src/main/java/de/thm/arsnova/event/DeleteCommentEvent.java
@@ -34,11 +34,6 @@ public class DeleteCommentEvent extends RoomEvent {
 		this.comment = comment;
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 	public Comment getQuestion() {
 		return comment;
 	}
diff --git a/src/main/java/de/thm/arsnova/event/DeleteFeedbackForRoomsEvent.java b/src/main/java/de/thm/arsnova/event/DeleteFeedbackForRoomsEvent.java
index 38b5cfca9f725d761743b75f8b571ab68566d134..1bf0314506296b5fb623a2d09570f286d4a82d64 100644
--- a/src/main/java/de/thm/arsnova/event/DeleteFeedbackForRoomsEvent.java
+++ b/src/main/java/de/thm/arsnova/event/DeleteFeedbackForRoomsEvent.java
@@ -46,9 +46,4 @@ public class DeleteFeedbackForRoomsEvent extends ArsnovaEvent {
 		return userId;
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/DeleteQuestionEvent.java b/src/main/java/de/thm/arsnova/event/DeleteQuestionEvent.java
index b2a40f6cfb769c00ed2088e03ce7e5b078b6f8de..bfafb5fe706c94fb3a1b292d20562435a25ea482 100644
--- a/src/main/java/de/thm/arsnova/event/DeleteQuestionEvent.java
+++ b/src/main/java/de/thm/arsnova/event/DeleteQuestionEvent.java
@@ -38,9 +38,4 @@ public class DeleteQuestionEvent extends RoomEvent {
 		return this.content;
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/DeleteRoomEvent.java b/src/main/java/de/thm/arsnova/event/DeleteRoomEvent.java
index 2e470d680689775efbed767fe7438031820a15e7..a650c51a6d55a17273df313b4e5b86f81e2ca556 100644
--- a/src/main/java/de/thm/arsnova/event/DeleteRoomEvent.java
+++ b/src/main/java/de/thm/arsnova/event/DeleteRoomEvent.java
@@ -31,9 +31,4 @@ public class DeleteRoomEvent extends RoomEvent {
 		super(source, room);
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/FeatureChangeEvent.java b/src/main/java/de/thm/arsnova/event/FeatureChangeEvent.java
index 890425edb912f192e319556de5bfa98d6c52f76c..447631a91ab42bddf8a90f2c253ff45931952d53 100644
--- a/src/main/java/de/thm/arsnova/event/FeatureChangeEvent.java
+++ b/src/main/java/de/thm/arsnova/event/FeatureChangeEvent.java
@@ -30,9 +30,4 @@ public class FeatureChangeEvent extends RoomEvent {
 		super(source, room);
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/FlipFlashcardsEvent.java b/src/main/java/de/thm/arsnova/event/FlipFlashcardsEvent.java
index 10a17302f4be7e243e88980ea120e5a779c6161a..5b94f9a21e4d3f1c2448fc3199d16ee263aaed8c 100644
--- a/src/main/java/de/thm/arsnova/event/FlipFlashcardsEvent.java
+++ b/src/main/java/de/thm/arsnova/event/FlipFlashcardsEvent.java
@@ -29,9 +29,4 @@ public class FlipFlashcardsEvent extends RoomEvent {
 	public FlipFlashcardsEvent(Object source, Room room) {
 		super(source, room);
 	}
-
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/LockFeedbackEvent.java b/src/main/java/de/thm/arsnova/event/LockFeedbackEvent.java
index b7a39b6b92b2dcc27d7794e1045bdce9ab47317e..1f907db30dd45109f78d841af905703dff368a6b 100644
--- a/src/main/java/de/thm/arsnova/event/LockFeedbackEvent.java
+++ b/src/main/java/de/thm/arsnova/event/LockFeedbackEvent.java
@@ -29,9 +29,4 @@ public class LockFeedbackEvent extends RoomEvent {
 	public LockFeedbackEvent(Object source, Room room) {
 		super(source, room);
 	}
-
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/LockQuestionEvent.java b/src/main/java/de/thm/arsnova/event/LockQuestionEvent.java
index 54bc9ff6a955fbbcdcad17561aeef794eb0df7a4..2b0e38bd4c261b7af20efa8b31f1effd1b23e0f5 100644
--- a/src/main/java/de/thm/arsnova/event/LockQuestionEvent.java
+++ b/src/main/java/de/thm/arsnova/event/LockQuestionEvent.java
@@ -38,9 +38,4 @@ public class LockQuestionEvent extends RoomEvent {
 		return this.content;
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/LockQuestionsEvent.java b/src/main/java/de/thm/arsnova/event/LockQuestionsEvent.java
index 8c892967d3a15bec451edbfbef972783cb08701e..fb27e4e6cf5c31cba98dadb4ddafef2b2f40d475 100644
--- a/src/main/java/de/thm/arsnova/event/LockQuestionsEvent.java
+++ b/src/main/java/de/thm/arsnova/event/LockQuestionsEvent.java
@@ -40,9 +40,4 @@ public class LockQuestionsEvent extends RoomEvent {
 		return this.contents;
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/LockVoteEvent.java b/src/main/java/de/thm/arsnova/event/LockVoteEvent.java
index 1463e12e01dd0f6cf22953844ba0971c32b05aa4..07456ac7b7f52605f596df1375088eb402c1db18 100644
--- a/src/main/java/de/thm/arsnova/event/LockVoteEvent.java
+++ b/src/main/java/de/thm/arsnova/event/LockVoteEvent.java
@@ -59,9 +59,4 @@ public class LockVoteEvent extends RoomEvent {
 		map.put("variant", getGroup());
 		return map;
 	}
-
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/LockVotesEvent.java b/src/main/java/de/thm/arsnova/event/LockVotesEvent.java
index a18cf149938191b846924c2e7d8853bbc6b08f38..ebff38234b700147bbdd1957e78c1e488ad5d3a6 100644
--- a/src/main/java/de/thm/arsnova/event/LockVotesEvent.java
+++ b/src/main/java/de/thm/arsnova/event/LockVotesEvent.java
@@ -40,9 +40,4 @@ public class LockVotesEvent extends RoomEvent {
 		return this.contents;
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/NewAnswerEvent.java b/src/main/java/de/thm/arsnova/event/NewAnswerEvent.java
index bdf775c000745d33460d7db85de805cdb0dab7ee..462494d9854ce5dc609f7bce65bef97e640cc378 100644
--- a/src/main/java/de/thm/arsnova/event/NewAnswerEvent.java
+++ b/src/main/java/de/thm/arsnova/event/NewAnswerEvent.java
@@ -41,11 +41,6 @@ public class NewAnswerEvent extends RoomEvent {
 		this.content = content;
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 	public Answer getAnswer() {
 		return answer;
 	}
diff --git a/src/main/java/de/thm/arsnova/event/NewCommentEvent.java b/src/main/java/de/thm/arsnova/event/NewCommentEvent.java
index 3ad2620eaeb8cc8476fc0fea0b4dc41abc19dbdf..0ccf30272328b99e76767b984d9fea397295683a 100644
--- a/src/main/java/de/thm/arsnova/event/NewCommentEvent.java
+++ b/src/main/java/de/thm/arsnova/event/NewCommentEvent.java
@@ -38,9 +38,4 @@ public class NewCommentEvent extends RoomEvent {
 		return comment;
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/NewFeedbackEvent.java b/src/main/java/de/thm/arsnova/event/NewFeedbackEvent.java
index f9bcdc5254a862cc7e99e3b848aa032a382bccf7..d663f2bb5d0607366800fa91b04e0bd2ce5a9d65 100644
--- a/src/main/java/de/thm/arsnova/event/NewFeedbackEvent.java
+++ b/src/main/java/de/thm/arsnova/event/NewFeedbackEvent.java
@@ -30,9 +30,4 @@ public class NewFeedbackEvent extends RoomEvent {
 		super(source, room);
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/NewQuestionEvent.java b/src/main/java/de/thm/arsnova/event/NewQuestionEvent.java
index 4cf0da993809f66cc4698e2608d586742c1cfc98..53281dceaaea6ad74dc49dd769509f22cf0ae821 100644
--- a/src/main/java/de/thm/arsnova/event/NewQuestionEvent.java
+++ b/src/main/java/de/thm/arsnova/event/NewQuestionEvent.java
@@ -37,9 +37,4 @@ public class NewQuestionEvent extends RoomEvent {
 	public Content getQuestion() {
 		return content;
 	}
-
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/NewRoomEvent.java b/src/main/java/de/thm/arsnova/event/NewRoomEvent.java
index 4dd067ba6fa1fff1c32979aa1b8097c4247bdc1d..222fa7c0fdc7c16f55483e9299dc9780cd79f43e 100644
--- a/src/main/java/de/thm/arsnova/event/NewRoomEvent.java
+++ b/src/main/java/de/thm/arsnova/event/NewRoomEvent.java
@@ -30,9 +30,4 @@ public class NewRoomEvent extends RoomEvent {
 		super(source, room);
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/PiRoundCancelEvent.java b/src/main/java/de/thm/arsnova/event/PiRoundCancelEvent.java
index 969d4a68aa092872a2be4223776db477c795a93f..27cf4351d875d413fe5f037e803943f1c2e5b51f 100644
--- a/src/main/java/de/thm/arsnova/event/PiRoundCancelEvent.java
+++ b/src/main/java/de/thm/arsnova/event/PiRoundCancelEvent.java
@@ -31,9 +31,4 @@ public class PiRoundCancelEvent extends PiRoundEndEvent {
 		super(source, room, content);
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/PiRoundDelayedStartEvent.java b/src/main/java/de/thm/arsnova/event/PiRoundDelayedStartEvent.java
index b8880c367497ac6cf20b09a5c527cef41b0251a6..43ac5f59bf4eb4e4681dd9effdc975f86ac451c9 100644
--- a/src/main/java/de/thm/arsnova/event/PiRoundDelayedStartEvent.java
+++ b/src/main/java/de/thm/arsnova/event/PiRoundDelayedStartEvent.java
@@ -47,11 +47,6 @@ public class PiRoundDelayedStartEvent extends RoomEvent {
 		this.startTime = new Date();
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 	public String getQuestionId() {
 		return questionId;
 	}
diff --git a/src/main/java/de/thm/arsnova/event/PiRoundEndEvent.java b/src/main/java/de/thm/arsnova/event/PiRoundEndEvent.java
index ebd864bf7ea003de4cfba5a525956b549008bf20..064ba458d611d2b9dd0f4567073f73e265ed4078 100644
--- a/src/main/java/de/thm/arsnova/event/PiRoundEndEvent.java
+++ b/src/main/java/de/thm/arsnova/event/PiRoundEndEvent.java
@@ -40,11 +40,6 @@ public class PiRoundEndEvent extends RoomEvent {
 		this.group = content.getGroups().toArray(new String[1])[0];
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 	public String getContentId() {
 		return contentId;
 	}
diff --git a/src/main/java/de/thm/arsnova/event/PiRoundResetEvent.java b/src/main/java/de/thm/arsnova/event/PiRoundResetEvent.java
index a7045abfd4da888dec2a42c6274924996c7533d1..4d5d773ea302d36a4bdf5661242793e7d4f5f1c5 100644
--- a/src/main/java/de/thm/arsnova/event/PiRoundResetEvent.java
+++ b/src/main/java/de/thm/arsnova/event/PiRoundResetEvent.java
@@ -40,11 +40,6 @@ public class PiRoundResetEvent extends RoomEvent {
 		this.group = content.getGroups().toArray(new String[1])[0];
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 	public String getContentId() {
 		return contentId;
 	}
diff --git a/src/main/java/de/thm/arsnova/event/StatusRoomEvent.java b/src/main/java/de/thm/arsnova/event/StatusRoomEvent.java
index a981d2f31022df067147d200a3f0cb1e5d21f5e2..d91026fde9c00daaab7fc1347e9f684e96581102 100644
--- a/src/main/java/de/thm/arsnova/event/StatusRoomEvent.java
+++ b/src/main/java/de/thm/arsnova/event/StatusRoomEvent.java
@@ -30,9 +30,4 @@ public class StatusRoomEvent extends RoomEvent {
 		super(source, room);
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/UnlockQuestionEvent.java b/src/main/java/de/thm/arsnova/event/UnlockQuestionEvent.java
index 5e09ed349ffb1b08f8c1ffbbaa131d584013c4df..3a53ff4427d17f2c6a746e8287c26b674e1fc8e0 100644
--- a/src/main/java/de/thm/arsnova/event/UnlockQuestionEvent.java
+++ b/src/main/java/de/thm/arsnova/event/UnlockQuestionEvent.java
@@ -38,9 +38,4 @@ public class UnlockQuestionEvent extends RoomEvent {
 		return this.content;
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/UnlockQuestionsEvent.java b/src/main/java/de/thm/arsnova/event/UnlockQuestionsEvent.java
index a4e5d8c6a1916b3d07f8b33794af26f2fd2dcc75..50c66f05acd183039a483eb19198349e7d67b6b8 100644
--- a/src/main/java/de/thm/arsnova/event/UnlockQuestionsEvent.java
+++ b/src/main/java/de/thm/arsnova/event/UnlockQuestionsEvent.java
@@ -40,9 +40,4 @@ public class UnlockQuestionsEvent extends RoomEvent {
 		return this.contents;
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/event/UnlockVoteEvent.java b/src/main/java/de/thm/arsnova/event/UnlockVoteEvent.java
index 962f7c54678b7a10cca7ef7b890d56489ef48270..d6206d6db140b09396f8a159b590e91fa8f1ae4b 100644
--- a/src/main/java/de/thm/arsnova/event/UnlockVoteEvent.java
+++ b/src/main/java/de/thm/arsnova/event/UnlockVoteEvent.java
@@ -57,9 +57,4 @@ public class UnlockVoteEvent extends RoomEvent {
 		map.put("variant", getGroup());
 		return map;
 	}
-
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
 }
diff --git a/src/main/java/de/thm/arsnova/event/UnlockVotesEvent.java b/src/main/java/de/thm/arsnova/event/UnlockVotesEvent.java
index fdc50180ad5b8caf777ce001919f56cdefe8ca65..cf5fe5f2c95e3c9575eb1b908e167c0d75e14de1 100644
--- a/src/main/java/de/thm/arsnova/event/UnlockVotesEvent.java
+++ b/src/main/java/de/thm/arsnova/event/UnlockVotesEvent.java
@@ -40,9 +40,4 @@ public class UnlockVotesEvent extends RoomEvent {
 		return this.contents;
 	}
 
-	@Override
-	public void accept(ArsnovaEventVisitor visitor) {
-		visitor.visit(this);
-	}
-
 }
diff --git a/src/main/java/de/thm/arsnova/service/score/ScoreCalculatorFactoryImpl.java b/src/main/java/de/thm/arsnova/service/score/ScoreCalculatorFactoryImpl.java
index 78acff908dc1d575d4d06111ef4de0a4b996181d..d8267dfae9c16a03901dc4b08d97df4faa37613e 100644
--- a/src/main/java/de/thm/arsnova/service/score/ScoreCalculatorFactoryImpl.java
+++ b/src/main/java/de/thm/arsnova/service/score/ScoreCalculatorFactoryImpl.java
@@ -23,6 +23,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.ApplicationEventPublisherAware;
+import org.springframework.context.event.EventListener;
 import org.springframework.stereotype.Component;
 
 /**
@@ -31,7 +32,7 @@ import org.springframework.stereotype.Component;
  * This class additionally clears all score caches and reports this via event system.
  */
 @Component
-public class ScoreCalculatorFactoryImpl implements ArsnovaEventVisitor, ScoreCalculatorFactory, ApplicationEventPublisherAware {
+public class ScoreCalculatorFactoryImpl implements ScoreCalculatorFactory, ApplicationEventPublisherAware {
 
 	@Autowired
 	private SessionStatisticsRepository sessionStatisticsRepository;
@@ -50,141 +51,87 @@ public class ScoreCalculatorFactoryImpl implements ArsnovaEventVisitor, ScoreCal
 		return scoreCalculator;
 	}
 
-	@Override
-	public void visit(NewCommentEvent event) { }
-
-	@Override
-	public void visit(DeleteCommentEvent deleteCommentEvent) { }
-
 	@CacheEvict(value = "score", key = "#event.Room")
-	@Override
-	public void visit(NewQuestionEvent event) {
+	@EventListener
+	public void handleNewQuestion(NewQuestionEvent event) {
 		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getRoom()));
 	}
 
 	@CacheEvict(value = "score", key = "#event.Room")
-	@Override
-	public void visit(UnlockQuestionEvent event) {
+	@EventListener
+	public void handleUnlockQuestion(UnlockQuestionEvent event) {
 		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getRoom()));
 	}
 
 	@CacheEvict(value = "score", key = "#event.Room")
-	@Override
-	public void visit(UnlockQuestionsEvent event) {
+	@EventListener
+	public void handleUnlockQuestions(UnlockQuestionsEvent event) {
 		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getRoom()));
 	}
 
 	@CacheEvict(value = "score", key = "#event.Room")
-	@Override
-	public void visit(LockQuestionEvent event) {
+	@EventListener
+	public void handleLockQuestion(LockQuestionEvent event) {
 		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getRoom()));
 	}
 
 	@CacheEvict(value = "score", key = "#event.Room")
-	@Override
-	public void visit(LockQuestionsEvent event) {
+	@EventListener
+	public void handleLockQuestions(LockQuestionsEvent event) {
 		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getRoom()));
 	}
 
 	@CacheEvict(value = "score", key = "#event.Room")
-	@Override
-	public void visit(NewAnswerEvent event) {
+	@EventListener
+	public void handleNewAnswer(NewAnswerEvent event) {
 		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getRoom()));
 	}
 
 	@CacheEvict(value = "score", key = "#event.Room")
-	@Override
-	public void visit(DeleteAnswerEvent event) {
+	@EventListener
+	public void handleDeleteAnswer(DeleteAnswerEvent event) {
 		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getRoom()));
 	}
 
 	@CacheEvict(value = "score", key = "#event.Room")
-	@Override
-	public void visit(DeleteQuestionEvent event) {
+	@EventListener
+	public void handleDeleteQuestion(DeleteQuestionEvent event) {
 		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getRoom()));
 	}
 
 	@CacheEvict(value = "score", key = "#event.Room")
-	@Override
-	public void visit(DeleteAllQuestionsEvent event) {
+	@EventListener
+	public void handleDeleteAllQuestions(DeleteAllQuestionsEvent event) {
 		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getRoom()));
 	}
 
 	@CacheEvict(value = "score", key = "#event.Room")
-	@Override
-	public void visit(DeleteAllQuestionsAnswersEvent event) {
+	@EventListener
+	public void handleDeleteAllQuestionsAnswers(DeleteAllQuestionsAnswersEvent event) {
 		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getRoom()));
 	}
 
 	@CacheEvict(value = "score", key = "#event.Room")
-	@Override
-	public void visit(DeleteAllPreparationAnswersEvent event) {
+	@EventListener
+	public void handleDeleteAllPreparationAnswers(DeleteAllPreparationAnswersEvent event) {
 		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getRoom()));
 	}
 
 	@CacheEvict(value = "score", key = "#event.Room")
-	@Override
-	public void visit(DeleteAllLectureAnswersEvent event) {
+	@EventListener
+	public void handleDeleteAllLectureAnswers(DeleteAllLectureAnswersEvent event) {
 		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getRoom()));
 	}
 
 	@CacheEvict(value = "score", key = "#event.Room")
-	@Override
-	public void visit(PiRoundResetEvent event) {
+	@EventListener
+	public void handlePiRoundReset(PiRoundResetEvent event) {
 		this.publisher.publishEvent(new ChangeScoreEvent(this, event.getRoom()));
 	}
 
-	@Override
-	public void visit(NewFeedbackEvent newFeedbackEvent) { }
-
-	@Override
-	public void visit(DeleteFeedbackForRoomsEvent deleteFeedbackEvent) { }
-
-	@Override
-	public void visit(StatusRoomEvent statusSessionEvent) { }
-
-	@Override
-	public void visit(ChangeScoreEvent changeLearningProgress) { }
-
-	@Override
-	public void visit(PiRoundDelayedStartEvent piRoundDelayedStartEvent) { }
-
-	@Override
-	public void visit(PiRoundEndEvent piRoundEndEvent) { }
-
-	@Override
-	public void visit(PiRoundCancelEvent piRoundCancelEvent) { }
-
-	@Override
-	public void visit(NewRoomEvent event) { }
-
-	@Override
-	public void visit(DeleteRoomEvent event) { }
-
 	@Override
 	public void setApplicationEventPublisher(ApplicationEventPublisher publisher) {
 		this.publisher = publisher;
 	}
 
-	@Override
-	public void visit(LockVoteEvent lockVoteEvent) { }
-
-	@Override
-	public void visit(LockVotesEvent lockVotesEvent) { }
-
-	@Override
-	public void visit(UnlockVoteEvent unlockVoteEvent) { }
-
-	@Override
-	public void visit(UnlockVotesEvent unlockVotesEvent) { }
-
-	@Override
-	public void visit(FeatureChangeEvent featureChangeEvent) { }
-
-	@Override
-	public void visit(LockFeedbackEvent lockFeedbackEvent) { }
-
-	@Override
-	public void visit(FlipFlashcardsEvent flipFlashcardsEvent) { }
-
 }
diff --git a/src/main/java/de/thm/arsnova/service/score/ScoreCalculatorListener.java b/src/main/java/de/thm/arsnova/service/score/ScoreCalculatorListener.java
deleted file mode 100644
index d78cc886327e289d5649f0476dbfebea9f3755ae..0000000000000000000000000000000000000000
--- a/src/main/java/de/thm/arsnova/service/score/ScoreCalculatorListener.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * This file is part of ARSnova Backend.
- * Copyright (C) 2012-2018 The ARSnova Team and Contributors
- *
- * ARSnova Backend is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * ARSnova Backend is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package de.thm.arsnova.service.score;
-
-import de.thm.arsnova.event.ArsnovaEvent;
-import de.thm.arsnova.event.ArsnovaEventVisitor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationListener;
-import org.springframework.stereotype.Component;
-
-/**
- * Listener registration for the score.
- *
- * Note that this class is necessary in order for the annotations to work.
- */
-@Component
-public class ScoreCalculatorListener implements ApplicationListener<ArsnovaEvent> {
-
-	@Autowired
-	private ScoreCalculatorFactory scoreCalculatorFactory;
-
-	@Override
-	public void onApplicationEvent(ArsnovaEvent event) {
-		event.accept((ArsnovaEventVisitor) scoreCalculatorFactory);
-	}
-
-}
diff --git a/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java b/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java
index 0e20156dfa0748e51fc02140968725b5a9cd8d47..5636c66ae4999d97901dd071028dc59b38626d97 100644
--- a/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java
+++ b/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java
@@ -48,6 +48,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Required;
+import org.springframework.context.event.EventListener;
 import org.springframework.scheduling.annotation.Async;
 import org.springframework.stereotype.Component;
 
@@ -67,7 +68,7 @@ import java.util.UUID;
  * Web socket implementation based on Socket.io.
  */
 @Component
-public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, ArsnovaEventVisitor {
+public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer {
 
 	@Autowired
 	private FeedbackService feedbackService;
@@ -489,40 +490,40 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		}
 	}
 
-	@Override
-	public void visit(NewQuestionEvent event) {
+	@EventListener
+	public void handleNewQuestion(NewQuestionEvent event) {
 		this.reportContentAvailable(event.getRoom(), Collections.singletonList(event.getQuestion()));
 	}
 
-	@Override
-	public void visit(UnlockQuestionEvent event) {
+	@EventListener
+	public void handleUnlockQuestion(UnlockQuestionEvent event) {
 		this.reportContentAvailable(event.getRoom(), Collections.singletonList(event.getQuestion()));
 	}
 
-	@Override
-	public void visit(LockQuestionEvent event) {
+	@EventListener
+	public void handleLockQuestion(LockQuestionEvent event) {
 		this.reportContentsLocked(event.getRoom(), Collections.singletonList(event.getQuestion()));
 	}
 
-	@Override
-	public void visit(UnlockQuestionsEvent event) {
+	@EventListener
+	public void handleUnlockQuestions(UnlockQuestionsEvent event) {
 		this.reportContentAvailable(event.getRoom(), event.getQuestions());
 	}
 
-	@Override
-	public void visit(LockQuestionsEvent event) {
+	@EventListener
+	public void handleLockQuestions(LockQuestionsEvent event) {
 		this.reportContentsLocked(event.getRoom(), event.getQuestions());
 	}
 
-	@Override
-	public void visit(NewCommentEvent event) {
+	@EventListener
+	public void handleNewComment(NewCommentEvent event) {
 		this.reportCommentAvailable(event.getRoom(), event.getQuestion());
 	}
 
 	@Async
-	@Override
-	@Timed(name = "visit.NewAnswerEvent")
-	public void visit(NewAnswerEvent event) {
+	@EventListener
+	@Timed
+	public void handleNewAnswer(NewAnswerEvent event) {
 		final String roomId = event.getRoom().getId();
 		this.reportAnswersToContentAvailable(event.getRoom(), new Content(event.getContent()));
 		broadcastInRoom(roomId, "countQuestionAnswersByQuestionId", answerService.countAnswersAndAbstentionsInternal(event.getContent().getId()));
@@ -540,9 +541,9 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 	}
 
 	@Async
-	@Override
-	@Timed(name = "visit.DeleteAnswerEvent")
-	public void visit(DeleteAnswerEvent event) {
+	@EventListener
+	@Timed
+	public void handleDeleteAnswer(DeleteAnswerEvent event) {
 		final String roomId = event.getRoom().getId();
 		this.reportAnswersToContentAvailable(event.getRoom(), new Content(event.getQuestion()));
 		// We do not know which user's answer was deleted, so we can't update his 'unanswered' list of questions...
@@ -552,49 +553,49 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 	}
 
 	@Async
-	@Override
-	@Timed(name = "visit.PiRoundDelayedStartEvent")
-	public void visit(PiRoundDelayedStartEvent event) {
+	@EventListener
+	@Timed
+	public void handlePiRoundDelayedStart(PiRoundDelayedStartEvent event) {
 		final String roomId = event.getRoom().getId();
 		broadcastInRoom(roomId, "startDelayedPiRound", event.getPiRoundInformations());
 	}
 
 	@Async
-	@Override
-	@Timed(name = "visit.PiRoundEndEvent")
-	public void visit(PiRoundEndEvent event) {
+	@EventListener
+	@Timed
+	public void handlePiRoundEnd(PiRoundEndEvent event) {
 		final String roomId = event.getRoom().getId();
 		broadcastInRoom(roomId, "endPiRound", event.getPiRoundEndInformations());
 	}
 
 	@Async
-	@Override
-	@Timed(name = "visit.PiRoundCancelEvent")
-	public void visit(PiRoundCancelEvent event) {
+	@EventListener
+	@Timed
+	public void handlePiRoundCancel(PiRoundCancelEvent event) {
 		final String roomId = event.getRoom().getId();
 		broadcastInRoom(roomId, "cancelPiRound", event.getContentId());
 	}
 
-	@Override
-	public void visit(PiRoundResetEvent event) {
+	@EventListener
+	public void handlePiRoundReset(PiRoundResetEvent event) {
 		final String roomId = event.getRoom().getId();
 		broadcastInRoom(roomId, "resetPiRound", event.getPiRoundResetInformations());
 	}
 
-	@Override
-	public void visit(LockVoteEvent event) {
+	@EventListener
+	public void handleLockVote(LockVoteEvent event) {
 		final String roomId = event.getRoom().getId();
 		broadcastInRoom(roomId, "lockVote", event.getVotingAdmission());
 	}
 
-	@Override
-	public void visit(UnlockVoteEvent event) {
+	@EventListener
+	public void handleUnlockVote(UnlockVoteEvent event) {
 		final String roomId = event.getRoom().getId();
 		broadcastInRoom(roomId, "unlockVote", event.getVotingAdmission());
 	}
 
-	@Override
-	public void visit(LockVotesEvent event) {
+	@EventListener
+	public void handleLockVotes(LockVotesEvent event) {
 		List<Content> contents = new ArrayList<>();
 		for (de.thm.arsnova.model.Content q : event.getQuestions()) {
 			contents.add(new Content(q));
@@ -602,8 +603,8 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		broadcastInRoom(event.getRoom().getId(), "lockVotes", contents);
 	}
 
-	@Override
-	public void visit(UnlockVotesEvent event) {
+	@EventListener
+	public void handleUnlockVotes(UnlockVotesEvent event) {
 		List<Content> contents = new ArrayList<>();
 		for (de.thm.arsnova.model.Content q : event.getQuestions()) {
 			contents.add(new Content(q));
@@ -611,8 +612,8 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		broadcastInRoom(event.getRoom().getId(), "unlockVotes", contents);
 	}
 
-	@Override
-	public void visit(FeatureChangeEvent event) {
+	@EventListener
+	public void handleFeatureChange(FeatureChangeEvent event) {
 		final String roomId = event.getRoom().getId();
 		final de.thm.arsnova.model.Room.Settings settings = event.getRoom().getSettings();
 		broadcastInRoom(roomId, "featureChange", toV2Migrator.migrate(settings));
@@ -623,76 +624,34 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		}
 	}
 
-	@Override
-	public void visit(LockFeedbackEvent event) {
+	@EventListener
+	public void handleLockFeedback(LockFeedbackEvent event) {
 		broadcastInRoom(event.getRoom().getId(), "lockFeedback", event.getRoom().getSettings().isFeedbackLocked());
 	}
 
-	@Override
-	public void visit(FlipFlashcardsEvent event) {
+	@EventListener
+	public void handleFlipFlashcards(FlipFlashcardsEvent event) {
 //		broadcastInRoom(event.getRoom().getId(), "flipFlashcards", event.getRoom().getFlipFlashcards());
 	}
 
-	@Override
-	public void visit(DeleteQuestionEvent deleteQuestionEvent) {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public void visit(DeleteAllQuestionsEvent event) {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public void visit(DeleteAllQuestionsAnswersEvent deleteAllAnswersEvent) {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public void visit(DeleteAllPreparationAnswersEvent deleteAllPreparationAnswersEvent) {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public void visit(DeleteAllLectureAnswersEvent deleteAllLectureAnswersEvent) {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public void visit(DeleteCommentEvent deleteCommentEvent) {
-		// TODO Auto-generated method stub
-
-	}
-
-	@Override
-	public void visit(NewFeedbackEvent event) {
+	@EventListener
+	public void handleNewFeedback(NewFeedbackEvent event) {
 		this.reportUpdatedFeedbackForRoom(event.getRoom());
 	}
 
-	@Override
-	public void visit(DeleteFeedbackForRoomsEvent event) {
+	@EventListener
+	public void handleDeleteFeedbackForRooms(DeleteFeedbackForRoomsEvent event) {
 		this.reportDeletedFeedback(event.getUserId(), event.getSessions());
 
 	}
 
-	@Override
-	public void visit(StatusRoomEvent event) {
+	@EventListener
+	public void handleStatusRoom(StatusRoomEvent event) {
 		this.reportRoomStatus(event.getRoom().getId(), !event.getRoom().isClosed());
 	}
 
-	@Override
-	public void visit(ChangeScoreEvent event) {
+	@EventListener
+	public void handleChangeScore(ChangeScoreEvent event) {
 		broadcastInRoom(event.getRoom().getId(), "learningProgressChange", null);
 	}
-
-	@Override
-	public void visit(NewRoomEvent event) { }
-
-	@Override
-	public void visit(DeleteRoomEvent event) { }
 }
diff --git a/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerListener.java b/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerListener.java
deleted file mode 100644
index 1d69bc792375c57b2d5a87b9e7bb16c196d2ff1a..0000000000000000000000000000000000000000
--- a/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerListener.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * This file is part of ARSnova Backend.
- * Copyright (C) 2012-2018 The ARSnova Team and Contributors
- *
- * ARSnova Backend is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * ARSnova Backend is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package de.thm.arsnova.websocket;
-
-import de.thm.arsnova.event.ArsnovaEvent;
-import de.thm.arsnova.event.ArsnovaEventVisitor;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationListener;
-import org.springframework.stereotype.Component;
-
-/**
- * An external Listener is required because otherwise the event methods are not called through a Spring proxy.
- * This would result in Spring method annotations not working.
- */
-@Component
-public class ArsnovaSocketioServerListener implements ApplicationListener<ArsnovaEvent> {
-
-	@Autowired
-	private ArsnovaSocketioServer socketioServer;
-
-	@Override
-	public void onApplicationEvent(ArsnovaEvent event) {
-		event.accept((ArsnovaEventVisitor) socketioServer);
-	}
-
-}