From 49d4ffdb0a3c3947be8a322ce93e2404a1b0571e Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <code@dgerhardt.net>
Date: Thu, 8 Nov 2018 14:51:31 +0100
Subject: [PATCH] Get rid of visitor pattern for event handling

@EventListener is used for handler methods instead of implementing
a visitor interface.
---
 .../de/thm/arsnova/cache/CacheBusterImpl.java | 103 ++----------
 .../arsnova/cache/CacheBusterListener.java    |  42 -----
 .../java/de/thm/arsnova/config/AppConfig.java |   6 -
 .../de/thm/arsnova/event/ArsnovaEvent.java    |   2 -
 .../arsnova/event/ArsnovaEventVisitor.java    |  86 ----------
 .../thm/arsnova/event/ChangeScoreEvent.java   |   5 -
 .../event/DeleteAllLectureAnswersEvent.java   |   5 -
 .../DeleteAllPreparationAnswersEvent.java     |   5 -
 .../event/DeleteAllQuestionsAnswersEvent.java |   5 -
 .../event/DeleteAllQuestionsEvent.java        |   5 -
 .../thm/arsnova/event/DeleteAnswerEvent.java  |   5 -
 .../thm/arsnova/event/DeleteCommentEvent.java |   5 -
 .../event/DeleteFeedbackForRoomsEvent.java    |   5 -
 .../arsnova/event/DeleteQuestionEvent.java    |   5 -
 .../de/thm/arsnova/event/DeleteRoomEvent.java |   5 -
 .../thm/arsnova/event/FeatureChangeEvent.java |   5 -
 .../arsnova/event/FlipFlashcardsEvent.java    |   5 -
 .../thm/arsnova/event/LockFeedbackEvent.java  |   5 -
 .../thm/arsnova/event/LockQuestionEvent.java  |   5 -
 .../thm/arsnova/event/LockQuestionsEvent.java |   5 -
 .../de/thm/arsnova/event/LockVoteEvent.java   |   5 -
 .../de/thm/arsnova/event/LockVotesEvent.java  |   5 -
 .../de/thm/arsnova/event/NewAnswerEvent.java  |   5 -
 .../de/thm/arsnova/event/NewCommentEvent.java |   5 -
 .../thm/arsnova/event/NewFeedbackEvent.java   |   5 -
 .../thm/arsnova/event/NewQuestionEvent.java   |   5 -
 .../de/thm/arsnova/event/NewRoomEvent.java    |   5 -
 .../thm/arsnova/event/PiRoundCancelEvent.java |   5 -
 .../event/PiRoundDelayedStartEvent.java       |   5 -
 .../de/thm/arsnova/event/PiRoundEndEvent.java |   5 -
 .../thm/arsnova/event/PiRoundResetEvent.java  |   5 -
 .../de/thm/arsnova/event/StatusRoomEvent.java |   5 -
 .../arsnova/event/UnlockQuestionEvent.java    |   5 -
 .../arsnova/event/UnlockQuestionsEvent.java   |   5 -
 .../de/thm/arsnova/event/UnlockVoteEvent.java |   5 -
 .../thm/arsnova/event/UnlockVotesEvent.java   |   5 -
 .../score/ScoreCalculatorFactoryImpl.java     | 109 ++++---------
 .../score/ScoreCalculatorListener.java        |  42 -----
 .../websocket/ArsnovaSocketioServerImpl.java  | 147 +++++++-----------
 .../ArsnovaSocketioServerListener.java        |  41 -----
 40 files changed, 95 insertions(+), 638 deletions(-)
 delete mode 100644 src/main/java/de/thm/arsnova/cache/CacheBusterListener.java
 delete mode 100644 src/main/java/de/thm/arsnova/event/ArsnovaEventVisitor.java
 delete mode 100644 src/main/java/de/thm/arsnova/service/score/ScoreCalculatorListener.java
 delete mode 100644 src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerListener.java

diff --git a/src/main/java/de/thm/arsnova/cache/CacheBusterImpl.java b/src/main/java/de/thm/arsnova/cache/CacheBusterImpl.java
index 719a3ed96..32f2b858b 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 07baa6499..000000000
--- 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 2df34dc2e..5b3338833 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 8c5ac9498..f6d6f6e79 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 4587c4284..000000000
--- 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 e67fc341e..46cbaf639 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 210ede956..3ed09bb70 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 94d7a67c4..a85f12e2f 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 eb587c213..bf7142ed6 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 7dd76e612..a6cd9558a 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 eb9f816bf..8a7aa4ba1 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 f62f3c64e..82ba83d10 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 38b5cfca9..1bf031450 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 b2a40f6cf..bfafb5fe7 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 2e470d680..a650c51a6 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 890425edb..447631a91 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 10a17302f..5b94f9a21 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 b7a39b6b9..1f907db30 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 54bc9ff6a..2b0e38bd4 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 8c892967d..fb27e4e6c 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 1463e12e0..07456ac7b 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 a18cf1499..ebff38234 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 bdf775c00..462494d98 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 3ad2620ea..0ccf30272 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 f9bcdc525..d663f2bb5 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 4cf0da993..53281dcea 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 4dd067ba6..222fa7c0f 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 969d4a68a..27cf4351d 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 b8880c367..43ac5f59b 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 ebd864bf7..064ba458d 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 a7045abfd..4d5d773ea 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 a981d2f31..d91026fde 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 5e09ed349..3a53ff442 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 a4e5d8c6a..50c66f05a 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 962f7c546..d6206d6db 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 fdc50180a..cf5fe5f2c 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 78acff908..d8267dfae 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 d78cc8863..000000000
--- 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 0e20156df..5636c66ae 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 1d69bc792..000000000
--- 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);
-	}
-
-}
-- 
GitLab