diff --git a/src/main/java/de/thm/arsnova/config/AppConfig.java b/src/main/java/de/thm/arsnova/config/AppConfig.java
index b7dcb3b72b6c2739e3ec429443ef822714cfd402..a1415c4750b2063e20f2f5d2385614fa4dc52a30 100644
--- a/src/main/java/de/thm/arsnova/config/AppConfig.java
+++ b/src/main/java/de/thm/arsnova/config/AppConfig.java
@@ -20,21 +20,21 @@ package de.thm.arsnova.config;
 import com.fasterxml.jackson.annotation.JsonInclude;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.SerializationFeature;
-import de.thm.arsnova.model.migration.FromV2Migrator;
-import de.thm.arsnova.model.migration.ToV2Migrator;
-import de.thm.arsnova.util.ImageUtils;
 import de.thm.arsnova.connector.client.ConnectorClient;
 import de.thm.arsnova.connector.client.ConnectorClientImpl;
+import de.thm.arsnova.model.migration.FromV2Migrator;
+import de.thm.arsnova.model.migration.ToV2Migrator;
 import de.thm.arsnova.model.serialization.CouchDbDocumentModule;
 import de.thm.arsnova.model.serialization.View;
-import de.thm.arsnova.web.PathApiVersionContentNegotiationStrategy;
-import de.thm.arsnova.websocket.ArsnovaSocketioServer;
-import de.thm.arsnova.websocket.ArsnovaSocketioServerImpl;
-import de.thm.arsnova.websocket.ArsnovaSocketioServerListener;
+import de.thm.arsnova.util.ImageUtils;
 import de.thm.arsnova.web.CacheControlInterceptorHandler;
 import de.thm.arsnova.web.CorsFilter;
 import de.thm.arsnova.web.DeprecatedApiInterceptorHandler;
+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;
diff --git a/src/main/java/de/thm/arsnova/config/PersistenceConfig.java b/src/main/java/de/thm/arsnova/config/PersistenceConfig.java
index 713e5fb6640e0bf91a14612036b32ebee963b9f9..d36602975d69ac9ba6aed32db1248f3e75c3adf0 100644
--- a/src/main/java/de/thm/arsnova/config/PersistenceConfig.java
+++ b/src/main/java/de/thm/arsnova/config/PersistenceConfig.java
@@ -1,8 +1,24 @@
 package de.thm.arsnova.config;
 
 import de.thm.arsnova.model.serialization.CouchDbObjectMapperFactory;
-import de.thm.arsnova.persistence.*;
-import de.thm.arsnova.persistence.couchdb.*;
+import de.thm.arsnova.persistence.AnswerRepository;
+import de.thm.arsnova.persistence.CommentRepository;
+import de.thm.arsnova.persistence.ContentRepository;
+import de.thm.arsnova.persistence.LogEntryRepository;
+import de.thm.arsnova.persistence.MotdRepository;
+import de.thm.arsnova.persistence.RoomRepository;
+import de.thm.arsnova.persistence.SessionStatisticsRepository;
+import de.thm.arsnova.persistence.StatisticsRepository;
+import de.thm.arsnova.persistence.UserRepository;
+import de.thm.arsnova.persistence.couchdb.CouchDbAnswerRepository;
+import de.thm.arsnova.persistence.couchdb.CouchDbCommentRepository;
+import de.thm.arsnova.persistence.couchdb.CouchDbContentRepository;
+import de.thm.arsnova.persistence.couchdb.CouchDbLogEntryRepository;
+import de.thm.arsnova.persistence.couchdb.CouchDbMotdRepository;
+import de.thm.arsnova.persistence.couchdb.CouchDbRoomRepository;
+import de.thm.arsnova.persistence.couchdb.CouchDbSessionStatisticsRepository;
+import de.thm.arsnova.persistence.couchdb.CouchDbStatisticsRepository;
+import de.thm.arsnova.persistence.couchdb.CouchDbUserRepository;
 import de.thm.arsnova.persistence.couchdb.support.MangoCouchDbConnector;
 import org.ektorp.impl.StdCouchDbInstance;
 import org.ektorp.spring.HttpClientFactoryBean;
diff --git a/src/main/java/de/thm/arsnova/config/SecurityConfig.java b/src/main/java/de/thm/arsnova/config/SecurityConfig.java
index 5f7104582583ada8c308da05eff4a62e1007c9ae..1e0ce9fafca24be49345b448e14cb31c0081624c 100644
--- a/src/main/java/de/thm/arsnova/config/SecurityConfig.java
+++ b/src/main/java/de/thm/arsnova/config/SecurityConfig.java
@@ -19,14 +19,14 @@ package de.thm.arsnova.config;
 
 import de.thm.arsnova.security.CasLogoutSuccessHandler;
 import de.thm.arsnova.security.CasUserDetailsService;
+import de.thm.arsnova.security.CustomLdapUserDetailsMapper;
 import de.thm.arsnova.security.LoginAuthenticationFailureHandler;
 import de.thm.arsnova.security.LoginAuthenticationSucessHandler;
-import de.thm.arsnova.security.CustomLdapUserDetailsMapper;
 import de.thm.arsnova.security.RegisteredUserDetailsService;
 import de.thm.arsnova.security.jwt.JwtAuthenticationProvider;
 import de.thm.arsnova.security.jwt.JwtTokenFilter;
-import de.thm.arsnova.security.pac4j.OauthCallbackFilter;
 import de.thm.arsnova.security.pac4j.OauthAuthenticationProvider;
+import de.thm.arsnova.security.pac4j.OauthCallbackFilter;
 import org.jasig.cas.client.validation.Cas20ProxyTicketValidator;
 import org.pac4j.core.client.Client;
 import org.pac4j.core.config.Config;
diff --git a/src/main/java/de/thm/arsnova/controller/AbstractEntityController.java b/src/main/java/de/thm/arsnova/controller/AbstractEntityController.java
index 0b6c96c8ffe8c3bd5c033aabbff12009b0f2dc4c..ce3c4f23f905b62fcdf1c7e54263b752a105055e 100644
--- a/src/main/java/de/thm/arsnova/controller/AbstractEntityController.java
+++ b/src/main/java/de/thm/arsnova/controller/AbstractEntityController.java
@@ -19,9 +19,9 @@ package de.thm.arsnova.controller;
 
 import de.thm.arsnova.model.Entity;
 import de.thm.arsnova.model.FindQuery;
-import de.thm.arsnova.web.exceptions.NotFoundException;
 import de.thm.arsnova.service.EntityService;
 import de.thm.arsnova.service.FindQueryService;
+import de.thm.arsnova.web.exceptions.NotFoundException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/src/main/java/de/thm/arsnova/controller/UserController.java b/src/main/java/de/thm/arsnova/controller/UserController.java
index e6549fbfad400713e66510abca6bc8fae14a049a..c6416a32feaedfa7ff649882d4159292424e1caa 100644
--- a/src/main/java/de/thm/arsnova/controller/UserController.java
+++ b/src/main/java/de/thm/arsnova/controller/UserController.java
@@ -4,10 +4,10 @@ import com.fasterxml.jackson.annotation.JsonView;
 import de.thm.arsnova.model.LoginCredentials;
 import de.thm.arsnova.model.UserProfile;
 import de.thm.arsnova.model.serialization.View;
-import de.thm.arsnova.web.exceptions.BadRequestException;
-import de.thm.arsnova.web.exceptions.ForbiddenException;
 import de.thm.arsnova.service.RoomService;
 import de.thm.arsnova.service.UserService;
+import de.thm.arsnova.web.exceptions.BadRequestException;
+import de.thm.arsnova.web.exceptions.ForbiddenException;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
diff --git a/src/main/java/de/thm/arsnova/controller/v2/AuthenticationController.java b/src/main/java/de/thm/arsnova/controller/v2/AuthenticationController.java
index a7f293d4a6fd2b8727248173ba54e17f84bd3f58..4dac95bdfd9e38c9132605b2a22770b46c24422f 100644
--- a/src/main/java/de/thm/arsnova/controller/v2/AuthenticationController.java
+++ b/src/main/java/de/thm/arsnova/controller/v2/AuthenticationController.java
@@ -20,11 +20,11 @@ package de.thm.arsnova.controller.v2;
 import de.thm.arsnova.config.SecurityConfig;
 import de.thm.arsnova.controller.AbstractController;
 import de.thm.arsnova.model.ServiceDescription;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.UserProfile;
-import de.thm.arsnova.web.exceptions.UnauthorizedException;
+import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.security.User;
 import de.thm.arsnova.service.UserService;
+import de.thm.arsnova.web.exceptions.UnauthorizedException;
 import org.pac4j.core.context.J2EContext;
 import org.pac4j.core.exception.HttpAction;
 import org.pac4j.oauth.client.FacebookClient;
@@ -260,7 +260,7 @@ public class AuthenticationController extends AbstractController {
 	@RequestMapping(value = { "/logout" }, method = { RequestMethod.POST, RequestMethod.GET })
 	public String doLogout(final HttpServletRequest request) {
 		final Authentication auth = SecurityContextHolder.getContext().getAuthentication();
-		userService.removeUserFromMaps(userService.getCurrentUser());
+		userService.removeUserIdFromMaps(userService.getCurrentUser().getId());
 		request.getSession().invalidate();
 		SecurityContextHolder.clearContext();
 		if (auth instanceof CasAuthenticationToken) {
diff --git a/src/main/java/de/thm/arsnova/controller/v2/ContentController.java b/src/main/java/de/thm/arsnova/controller/v2/ContentController.java
index b6bbe1fdbcdf28b72c43ec004c04914376a78640..e097c27a0b0d01e9360269dd8bca8e10f2e96681 100644
--- a/src/main/java/de/thm/arsnova/controller/v2/ContentController.java
+++ b/src/main/java/de/thm/arsnova/controller/v2/ContentController.java
@@ -25,10 +25,6 @@ import de.thm.arsnova.model.migration.FromV2Migrator;
 import de.thm.arsnova.model.migration.ToV2Migrator;
 import de.thm.arsnova.model.migration.v2.Answer;
 import de.thm.arsnova.model.migration.v2.Content;
-import de.thm.arsnova.web.exceptions.ForbiddenException;
-import de.thm.arsnova.web.exceptions.NoContentException;
-import de.thm.arsnova.web.exceptions.NotFoundException;
-import de.thm.arsnova.web.exceptions.NotImplementedException;
 import de.thm.arsnova.service.AnswerService;
 import de.thm.arsnova.service.ContentService;
 import de.thm.arsnova.service.RoomService;
@@ -36,6 +32,10 @@ import de.thm.arsnova.service.TimerService;
 import de.thm.arsnova.util.PaginationListDecorator;
 import de.thm.arsnova.web.DeprecatedApi;
 import de.thm.arsnova.web.Pagination;
+import de.thm.arsnova.web.exceptions.ForbiddenException;
+import de.thm.arsnova.web.exceptions.NoContentException;
+import de.thm.arsnova.web.exceptions.NotFoundException;
+import de.thm.arsnova.web.exceptions.NotImplementedException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiResponse;
@@ -158,7 +158,7 @@ public class ContentController extends PaginationController {
 			) {
 
 		if (time == 0) {
-			timerService.startNewRound(contentId, null);
+			timerService.startNewRound(contentId);
 		} else {
 			timerService.startNewRoundDelayed(contentId, time);
 		}
diff --git a/src/main/java/de/thm/arsnova/controller/v2/CourseController.java b/src/main/java/de/thm/arsnova/controller/v2/CourseController.java
index 17a766d38b3d293a41250fab579a67ee7a4e72f4..ccdb3da1eaf23a57b58dacd54785b86eb7a03db9 100644
--- a/src/main/java/de/thm/arsnova/controller/v2/CourseController.java
+++ b/src/main/java/de/thm/arsnova/controller/v2/CourseController.java
@@ -21,10 +21,10 @@ import de.thm.arsnova.connector.client.ConnectorClient;
 import de.thm.arsnova.connector.model.Course;
 import de.thm.arsnova.connector.model.UserRole;
 import de.thm.arsnova.controller.AbstractController;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
+import de.thm.arsnova.security.User;
+import de.thm.arsnova.service.UserService;
 import de.thm.arsnova.web.exceptions.NotImplementedException;
 import de.thm.arsnova.web.exceptions.UnauthorizedException;
-import de.thm.arsnova.service.UserService;
 import io.swagger.annotations.ApiParam;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -55,7 +55,7 @@ public class CourseController extends AbstractController {
 			@RequestParam(value = "sortby", defaultValue = "name") final String sortby
 			) {
 
-		final ClientAuthentication currentUser = userService.getCurrentUser();
+		final User currentUser = userService.getCurrentUser();
 
 		if (currentUser == null || currentUser.getUsername() == null) {
 			throw new UnauthorizedException();
diff --git a/src/main/java/de/thm/arsnova/controller/v2/FeedbackController.java b/src/main/java/de/thm/arsnova/controller/v2/FeedbackController.java
index 3374251f6521b08aa0d4148b99fd529aa5e06c76..ba5db82e631e941e9dd27a3f09a0bed7fb8f6515 100644
--- a/src/main/java/de/thm/arsnova/controller/v2/FeedbackController.java
+++ b/src/main/java/de/thm/arsnova/controller/v2/FeedbackController.java
@@ -19,12 +19,12 @@ package de.thm.arsnova.controller.v2;
 
 import de.thm.arsnova.controller.AbstractController;
 import de.thm.arsnova.model.Feedback;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
-import de.thm.arsnova.web.exceptions.NotFoundException;
+import de.thm.arsnova.security.User;
 import de.thm.arsnova.service.FeedbackService;
 import de.thm.arsnova.service.RoomService;
 import de.thm.arsnova.service.UserService;
 import de.thm.arsnova.web.DeprecatedApi;
+import de.thm.arsnova.web.exceptions.NotFoundException;
 import de.thm.arsnova.websocket.ArsnovaSocketioServerImpl;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpStatus;
@@ -66,7 +66,7 @@ public class FeedbackController extends AbstractController {
 	@RequestMapping(value = "/myfeedback", method = RequestMethod.GET, produces = MediaType.TEXT_PLAIN_VALUE)
 	public String getMyFeedback(@PathVariable final String shortId) {
 		String roomId = roomService.getIdByShortId(shortId);
-		Integer value = feedbackService.getByRoomIdAndUser(roomId, userService.getCurrentUser());
+		Integer value = feedbackService.getByRoomIdAndUserId(roomId, userService.getCurrentUser().getId());
 		if (value != null && value >= Feedback.MIN_FEEDBACK_TYPE && value <= Feedback.MAX_FEEDBACK_TYPE) {
 			return value.toString();
 		}
@@ -103,8 +103,8 @@ public class FeedbackController extends AbstractController {
 			@RequestBody final int value
 			) {
 		String roomId = roomService.getIdByShortId(shortId);
-		ClientAuthentication user = userService.getCurrentUser();
-		feedbackService.save(roomId, value, user);
+		User user = userService.getCurrentUser();
+		feedbackService.save(roomId, value, user.getId());
 		Feedback feedback = feedbackService.getByRoomId(roomId);
 
 		return feedback;
diff --git a/src/main/java/de/thm/arsnova/controller/v2/MotdController.java b/src/main/java/de/thm/arsnova/controller/v2/MotdController.java
index 416fa0918547bd041b6a20339877e4a301bf6faa..812f9ab18d95fa03b4171c5449ede78204e45267 100644
--- a/src/main/java/de/thm/arsnova/controller/v2/MotdController.java
+++ b/src/main/java/de/thm/arsnova/controller/v2/MotdController.java
@@ -23,11 +23,11 @@ import de.thm.arsnova.model.migration.FromV2Migrator;
 import de.thm.arsnova.model.migration.ToV2Migrator;
 import de.thm.arsnova.model.migration.v2.Motd;
 import de.thm.arsnova.model.migration.v2.MotdList;
-import de.thm.arsnova.web.exceptions.ForbiddenException;
 import de.thm.arsnova.security.User;
 import de.thm.arsnova.service.MotdService;
 import de.thm.arsnova.service.RoomService;
 import de.thm.arsnova.service.UserService;
+import de.thm.arsnova.web.exceptions.ForbiddenException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
diff --git a/src/main/java/de/thm/arsnova/controller/v2/RoomController.java b/src/main/java/de/thm/arsnova/controller/v2/RoomController.java
index 9c051b469e06138bf99761f72e4f0ff68558d85f..baef51c6f0e9d3b30b0c8cc427dee350291183c4 100644
--- a/src/main/java/de/thm/arsnova/controller/v2/RoomController.java
+++ b/src/main/java/de/thm/arsnova/controller/v2/RoomController.java
@@ -25,7 +25,6 @@ import de.thm.arsnova.model.migration.v2.RoomFeature;
 import de.thm.arsnova.model.migration.v2.RoomInfo;
 import de.thm.arsnova.model.transport.ImportExportContainer;
 import de.thm.arsnova.model.transport.ScoreStatistics;
-import de.thm.arsnova.web.exceptions.UnauthorizedException;
 import de.thm.arsnova.service.RoomService;
 import de.thm.arsnova.service.RoomServiceImpl;
 import de.thm.arsnova.service.RoomServiceImpl.RoomNameComparator;
@@ -33,6 +32,7 @@ import de.thm.arsnova.service.RoomServiceImpl.RoomShortNameComparator;
 import de.thm.arsnova.service.UserService;
 import de.thm.arsnova.web.DeprecatedApi;
 import de.thm.arsnova.web.Pagination;
+import de.thm.arsnova.web.exceptions.UnauthorizedException;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import io.swagger.annotations.ApiParam;
diff --git a/src/main/java/de/thm/arsnova/controller/v2/SocketController.java b/src/main/java/de/thm/arsnova/controller/v2/SocketController.java
index ab9afeef05b24bf5d2dfc09f9e39a2d11ea8644d..2bcec6ba1b3636d7d0ff6c5441e8a2d43a99672d 100644
--- a/src/main/java/de/thm/arsnova/controller/v2/SocketController.java
+++ b/src/main/java/de/thm/arsnova/controller/v2/SocketController.java
@@ -18,7 +18,7 @@
 package de.thm.arsnova.controller.v2;
 
 import de.thm.arsnova.controller.AbstractController;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
+import de.thm.arsnova.security.User;
 import de.thm.arsnova.service.UserService;
 import de.thm.arsnova.websocket.ArsnovaSocketioServer;
 import io.swagger.annotations.Api;
@@ -72,13 +72,13 @@ public class SocketController extends AbstractController {
 			response.setStatus(HttpStatus.BAD_REQUEST.value());
 			return;
 		}
-		ClientAuthentication u = userService.getCurrentUser();
-		if (null == u) {
+		User user = userService.getCurrentUser();
+		if (null == user) {
 			logger.debug("Client {} requested to assign Websocket session but has not authenticated.", socketid);
 			response.setStatus(HttpStatus.FORBIDDEN.value());
 			return;
 		}
-		userService.putUserToSocketId(UUID.fromString(socketid), u);
+		userService.putUserIdToSocketId(UUID.fromString(socketid), user.getId());
 		response.setStatus(HttpStatus.NO_CONTENT.value());
 	}
 
diff --git a/src/main/java/de/thm/arsnova/event/DeleteFeedbackForRoomsEvent.java b/src/main/java/de/thm/arsnova/event/DeleteFeedbackForRoomsEvent.java
index 5942e19adedc838bcd9dbe8ec1169c85b01ad201..38b5cfca9f725d761743b75f8b571ab68566d134 100644
--- a/src/main/java/de/thm/arsnova/event/DeleteFeedbackForRoomsEvent.java
+++ b/src/main/java/de/thm/arsnova/event/DeleteFeedbackForRoomsEvent.java
@@ -17,7 +17,6 @@
  */
 package de.thm.arsnova.event;
 
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.Room;
 
 import java.util.Set;
@@ -31,20 +30,20 @@ public class DeleteFeedbackForRoomsEvent extends ArsnovaEvent {
 
 	private final Set<Room> sessions;
 
-	private final ClientAuthentication user;
+	private final String userId;
 
-	public DeleteFeedbackForRoomsEvent(Object source, Set<Room> rooms, ClientAuthentication user) {
+	public DeleteFeedbackForRoomsEvent(Object source, Set<Room> rooms, String userId) {
 		super(source);
 		this.sessions = rooms;
-		this.user = user;
+		this.userId = userId;
 	}
 
 	public Set<Room> getSessions() {
 		return sessions;
 	}
 
-	public ClientAuthentication getUser() {
-		return user;
+	public String getUserId() {
+		return userId;
 	}
 
 	@Override
diff --git a/src/main/java/de/thm/arsnova/event/NewAnswerEvent.java b/src/main/java/de/thm/arsnova/event/NewAnswerEvent.java
index 5049bf32ca1465b25bac64c8b84792fba9353d18..bdf775c000745d33460d7db85de805cdb0dab7ee 100644
--- a/src/main/java/de/thm/arsnova/event/NewAnswerEvent.java
+++ b/src/main/java/de/thm/arsnova/event/NewAnswerEvent.java
@@ -17,7 +17,6 @@
  */
 package de.thm.arsnova.event;
 
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.Answer;
 import de.thm.arsnova.model.Content;
 import de.thm.arsnova.model.Room;
@@ -31,14 +30,14 @@ public class NewAnswerEvent extends RoomEvent {
 
 	private final Answer answer;
 
-	private final ClientAuthentication user;
+	private final String userId;
 
 	private final Content content;
 
-	public NewAnswerEvent(Object source, Room room, Answer answer, ClientAuthentication user, Content content) {
+	public NewAnswerEvent(Object source, Room room, Answer answer, String userId, Content content) {
 		super(source, room);
 		this.answer = answer;
-		this.user = user;
+		this.userId = userId;
 		this.content = content;
 	}
 
@@ -51,8 +50,8 @@ public class NewAnswerEvent extends RoomEvent {
 		return answer;
 	}
 
-	public ClientAuthentication getUser() {
-		return user;
+	public String getUserId() {
+		return userId;
 	}
 
 	public Content getContent() {
diff --git a/src/main/java/de/thm/arsnova/model/Room.java b/src/main/java/de/thm/arsnova/model/Room.java
index ad3610d19d807b48eead572c819525257eedef14..676b335dd76ad1477389f8ac43fd33104c67ae6c 100644
--- a/src/main/java/de/thm/arsnova/model/Room.java
+++ b/src/main/java/de/thm/arsnova/model/Room.java
@@ -4,7 +4,6 @@ import com.fasterxml.jackson.annotation.JsonView;
 import de.thm.arsnova.model.serialization.View;
 import org.springframework.core.style.ToStringCreator;
 
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
 import java.util.Objects;
diff --git a/src/main/java/de/thm/arsnova/model/transport/AnswerQueueElement.java b/src/main/java/de/thm/arsnova/model/transport/AnswerQueueElement.java
index b199acb6eec2c03bf635d7e2fc74e3e6eed67dbd..dfe4c2b8b2ba69b06aa4bbc925100bbf8080a6d5 100644
--- a/src/main/java/de/thm/arsnova/model/transport/AnswerQueueElement.java
+++ b/src/main/java/de/thm/arsnova/model/transport/AnswerQueueElement.java
@@ -20,7 +20,6 @@ package de.thm.arsnova.model.transport;
 import de.thm.arsnova.model.Answer;
 import de.thm.arsnova.model.Content;
 import de.thm.arsnova.model.Room;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 
 /**
  * An answer that is about to get saved in the database. Answers are not saved immediately, they are instead stored
@@ -34,13 +33,13 @@ public class AnswerQueueElement {
 
 	private final Answer answer;
 
-	private final ClientAuthentication user;
+	private final String userId;
 
-	public AnswerQueueElement(Room room, Content content, Answer answer, ClientAuthentication user) {
+	public AnswerQueueElement(Room room, Content content, Answer answer, String userId) {
 		this.room = room;
 		this.content = content;
 		this.answer = answer;
-		this.user = user;
+		this.userId = userId;
 	}
 
 	public Room getRoom() {
@@ -55,7 +54,7 @@ public class AnswerQueueElement {
 		return answer;
 	}
 
-	public ClientAuthentication getUser() {
-		return user;
+	public String getUserId() {
+		return userId;
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/model/transport/ImportExportContainer.java b/src/main/java/de/thm/arsnova/model/transport/ImportExportContainer.java
index ac2814acb1dc3cbe87d1bad8774f6381c77e0609..ea1de4f26a1c4e145aaffd2a7ccc7fb661ae904c 100644
--- a/src/main/java/de/thm/arsnova/model/transport/ImportExportContainer.java
+++ b/src/main/java/de/thm/arsnova/model/transport/ImportExportContainer.java
@@ -18,8 +18,8 @@
 package de.thm.arsnova.model.transport;
 
 import com.fasterxml.jackson.annotation.JsonView;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.migration.v2.Answer;
+import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.migration.v2.Comment;
 import de.thm.arsnova.model.migration.v2.Content;
 import de.thm.arsnova.model.migration.v2.Motd;
diff --git a/src/main/java/de/thm/arsnova/persistence/AnswerRepository.java b/src/main/java/de/thm/arsnova/persistence/AnswerRepository.java
index c07995b557722bf78420a8f18077dcea71d90e8e..3bf6a1e25320ed3375676f3dec210f2aed2afac6 100644
--- a/src/main/java/de/thm/arsnova/persistence/AnswerRepository.java
+++ b/src/main/java/de/thm/arsnova/persistence/AnswerRepository.java
@@ -19,17 +19,16 @@ package de.thm.arsnova.persistence;
 
 import de.thm.arsnova.model.Answer;
 import de.thm.arsnova.model.AnswerStatistics;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 
 import java.util.List;
 
 public interface AnswerRepository extends CrudRepository<Answer, String> {
-	<T extends Answer> T findByContentIdUserPiRound(String contentId, Class<T> type, ClientAuthentication user, int piRound);
+	<T extends Answer> T findByContentIdUserIdPiRound(String contentId, Class<T> type, String userId, int piRound);
 	AnswerStatistics findByContentIdRound(String contentId, int round, final int optionCount);
 	int countByContentIdRound(String contentId, int round);
 	int countByContentId(String contentId);
 	<T extends Answer> List<T> findByContentId(String contentId, Class<T> type, int start, int limit);
-	List<Answer> findByUserRoomId(ClientAuthentication user, String roomId);
+	List<Answer> findByUserIdRoomId(String userId, String roomId);
 	int countByRoomId(String roomId);
 	int deleteByContentId(String contentId);
 	int countByRoomIdOnlyLectureVariant(String roomId);
diff --git a/src/main/java/de/thm/arsnova/persistence/CommentRepository.java b/src/main/java/de/thm/arsnova/persistence/CommentRepository.java
index afa7bf82e6884600184fd7b7c12f0b6db190edc6..9624e755a3294b6c08573816a4ec3c7ce1a6e7e7 100644
--- a/src/main/java/de/thm/arsnova/persistence/CommentRepository.java
+++ b/src/main/java/de/thm/arsnova/persistence/CommentRepository.java
@@ -1,7 +1,6 @@
 package de.thm.arsnova.persistence;
 
 import de.thm.arsnova.model.Comment;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.migration.v2.CommentReadingCount;
 
 import java.util.List;
@@ -9,10 +8,10 @@ import java.util.List;
 public interface CommentRepository extends CrudRepository<Comment, String> {
 	int countByRoomId(String roomId);
 	CommentReadingCount countReadingByRoomId(String roomId);
-	CommentReadingCount countReadingByRoomIdAndUser(String roomId, ClientAuthentication user);
+	CommentReadingCount countReadingByRoomIdAndUserId(String roomId, String userId);
 	List<Comment> findByRoomId(String roomId, int start, int limit);
-	List<Comment> findByRoomIdAndUser(String roomId, ClientAuthentication user, int start, int limit);
+	List<Comment> findByRoomIdAndUserId(String roomId, String userId, int start, int limit);
 	Comment findOne(String commentId);
 	int deleteByRoomId(String roomId);
-	int deleteByRoomIdAndUser(String roomId, ClientAuthentication user);
+	int deleteByRoomIdAndUserId(String roomId, String userId);
 }
diff --git a/src/main/java/de/thm/arsnova/persistence/ContentRepository.java b/src/main/java/de/thm/arsnova/persistence/ContentRepository.java
index 89be0738817873d57dc8cb1212e6b7ba0e70d44b..eca83a08911cf35d3585fc4dde5634b411ea82a4 100644
--- a/src/main/java/de/thm/arsnova/persistence/ContentRepository.java
+++ b/src/main/java/de/thm/arsnova/persistence/ContentRepository.java
@@ -1,7 +1,6 @@
 package de.thm.arsnova.persistence;
 
 import de.thm.arsnova.model.Content;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 
 import java.util.List;
 
@@ -13,7 +12,7 @@ public interface ContentRepository extends CrudRepository<Content, String> {
 	List<String> findIdsByRoomId(String roomId);
 	List<String> findIdsByRoomIdAndVariant(String roomId, String variant);
 	int deleteByRoomId(String roomId);
-	List<String> findUnansweredIdsByRoomIdAndUser(String roomId, ClientAuthentication user);
+	List<String> findUnansweredIdsByRoomIdAndUser(String roomId, String userId);
 	List<Content> findByRoomIdOnlyLectureVariantAndActive(String roomId);
 	List<Content> findByRoomIdOnlyLectureVariant(String roomId);
 	List<Content> findByRoomIdOnlyFlashcardVariantAndActive(String roomId);
@@ -26,6 +25,6 @@ public interface ContentRepository extends CrudRepository<Content, String> {
 	int countPreparationVariantByRoomId(String roomId);
 	List<String> findIdsByRoomIdAndVariantAndSubject(String roomId, String questionVariant, String subject);
 	List<String> findSubjectsByRoomIdAndVariant(String roomId, String questionVariant);
-	List<String> findUnansweredIdsByRoomIdAndUserOnlyLectureVariant(String roomId, ClientAuthentication user);
-	List<String> findUnansweredIdsByRoomIdAndUserOnlyPreparationVariant(String roomId, ClientAuthentication user);
+	List<String> findUnansweredIdsByRoomIdAndUserOnlyLectureVariant(String roomId, String userId);
+	List<String> findUnansweredIdsByRoomIdAndUserOnlyPreparationVariant(String roomId, String userId);
 }
diff --git a/src/main/java/de/thm/arsnova/persistence/RoomRepository.java b/src/main/java/de/thm/arsnova/persistence/RoomRepository.java
index 9e811203ca4b6e2691dff15ebb9364ac92c21f0d..1d61c33c4182a5a0b9da49c429d2a11752df25dd 100644
--- a/src/main/java/de/thm/arsnova/persistence/RoomRepository.java
+++ b/src/main/java/de/thm/arsnova/persistence/RoomRepository.java
@@ -31,12 +31,12 @@ public interface RoomRepository extends CrudRepository<Room, String> {
 	List<Room> findByOwnerId(String ownerId, int start, int limit);
 	List<String> findIdsByOwnerId(String ownerId);
 	List<Room> findAllForPublicPool();
-	List<Room> findForPublicPoolByOwner(ClientAuthentication owner);
-	List<Room> getRoomsWithStatsForOwner(ClientAuthentication owner, int start, int limit);
-	List<Room> getRoomHistoryWithStatsForUser(List<Room> rooms, ClientAuthentication owner);
+	List<Room> findForPublicPoolByOwnerId(String ownerId);
+	List<Room> getRoomsWithStatsForOwnerId(String ownerId, int start, int limit);
+	List<Room> getRoomHistoryWithStatsForUser(List<Room> rooms, String ownerId);
 	List<Room> findInfosForPublicPool();
-	List<Room> findInfosForPublicPoolByOwner(ClientAuthentication owner);
+	List<Room> findInfosForPublicPoolByOwnerId(String ownerId);
 	List<Room> findRoomsByCourses(List<Course> courses);
-	Room importRoom(ClientAuthentication user, ImportExportContainer importRoom);
+	Room importRoom(String userId, ImportExportContainer importRoom);
 	ImportExportContainer exportRoom(String id, Boolean withAnswer, Boolean withFeedbackQuestions);
 }
diff --git a/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbAnswerRepository.java b/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbAnswerRepository.java
index 026246bb3b9b3cb7bdd8cf3bd548fd579c592b5b..9b1d3d6e08ddb606b7b7bbed4c7176f7be4b2ddb 100644
--- a/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbAnswerRepository.java
+++ b/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbAnswerRepository.java
@@ -4,7 +4,6 @@ import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.collect.Lists;
 import de.thm.arsnova.model.Answer;
 import de.thm.arsnova.model.AnswerStatistics;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.persistence.AnswerRepository;
 import de.thm.arsnova.persistence.LogEntryRepository;
 import org.ektorp.BulkDeleteDocument;
@@ -75,9 +74,9 @@ public class CouchDbAnswerRepository extends CouchDbCrudRepository<Answer> imple
 	}
 
 	@Override
-	public <T extends Answer> T findByContentIdUserPiRound(final String contentId, final Class<T> type, final ClientAuthentication user, final int piRound) {
+	public <T extends Answer> T findByContentIdUserIdPiRound(final String contentId, final Class<T> type, final String userId, final int piRound) {
 		final List<T> answerList = db.queryView(createQuery("by_contentid_creatorid_round")
-				.key(ComplexKey.of(contentId, user.getUsername(), piRound)), type);
+				.key(ComplexKey.of(contentId, userId, piRound)), type);
 		return answerList.isEmpty() ? null : answerList.get(0);
 	}
 
@@ -164,8 +163,8 @@ public class CouchDbAnswerRepository extends CouchDbCrudRepository<Answer> imple
 	}
 
 	@Override
-	public List<Answer> findByUserRoomId(final ClientAuthentication user, final String roomId) {
-		return queryView("by_creatorid_roomid", ComplexKey.of(user.getId(), roomId));
+	public List<Answer> findByUserIdRoomId(final String userId, final String roomId) {
+		return queryView("by_creatorid_roomid", ComplexKey.of(userId, roomId));
 	}
 
 	@Override
diff --git a/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbCommentRepository.java b/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbCommentRepository.java
index 8b353d242c545e91e57b40a09d5539293048070c..32e28fb08a0ffa3783875d4532383ffe124d8489 100644
--- a/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbCommentRepository.java
+++ b/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbCommentRepository.java
@@ -2,7 +2,6 @@ package de.thm.arsnova.persistence.couchdb;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import de.thm.arsnova.model.Comment;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.migration.v2.CommentReadingCount;
 import de.thm.arsnova.persistence.CommentRepository;
 import de.thm.arsnova.persistence.LogEntryRepository;
@@ -50,10 +49,10 @@ public class CouchDbCommentRepository extends CouchDbCrudRepository<Comment> imp
 	}
 
 	@Override
-	public CommentReadingCount countReadingByRoomIdAndUser(final String roomId, final ClientAuthentication user) {
+	public CommentReadingCount countReadingByRoomIdAndUserId(final String roomId, final String userId) {
 		final ViewResult result = db.queryView(createQuery("by_roomid_creatorid_read")
-				.startKey(ComplexKey.of(roomId, user.getId()))
-				.endKey(ComplexKey.of(roomId, user.getId(), ComplexKey.emptyObject()))
+				.startKey(ComplexKey.of(roomId, userId))
+				.endKey(ComplexKey.of(roomId, userId, ComplexKey.emptyObject()))
 				.reduce(true)
 				.group(true));
 		return calculateReadingCount(result);
@@ -123,7 +122,7 @@ public class CouchDbCommentRepository extends CouchDbCrudRepository<Comment> imp
 	}
 
 	@Override
-	public List<Comment> findByRoomIdAndUser(final String roomId, final ClientAuthentication user, final int start, final int limit) {
+	public List<Comment> findByRoomIdAndUserId(final String roomId, final String userId, final int start, final int limit) {
 		final int qSkip = start > 0 ? start : -1;
 		final int qLimit = limit > 0 ? limit : -1;
 
@@ -131,8 +130,8 @@ public class CouchDbCommentRepository extends CouchDbCrudRepository<Comment> imp
 						.skip(qSkip)
 						.limit(qLimit)
 						.descending(true)
-						.startKey(ComplexKey.of(roomId, user.getUsername(), ComplexKey.emptyObject()))
-						.endKey(ComplexKey.of(roomId, user.getUsername()))
+						.startKey(ComplexKey.of(roomId, userId, ComplexKey.emptyObject()))
+						.endKey(ComplexKey.of(roomId, userId))
 						.includeDocs(true),
 				Comment.class);
 //		for (Comment comment : comments) {
@@ -150,10 +149,10 @@ public class CouchDbCommentRepository extends CouchDbCrudRepository<Comment> imp
 	}
 
 	@Override
-	public int deleteByRoomIdAndUser(final String roomId, final ClientAuthentication user) {
+	public int deleteByRoomIdAndUserId(final String roomId, final String userId) {
 		final ViewResult result = db.queryView(createQuery("by_roomid_creatorid_read")
-				.startKey(ComplexKey.of(roomId, user.getUsername()))
-				.endKey(ComplexKey.of(roomId, user.getUsername(), ComplexKey.emptyObject())));
+				.startKey(ComplexKey.of(roomId, userId))
+				.endKey(ComplexKey.of(roomId, userId, ComplexKey.emptyObject())));
 
 		return delete(result);
 	}
diff --git a/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbContentRepository.java b/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbContentRepository.java
index 5defab3aff88efcdcae75519b36795bb9d7931d6..02928a5d95fc5ef985686cb3794c0e5681d887ed 100644
--- a/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbContentRepository.java
+++ b/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbContentRepository.java
@@ -1,7 +1,6 @@
 package de.thm.arsnova.persistence.couchdb;
 
 import de.thm.arsnova.model.Content;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.persistence.ContentRepository;
 import de.thm.arsnova.persistence.LogEntryRepository;
 import org.ektorp.BulkDeleteDocument;
@@ -93,11 +92,11 @@ public class CouchDbContentRepository extends CouchDbCrudRepository<Content> imp
 	}
 
 	@Override
-	public List<String> findUnansweredIdsByRoomIdAndUser(final String roomId, final ClientAuthentication user) {
+	public List<String> findUnansweredIdsByRoomIdAndUser(final String roomId, final String userId) {
 		final ViewResult result = db.queryView(createQuery("contentid_by_creatorid_roomid_variant")
 				.designDocId("_design/Answer")
-				.startKey(ComplexKey.of(user.getId(), roomId))
-				.endKey(ComplexKey.of(user.getUsername(), roomId, ComplexKey.emptyObject())));
+				.startKey(ComplexKey.of(userId, roomId))
+				.endKey(ComplexKey.of(userId, roomId, ComplexKey.emptyObject())));
 		final List<String> answeredIds = new ArrayList<>();
 		for (final ViewResult.Row row : result.getRows()) {
 			answeredIds.add(row.getId());
@@ -106,10 +105,10 @@ public class CouchDbContentRepository extends CouchDbCrudRepository<Content> imp
 	}
 
 	@Override
-	public List<String> findUnansweredIdsByRoomIdAndUserOnlyLectureVariant(final String roomId, final ClientAuthentication user) {
+	public List<String> findUnansweredIdsByRoomIdAndUserOnlyLectureVariant(final String roomId, final String userId) {
 		final ViewResult result = db.queryView(createQuery("contentid_round_by_creatorid_roomid_variant")
 				.designDocId("_design/Answer")
-				.key(ComplexKey.of(user.getId(), roomId, "lecture")));
+				.key(ComplexKey.of(userId, roomId, "lecture")));
 		final Map<String, Integer> answeredQuestions = new HashMap<>();
 		for (final ViewResult.Row row : result.getRows()) {
 			answeredQuestions.put(row.getId(), row.getKeyAsNode().get(2).asInt());
@@ -119,10 +118,10 @@ public class CouchDbContentRepository extends CouchDbCrudRepository<Content> imp
 	}
 
 	@Override
-	public List<String> findUnansweredIdsByRoomIdAndUserOnlyPreparationVariant(final String roomId, final ClientAuthentication user) {
+	public List<String> findUnansweredIdsByRoomIdAndUserOnlyPreparationVariant(final String roomId, final String userId) {
 		final ViewResult result = db.queryView(createQuery("contentid_round_by_creatorid_roomid_variant")
 				.designDocId("_design/Answer")
-				.key(ComplexKey.of(user.getId(), roomId, "preparation")));
+				.key(ComplexKey.of(userId, roomId, "preparation")));
 		final Map<String, Integer> answeredQuestions = new HashMap<>();
 		for (final ViewResult.Row row : result.getRows()) {
 			answeredQuestions.put(row.getId(), row.getKeyAsNode().get(2).asInt());
diff --git a/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbRoomRepository.java b/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbRoomRepository.java
index 6a7c4e32ad95e32d12a41d0ad021b0b3004b2929..9986c57c6c20f73fb8b1f0be86eb25847c10b4ac 100644
--- a/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbRoomRepository.java
+++ b/src/main/java/de/thm/arsnova/persistence/couchdb/CouchDbRoomRepository.java
@@ -103,7 +103,7 @@ public class CouchDbRoomRepository extends CouchDbCrudRepository<Room> implement
 
 	/* TODO: Move to service layer. */
 	@Override
-	public Room importRoom(final ClientAuthentication user, final ImportExportContainer importRoom) {
+	public Room importRoom(final String userId, final ImportExportContainer importRoom) {
 		/* FIXME: not yet migrated - move to service layer */
 		throw new UnsupportedOperationException();
 //		final Room session = this.saveSession(user, importRoom.generateSessionEntity(user));
@@ -309,20 +309,20 @@ public class CouchDbRoomRepository extends CouchDbCrudRepository<Room> implement
 	}
 
 	@Override
-	public List<Room> findForPublicPoolByOwner(final ClientAuthentication owner) {
+	public List<Room> findForPublicPoolByOwnerId(final String ownerId) {
 		/* TODO: Only load IDs and check against cache for data. */
 		return db.queryView(
 				createQuery("partial_by_pool_ownerid_name")
-						.startKey(ComplexKey.of(true, owner.getId()))
-						.endKey(ComplexKey.of(true, owner.getId(), ComplexKey.emptyObject()))
+						.startKey(ComplexKey.of(true, ownerId))
+						.endKey(ComplexKey.of(true, ownerId, ComplexKey.emptyObject()))
 						.includeDocs(true),
 				Room.class);
 	}
 
 	/* TODO: Move to service layer. */
 	@Override
-	public List<Room> findInfosForPublicPoolByOwner(final ClientAuthentication owner) {
-		final List<Room> rooms = this.findForPublicPoolByOwner(owner);
+	public List<Room> findInfosForPublicPoolByOwnerId(final String ownerId) {
+		final List<Room> rooms = this.findForPublicPoolByOwnerId(ownerId);
 		if (rooms.isEmpty()) {
 			return new ArrayList<>();
 		}
@@ -331,8 +331,8 @@ public class CouchDbRoomRepository extends CouchDbCrudRepository<Room> implement
 
 	/* TODO: Move to service layer. */
 	@Override
-	public List<Room> getRoomsWithStatsForOwner(final ClientAuthentication owner, final int start, final int limit) {
-		final List<Room> rooms = this.findByOwner(owner, start, limit);
+	public List<Room> getRoomsWithStatsForOwnerId(final String ownerId, final int start, final int limit) {
+		final List<Room> rooms = this.findByOwnerId(ownerId, start, limit);
 		if (rooms.isEmpty()) {
 			return new ArrayList<>();
 		}
@@ -355,9 +355,9 @@ public class CouchDbRoomRepository extends CouchDbCrudRepository<Room> implement
 	}
 
 	/* TODO: Move to service layer. */
-	public List<Room> getRoomHistoryWithStatsForUser(final List<Room> rooms, final ClientAuthentication user) {
+	public List<Room> getRoomHistoryWithStatsForUser(final List<Room> rooms, final String ownerId) {
 		final ViewQuery answeredQuestionsView = createQuery("by_creatorid_roomid").designDocId("_design/Answer")
-				.reduce(false).keys(rooms.stream().map(room -> ComplexKey.of(user.getId(), room.getId())).collect(Collectors.toList()));
+				.reduce(false).keys(rooms.stream().map(room -> ComplexKey.of(ownerId, room.getId())).collect(Collectors.toList()));
 		final ViewQuery contentIdsView = createQuery("by_roomid").designDocId("_design/Content")
 				.reduce(false).keys(rooms.stream().map(Room::getId).collect(Collectors.toList()));
 
diff --git a/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java b/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java
index beb8741d0a72a577a9d6cad1f60b84c4453917f5..2e8fdd8adbb4f003907d509c3ef2c40d66627f4d 100644
--- a/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java
+++ b/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java
@@ -17,10 +17,10 @@
  */
 package de.thm.arsnova.security;
 
-import de.thm.arsnova.model.Motd;
-import de.thm.arsnova.model.Room;
 import de.thm.arsnova.model.Comment;
 import de.thm.arsnova.model.Content;
+import de.thm.arsnova.model.Motd;
+import de.thm.arsnova.model.Room;
 import de.thm.arsnova.model.UserProfile;
 import de.thm.arsnova.persistence.CommentRepository;
 import de.thm.arsnova.persistence.ContentRepository;
diff --git a/src/main/java/de/thm/arsnova/security/User.java b/src/main/java/de/thm/arsnova/security/User.java
index 35f1fb64bc7448a532b0477724017431e90a2c28..80efecfc24df6fa7891479d98c2710b2ce2464d9 100644
--- a/src/main/java/de/thm/arsnova/security/User.java
+++ b/src/main/java/de/thm/arsnova/security/User.java
@@ -17,8 +17,8 @@
  */
 package de.thm.arsnova.security;
 
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.UserProfile;
+import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import org.springframework.security.core.GrantedAuthority;
 
 import java.util.Collection;
diff --git a/src/main/java/de/thm/arsnova/service/AnswerService.java b/src/main/java/de/thm/arsnova/service/AnswerService.java
index 536d410dd8057a67f44134bfb24d00d9111fa3e7..759815ccf0dd77f8afccf504940dc9c6c2794c6d 100644
--- a/src/main/java/de/thm/arsnova/service/AnswerService.java
+++ b/src/main/java/de/thm/arsnova/service/AnswerService.java
@@ -3,7 +3,6 @@ package de.thm.arsnova.service;
 import de.thm.arsnova.model.Answer;
 import de.thm.arsnova.model.AnswerStatistics;
 import de.thm.arsnova.model.TextAnswer;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 
 import java.util.List;
 import java.util.Map;
@@ -11,7 +10,7 @@ import java.util.Map;
 public interface AnswerService extends EntityService<Answer> {
 	Answer getMyAnswer(String contentId);
 
-	void getFreetextAnswerAndMarkRead(String answerId, ClientAuthentication user);
+	void getFreetextAnswerAndMarkRead(String answerId, String userId);
 
 	AnswerStatistics getStatistics(String contentId, int piRound);
 
diff --git a/src/main/java/de/thm/arsnova/service/AnswerServiceImpl.java b/src/main/java/de/thm/arsnova/service/AnswerServiceImpl.java
index 5b5535ad9ae94961325c58fb4a26e2946d54221c..c7dd6e56127317c99c602a35f4e96a89736aaa51 100644
--- a/src/main/java/de/thm/arsnova/service/AnswerServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/AnswerServiceImpl.java
@@ -17,21 +17,21 @@
  */
 package de.thm.arsnova.service;
 
+import de.thm.arsnova.event.DeleteAnswerEvent;
+import de.thm.arsnova.event.NewAnswerEvent;
 import de.thm.arsnova.model.Answer;
 import de.thm.arsnova.model.AnswerStatistics;
 import de.thm.arsnova.model.ChoiceQuestionContent;
 import de.thm.arsnova.model.Content;
 import de.thm.arsnova.model.Room;
 import de.thm.arsnova.model.TextAnswer;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.transport.AnswerQueueElement;
-import de.thm.arsnova.event.DeleteAnswerEvent;
-import de.thm.arsnova.event.NewAnswerEvent;
-import de.thm.arsnova.web.exceptions.NotFoundException;
-import de.thm.arsnova.web.exceptions.UnauthorizedException;
 import de.thm.arsnova.persistence.AnswerRepository;
 import de.thm.arsnova.persistence.ContentRepository;
 import de.thm.arsnova.persistence.RoomRepository;
+import de.thm.arsnova.security.User;
+import de.thm.arsnova.web.exceptions.NotFoundException;
+import de.thm.arsnova.web.exceptions.UnauthorizedException;
 import org.ektorp.DbAccessException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -104,7 +104,7 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer>
 
 			// Send NewAnswerEvents ...
 			for (AnswerQueueElement e : elements) {
-				this.publisher.publishEvent(new NewAnswerEvent(this, e.getRoom(), e.getAnswer(), e.getUser(), e.getQuestion()));
+				this.publisher.publishEvent(new NewAnswerEvent(this, e.getRoom(), e.getAnswer(), e.getUserId(), e.getQuestion()));
 			}
 		} catch (final DbAccessException e) {
 			logger.error("Could not bulk save answers from queue.", e);
@@ -128,11 +128,11 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer>
 		if (content == null) {
 			throw new NotFoundException();
 		}
-		return answerRepository.findByContentIdUserPiRound(contentId, Answer.class, userService.getCurrentUser(), content.getState().getRound());
+		return answerRepository.findByContentIdUserIdPiRound(contentId, Answer.class, userService.getCurrentUser().getId(), content.getState().getRound());
 	}
 
 	@Override
-	public void getFreetextAnswerAndMarkRead(final String answerId, final ClientAuthentication user) {
+	public void getFreetextAnswerAndMarkRead(final String answerId, final String userId) {
 		final Answer answer = answerRepository.findOne(answerId);
 		if (!(answer instanceof TextAnswer)) {
 			throw new NotFoundException();
@@ -142,7 +142,7 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer>
 			return;
 		}
 		final Room room = roomRepository.findOne(textAnswer.getRoomId());
-		if (room.getOwnerId().equals(user.getId())) {
+		if (room.getOwnerId().equals(userId)) {
 			textAnswer.setRead(true);
 			answerRepository.save(textAnswer);
 		}
@@ -290,7 +290,7 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer>
 		}
 
 		/* filter answers by active piRound per content */
-		final List<Answer> answers = answerRepository.findByUserRoomId(userService.getCurrentUser(), roomId);
+		final List<Answer> answers = answerRepository.findByUserIdRoomId(userService.getCurrentUser().getId(), roomId);
 		final List<Answer> filteredAnswers = new ArrayList<>();
 		for (final Answer answer : answers) {
 			final Content content = contentIdToContent.get(answer.getContentId());
@@ -319,7 +319,7 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer>
 	@PreAuthorize("isAuthenticated()")
 	@CacheEvict(value = "answerlists", key = "#contentId")
 	public Answer saveAnswer(final String contentId, final Answer answer) {
-		final ClientAuthentication user = userService.getCurrentUser();
+		final User user = userService.getCurrentUser();
 		final Content content = contentService.get(contentId);
 		if (content == null) {
 			throw new NotFoundException();
@@ -352,7 +352,7 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer>
 			answer.setRound(content.getState().getRound());
 		}
 
-		this.answerQueue.offer(new AnswerQueueElement(room, content, answer, user));
+		this.answerQueue.offer(new AnswerQueueElement(room, content, answer, user.getId()));
 
 		return answer;
 	}
@@ -361,7 +361,7 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer>
 	@PreAuthorize("isAuthenticated()")
 	@CacheEvict(value = "answerlists", allEntries = true)
 	public Answer updateAnswer(final Answer answer) {
-		final ClientAuthentication user = userService.getCurrentUser();
+		final User user = userService.getCurrentUser();
 		final Answer realAnswer = this.getMyAnswer(answer.getContentId());
 		if (user == null || realAnswer == null || !user.getId().equals(realAnswer.getCreatorId())) {
 			throw new UnauthorizedException();
@@ -379,7 +379,7 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer>
 		answer.setContentId(content.getId());
 		answer.setRoomId(room.getId());
 		answerRepository.save(realAnswer);
-		this.publisher.publishEvent(new NewAnswerEvent(this, room, answer, user, content));
+		this.publisher.publishEvent(new NewAnswerEvent(this, room, answer, user.getId(), content));
 
 		return answer;
 	}
@@ -392,7 +392,7 @@ public class AnswerServiceImpl extends DefaultEntityServiceImpl<Answer>
 		if (content == null) {
 			throw new NotFoundException();
 		}
-		final ClientAuthentication user = userService.getCurrentUser();
+		final User user = userService.getCurrentUser();
 		final Room room = roomRepository.findOne(content.getRoomId());
 		if (user == null || room == null || !room.getOwnerId().equals(user.getId())) {
 			throw new UnauthorizedException();
diff --git a/src/main/java/de/thm/arsnova/service/CommentFindQueryService.java b/src/main/java/de/thm/arsnova/service/CommentFindQueryService.java
index fdbe5b88644e569b9df24ec3848bfc571ecebd23..1f5a8de9b7b4da65aae115dc215ad14a703060a1 100644
--- a/src/main/java/de/thm/arsnova/service/CommentFindQueryService.java
+++ b/src/main/java/de/thm/arsnova/service/CommentFindQueryService.java
@@ -17,8 +17,8 @@
  */
 package de.thm.arsnova.service;
 
-import de.thm.arsnova.model.FindQuery;
 import de.thm.arsnova.model.Comment;
+import de.thm.arsnova.model.FindQuery;
 import org.springframework.stereotype.Service;
 
 import java.util.HashSet;
diff --git a/src/main/java/de/thm/arsnova/service/CommentServiceImpl.java b/src/main/java/de/thm/arsnova/service/CommentServiceImpl.java
index 3404880e8cab1bdadc64c4d6504852491002a9cc..725b1bc35b72dc67a4503060a43461e473a91969 100644
--- a/src/main/java/de/thm/arsnova/service/CommentServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/CommentServiceImpl.java
@@ -1,15 +1,15 @@
 package de.thm.arsnova.service;
 
+import de.thm.arsnova.event.DeleteCommentEvent;
 import de.thm.arsnova.model.Comment;
 import de.thm.arsnova.model.Room;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.migration.v2.CommentReadingCount;
-import de.thm.arsnova.event.DeleteCommentEvent;
+import de.thm.arsnova.persistence.CommentRepository;
+import de.thm.arsnova.persistence.RoomRepository;
+import de.thm.arsnova.security.User;
 import de.thm.arsnova.web.exceptions.ForbiddenException;
 import de.thm.arsnova.web.exceptions.NotFoundException;
 import de.thm.arsnova.web.exceptions.UnauthorizedException;
-import de.thm.arsnova.persistence.CommentRepository;
-import de.thm.arsnova.persistence.RoomRepository;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.ApplicationEventPublisherAware;
@@ -56,7 +56,7 @@ public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implem
 	@PreAuthorize("isAuthenticated()")
 	public void prepareCreate(final Comment comment) {
 		final Room room = roomRepository.findOne(comment.getRoomId());
-		final ClientAuthentication user = userService.getCurrentUser();
+		final User user = userService.getCurrentUser();
 		comment.setCreatorId(user.getId());
 		comment.setRead(false);
 		if (comment.getTimestamp() == null) {
@@ -86,11 +86,11 @@ public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implem
 		if (room == null) {
 			throw new UnauthorizedException();
 		}
-		final ClientAuthentication user = getCurrentUser();
+		final User user = getCurrentUser();
 		if (room.getOwnerId().equals(user.getId())) {
 			commentRepository.deleteByRoomId(room.getId());
 		} else {
-			commentRepository.deleteByRoomIdAndUser(room.getId(), user);
+			commentRepository.deleteByRoomIdAndUserId(room.getId(), user.getId());
 		}
 	}
 
@@ -106,12 +106,12 @@ public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implem
 		if (username == null) {
 			return commentRepository.countReadingByRoomId(roomId);
 		} else {
-			ClientAuthentication currentUser = userService.getCurrentUser();
-			if (!currentUser.getUsername().equals(username)) {
+			User user = userService.getCurrentUser();
+			if (!user.getUsername().equals(username)) {
 				throw new ForbiddenException();
 			}
 
-			return commentRepository.countReadingByRoomIdAndUser(roomId, currentUser);
+			return commentRepository.countReadingByRoomIdAndUserId(roomId, user.getId());
 		}
 	}
 
@@ -119,11 +119,11 @@ public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implem
 	@PreAuthorize("isAuthenticated()")
 	public List<Comment> getByRoomId(final String roomId, final int offset, final int limit) {
 		final Room room = roomRepository.findOne(roomId);
-		final ClientAuthentication user = getCurrentUser();
+		final User user = getCurrentUser();
 		if (room.getOwnerId().equals(user.getId())) {
 			return commentRepository.findByRoomId(room.getId(), offset, limit);
 		} else {
-			return commentRepository.findByRoomIdAndUser(room.getId(), user, offset, limit);
+			return commentRepository.findByRoomIdAndUserId(room.getId(), user.getId(), offset, limit);
 		}
 	}
 
@@ -141,8 +141,8 @@ public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implem
 		return comment;
 	}
 
-	private ClientAuthentication getCurrentUser() {
-		final ClientAuthentication user = userService.getCurrentUser();
+	private User getCurrentUser() {
+		final User user = userService.getCurrentUser();
 		if (user == null) {
 			throw new UnauthorizedException();
 		}
diff --git a/src/main/java/de/thm/arsnova/service/ContentService.java b/src/main/java/de/thm/arsnova/service/ContentService.java
index 253298413d7e5fc8242fbca3fee26ec8d10e4334..dbb3d8b5a9806e42c94aacbbded01fa8d3eb687e 100644
--- a/src/main/java/de/thm/arsnova/service/ContentService.java
+++ b/src/main/java/de/thm/arsnova/service/ContentService.java
@@ -35,7 +35,6 @@
 package de.thm.arsnova.service;
 
 import de.thm.arsnova.model.Content;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 
 import java.util.List;
 
@@ -69,11 +68,11 @@ public interface ContentService extends EntityService<Content> {
 
 	List<String> getUnAnsweredLectureContentIds(String roomId);
 
-	List<String> getUnAnsweredLectureContentIds(String roomId, ClientAuthentication user);
+	List<String> getUnAnsweredLectureContentIds(String roomId, String userId);
 
 	List<String> getUnAnsweredPreparationContentIds(String roomId);
 
-	List<String> getUnAnsweredPreparationContentIds(String roomId, ClientAuthentication user);
+	List<String> getUnAnsweredPreparationContentIds(String roomId, String userId);
 
 	void publishAll(String roomId, boolean publish);
 
diff --git a/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java b/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java
index a2e11f4f3ee297032d3bb5f9c728a7a270e462c8..1b0aee13578d7e734743eb2b82d9acb71e721903 100644
--- a/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/ContentServiceImpl.java
@@ -17,16 +17,16 @@
  */
 package de.thm.arsnova.service;
 
+import de.thm.arsnova.event.*;
 import de.thm.arsnova.model.Content;
 import de.thm.arsnova.model.Room;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
-import de.thm.arsnova.event.*;
-import de.thm.arsnova.web.exceptions.NotFoundException;
-import de.thm.arsnova.web.exceptions.UnauthorizedException;
 import de.thm.arsnova.persistence.AnswerRepository;
 import de.thm.arsnova.persistence.ContentRepository;
 import de.thm.arsnova.persistence.LogEntryRepository;
 import de.thm.arsnova.persistence.RoomRepository;
+import de.thm.arsnova.security.User;
+import de.thm.arsnova.web.exceptions.NotFoundException;
+import de.thm.arsnova.web.exceptions.UnauthorizedException;
 import org.ektorp.DocumentNotFoundException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -109,7 +109,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	//@Cacheable("contentlists")
 	public List<Content> getByRoomId(final String roomId) {
 		final Room room = roomRepository.findOne(roomId);
-		final ClientAuthentication user = userService.getCurrentUser();
+		final User user = userService.getCurrentUser();
 		if (room.getOwnerId().equals(user.getId())) {
 			return contentRepository.findByRoomIdForSpeaker(roomId);
 		} else {
@@ -206,7 +206,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 
 	@Override
 	public void prepareUpdate(final Content content) {
-		final ClientAuthentication user = userService.getCurrentUser();
+		final User user = userService.getCurrentUser();
 		final Content oldContent = contentRepository.findOne(content.getId());
 		if (null == oldContent) {
 			throw new NotFoundException();
@@ -386,7 +386,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 			@CacheEvict(value = "preparationcontentlists", key = "#roomId"),
 			@CacheEvict(value = "flashcardcontentlists", key = "#roomId") })
 	public void setVotingAdmissions(final String roomId, final boolean disableVoting, Iterable<Content> contents) {
-		final ClientAuthentication user = getCurrentUser();
+		final User user = getCurrentUser();
 		final Room room = roomRepository.findOne(roomId);
 		if (!room.getOwnerId().equals(user.getId())) {
 			throw new UnauthorizedException();
@@ -412,7 +412,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	}
 
 	private Room getRoomWithAuthCheck(final String roomId) {
-		final ClientAuthentication user = userService.getCurrentUser();
+		final User user = userService.getCurrentUser();
 		final Room room = roomRepository.findOne(roomId);
 		if (user == null || room == null || !room.getOwnerId().equals(user.getId())) {
 			throw new UnauthorizedException();
@@ -423,12 +423,12 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public List<String> getUnAnsweredContentIds(final String roomId) {
-		final ClientAuthentication user = getCurrentUser();
-		return contentRepository.findUnansweredIdsByRoomIdAndUser(roomId, user);
+		final User user = getCurrentUser();
+		return contentRepository.findUnansweredIdsByRoomIdAndUser(roomId, user.getId());
 	}
 
-	private ClientAuthentication getCurrentUser() {
-		final ClientAuthentication user = userService.getCurrentUser();
+	private User getCurrentUser() {
+		final User user = userService.getCurrentUser();
 		if (user == null) {
 			throw new UnauthorizedException();
 		}
@@ -447,32 +447,32 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public List<String> getUnAnsweredLectureContentIds(final String roomId) {
-		final ClientAuthentication user = getCurrentUser();
-		return this.getUnAnsweredLectureContentIds(roomId, user);
+		final User user = getCurrentUser();
+		return this.getUnAnsweredLectureContentIds(roomId, user.getId());
 	}
 
 	@Override
-	public List<String> getUnAnsweredLectureContentIds(final String roomId, final ClientAuthentication user) {
-		return contentRepository.findUnansweredIdsByRoomIdAndUserOnlyLectureVariant(roomId, user);
+	public List<String> getUnAnsweredLectureContentIds(final String roomId, final String userId) {
+		return contentRepository.findUnansweredIdsByRoomIdAndUserOnlyLectureVariant(roomId, userId);
 	}
 
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public List<String> getUnAnsweredPreparationContentIds(final String roomId) {
-		final ClientAuthentication user = getCurrentUser();
-		return this.getUnAnsweredPreparationContentIds(roomId, user);
+		final User user = getCurrentUser();
+		return this.getUnAnsweredPreparationContentIds(roomId, user.getId());
 	}
 
 	@Override
-	public List<String> getUnAnsweredPreparationContentIds(final String roomId, final ClientAuthentication user) {
-		return contentRepository.findUnansweredIdsByRoomIdAndUserOnlyPreparationVariant(roomId, user);
+	public List<String> getUnAnsweredPreparationContentIds(final String roomId, final String userId) {
+		return contentRepository.findUnansweredIdsByRoomIdAndUserOnlyPreparationVariant(roomId, userId);
 	}
 
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public void publishAll(final String roomId, final boolean publish) {
 		/* TODO: resolve redundancies */
-		final ClientAuthentication user = getCurrentUser();
+		final User user = getCurrentUser();
 		final Room room = roomRepository.findOne(roomId);
 		if (!room.getOwnerId().equals(user.getId())) {
 			throw new UnauthorizedException();
@@ -489,7 +489,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 			@CacheEvict(value = "preparationcontentlists", key = "#roomId"),
 			@CacheEvict(value = "flashcardcontentlists", key = "#roomId") })
 	public void publishContents(final String roomId, final boolean publish, Iterable<Content> contents) {
-		final ClientAuthentication user = getCurrentUser();
+		final User user = getCurrentUser();
 		final Room room = roomRepository.findOne(roomId);
 		if (!room.getOwnerId().equals(user.getId())) {
 			throw new UnauthorizedException();
@@ -514,7 +514,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	@PreAuthorize("isAuthenticated()")
 	@CacheEvict(value = "answerlists", allEntries = true)
 	public void deleteAllContentsAnswers(final String roomId) {
-		final ClientAuthentication user = getCurrentUser();
+		final User user = getCurrentUser();
 		final Room room = roomRepository.findOne(roomId);
 		if (!room.getOwnerId().equals(user.getId())) {
 			throw new UnauthorizedException();
diff --git a/src/main/java/de/thm/arsnova/service/FeedbackService.java b/src/main/java/de/thm/arsnova/service/FeedbackService.java
index 1b5ab72e691b963939da7516e512e57aace1e836..dfacd7482df50d3d17653018f14080182f1561ea 100644
--- a/src/main/java/de/thm/arsnova/service/FeedbackService.java
+++ b/src/main/java/de/thm/arsnova/service/FeedbackService.java
@@ -18,7 +18,6 @@
 package de.thm.arsnova.service;
 
 import de.thm.arsnova.model.Feedback;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 
 /**
  * The functionality the feedback service should provide.
@@ -36,7 +35,7 @@ public interface FeedbackService {
 
 	long calculateRoundedAverageFeedback(String roomId);
 
-	boolean save(String roomId, int value, ClientAuthentication user);
+	boolean save(String roomId, int value, String userId);
 
-	Integer getByRoomIdAndUser(String roomId, ClientAuthentication user);
+	Integer getByRoomIdAndUserId(String roomId, String userId);
 }
diff --git a/src/main/java/de/thm/arsnova/service/FeedbackServiceImpl.java b/src/main/java/de/thm/arsnova/service/FeedbackServiceImpl.java
index 81a3660135ac3364ead1f25a448b2449dbc57ec2..842322bfa14a2b490ee5bca5426e09ef2a83eda3 100644
--- a/src/main/java/de/thm/arsnova/service/FeedbackServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/FeedbackServiceImpl.java
@@ -17,14 +17,13 @@
  */
 package de.thm.arsnova.service;
 
-import de.thm.arsnova.model.Feedback;
-import de.thm.arsnova.model.Room;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.event.DeleteFeedbackForRoomsEvent;
 import de.thm.arsnova.event.NewFeedbackEvent;
+import de.thm.arsnova.model.Feedback;
+import de.thm.arsnova.model.Room;
+import de.thm.arsnova.persistence.RoomRepository;
 import de.thm.arsnova.web.exceptions.NoContentException;
 import de.thm.arsnova.web.exceptions.NotFoundException;
-import de.thm.arsnova.persistence.RoomRepository;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.ApplicationEventPublisherAware;
@@ -66,33 +65,33 @@ public class FeedbackServiceImpl implements FeedbackService, ApplicationEventPub
 	@Override
 	@Scheduled(fixedDelay = DEFAULT_SCHEDULER_DELAY)
 	public void cleanFeedbackVotes() {
-		Map<Room, List<ClientAuthentication>> deletedFeedbackOfUsersInSession = feedbackStorage.cleanVotes(cleanupFeedbackDelay);
+		Map<Room, List<String>> deletedFeedbackOfUsersInSession = feedbackStorage.cleanVotes(cleanupFeedbackDelay);
 		/*
 		 * mapping (Room -> Users) is not suitable for web sockets, because we want to sent all affected
 		 * sessions to a single user in one go instead of sending multiple messages for each session. Hence,
 		 * we need the mapping (User -> Sessions)
 		 */
-		final Map<ClientAuthentication, Set<Room>> affectedSessionsOfUsers = new HashMap<>();
+		final Map<String, Set<Room>> affectedSessionsOfUsers = new HashMap<>();
 
-		for (Map.Entry<Room, List<ClientAuthentication>> entry : deletedFeedbackOfUsersInSession.entrySet()) {
+		for (Map.Entry<Room, List<String>> entry : deletedFeedbackOfUsersInSession.entrySet()) {
 			final Room room = entry.getKey();
-			final List<ClientAuthentication> users = entry.getValue();
-			for (ClientAuthentication user : users) {
+			final List<String> userIds = entry.getValue();
+			for (String userId : userIds) {
 				Set<Room> affectedSessions;
-				if (affectedSessionsOfUsers.containsKey(user)) {
-					affectedSessions = affectedSessionsOfUsers.get(user);
+				if (affectedSessionsOfUsers.containsKey(userId)) {
+					affectedSessions = affectedSessionsOfUsers.get(userId);
 				} else {
 					affectedSessions = new HashSet<>();
 				}
 				affectedSessions.add(room);
-				affectedSessionsOfUsers.put(user, affectedSessions);
+				affectedSessionsOfUsers.put(userId, affectedSessions);
 			}
 		}
 		// Send feedback reset event to all affected users
-		for (Map.Entry<ClientAuthentication, Set<Room>> entry : affectedSessionsOfUsers.entrySet()) {
-			final ClientAuthentication user = entry.getKey();
+		for (Map.Entry<String, Set<Room>> entry : affectedSessionsOfUsers.entrySet()) {
+			final String userId = entry.getKey();
 			final Set<Room> arsSessions = entry.getValue();
-			this.publisher.publishEvent(new DeleteFeedbackForRoomsEvent(this, arsSessions, user));
+			this.publisher.publishEvent(new DeleteFeedbackForRoomsEvent(this, arsSessions, userId));
 		}
 		// For each session that has deleted feedback, send the new feedback to all clients
 		for (Room session : deletedFeedbackOfUsersInSession.keySet()) {
@@ -103,13 +102,13 @@ public class FeedbackServiceImpl implements FeedbackService, ApplicationEventPub
 	@Override
 	public void cleanFeedbackVotesByRoomId(final String roomId, final int cleanupFeedbackDelayInMins) {
 		final Room room = roomRepository.findOne(roomId);
-		List<ClientAuthentication> affectedUsers = feedbackStorage.cleanVotesByRoom(room, cleanupFeedbackDelayInMins);
+		List<String> affectedUserIds = feedbackStorage.cleanVotesByRoom(room, cleanupFeedbackDelayInMins);
 		Set<Room> sessionSet = new HashSet<>();
 		sessionSet.add(room);
 
 		// Send feedback reset event to all affected users
-		for (ClientAuthentication user : affectedUsers) {
-			this.publisher.publishEvent(new DeleteFeedbackForRoomsEvent(this, sessionSet, user));
+		for (String userId : affectedUserIds) {
+			this.publisher.publishEvent(new DeleteFeedbackForRoomsEvent(this, sessionSet, userId));
 		}
 		// send the new feedback to all clients in affected session
 		this.publisher.publishEvent(new NewFeedbackEvent(this, room));
@@ -157,24 +156,24 @@ public class FeedbackServiceImpl implements FeedbackService, ApplicationEventPub
 	}
 
 	@Override
-	public boolean save(final String roomId, final int value, final ClientAuthentication user) {
+	public boolean save(final String roomId, final int value, final String userId) {
 		final Room room = roomRepository.findOne(roomId);
 		if (room == null) {
 			throw new NotFoundException();
 		}
-		feedbackStorage.save(room, value, user);
+		feedbackStorage.save(room, value, userId);
 
 		this.publisher.publishEvent(new NewFeedbackEvent(this, room));
 		return true;
 	}
 
 	@Override
-	public Integer getByRoomIdAndUser(final String roomId, final ClientAuthentication user) {
+	public Integer getByRoomIdAndUserId(final String roomId, final String userId) {
 		final Room room = roomRepository.findOne(roomId);
 		if (room == null) {
 			throw new NotFoundException();
 		}
-		return feedbackStorage.getByRoomAndUser(room, user);
+		return feedbackStorage.getByRoomAndUserId(room, userId);
 	}
 
 	@Override
diff --git a/src/main/java/de/thm/arsnova/service/FeedbackStorageService.java b/src/main/java/de/thm/arsnova/service/FeedbackStorageService.java
index 74dc27e735366df72b2680afaf6038d8586fea35..be73cedcb58bd1ef7575f87a609e86fac31bf4a2 100644
--- a/src/main/java/de/thm/arsnova/service/FeedbackStorageService.java
+++ b/src/main/java/de/thm/arsnova/service/FeedbackStorageService.java
@@ -2,15 +2,14 @@ package de.thm.arsnova.service;
 
 import de.thm.arsnova.model.Feedback;
 import de.thm.arsnova.model.Room;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 
 import java.util.List;
 import java.util.Map;
 
 public interface FeedbackStorageService {
 	Feedback getByRoom(Room room);
-	Integer getByRoomAndUser(Room room, ClientAuthentication u);
-	void save(Room room, int value, ClientAuthentication user);
-	Map<Room, List<ClientAuthentication>> cleanVotes(int cleanupFeedbackDelay);
-	List<ClientAuthentication> cleanVotesByRoom(Room room, int cleanupFeedbackDelayInMins);
+	Integer getByRoomAndUserId(Room room, String userId);
+	void save(Room room, int value, String userId);
+	Map<Room, List<String>> cleanVotes(int cleanupFeedbackDelay);
+	List<String> cleanVotesByRoom(Room room, int cleanupFeedbackDelayInMins);
 }
diff --git a/src/main/java/de/thm/arsnova/service/FeedbackStorageServiceImpl.java b/src/main/java/de/thm/arsnova/service/FeedbackStorageServiceImpl.java
index ef8df172c17eab42df5b86ebec22efc794b01d64..47c8ad10ec3b4b855eaecb3f020522dfcae03f00 100644
--- a/src/main/java/de/thm/arsnova/service/FeedbackStorageServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/FeedbackStorageServiceImpl.java
@@ -19,7 +19,6 @@ package de.thm.arsnova.service;
 
 import de.thm.arsnova.model.Feedback;
 import de.thm.arsnova.model.Room;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
@@ -42,12 +41,12 @@ public class FeedbackStorageServiceImpl implements FeedbackStorageService {
 	private static class FeedbackStorageObject {
 		private final int value;
 		private final Date timestamp;
-		private final ClientAuthentication user;
+		private final String userId;
 
-		public FeedbackStorageObject(final int initValue, final ClientAuthentication u) {
+		public FeedbackStorageObject(final int initValue, final String userId) {
 			value = initValue;
 			timestamp = new Date();
-			user = u;
+			this.userId = userId;
 		}
 
 		public int getValue() {
@@ -56,14 +55,14 @@ public class FeedbackStorageServiceImpl implements FeedbackStorageService {
 		public Date getTimestamp() {
 			return timestamp;
 		}
-		public boolean fromUser(final ClientAuthentication u) {
-			return user.equals(u);
+		public boolean fromUser(final String userId) {
+			return this.userId.equals(userId);
 		}
 	}
 
 	private static final Logger logger = LoggerFactory.getLogger(FeedbackStorageServiceImpl.class);
 
-	private final Map<Room, Map<ClientAuthentication, FeedbackStorageObject>> data =
+	private final Map<Room, Map<String, FeedbackStorageObject>> data =
 			new ConcurrentHashMap<>();
 
 	@Override
@@ -99,13 +98,13 @@ public class FeedbackStorageServiceImpl implements FeedbackStorageService {
 	}
 
 	@Override
-	public Integer getByRoomAndUser(final Room room, final ClientAuthentication u) {
+	public Integer getByRoomAndUserId(final Room room, final String userId) {
 		if (data.get(room) == null) {
 			return null;
 		}
 
 		for (final FeedbackStorageObject fso : data.get(room).values()) {
-			if (fso.fromUser(u)) {
+			if (fso.fromUser(userId)) {
 				return fso.getValue();
 			}
 		}
@@ -115,28 +114,28 @@ public class FeedbackStorageServiceImpl implements FeedbackStorageService {
 
 	@Override
 	@Transactional(isolation = Isolation.READ_COMMITTED)
-	public void save(final Room room, final int value, final ClientAuthentication user) {
+	public void save(final Room room, final int value, final String userId) {
 		logger.debug("Feedback data for {} Rooms is stored", data.size());
-		logger.debug("Saving feedback: Room: {}, Value: {}, User: {}", room, value, user);
-		Map<ClientAuthentication, FeedbackStorageObject> roomData = data.get(room);
+		logger.debug("Saving feedback: Room: {}, Value: {}, User: {}", room, value, userId);
+		Map<String, FeedbackStorageObject> roomData = data.get(room);
 		if (roomData == null) {
 			logger.debug("Creating new feedback container for Room: {}", room);
-			roomData = new ConcurrentHashMap<ClientAuthentication, FeedbackStorageObject>();
+			roomData = new ConcurrentHashMap<String, FeedbackStorageObject>();
 			data.put(room, roomData);
 		}
 		logger.debug("Feedback values for Room {}: {}", room.getId(), roomData.size());
-		roomData.put(user, new FeedbackStorageObject(value, user));
+		roomData.put(userId, new FeedbackStorageObject(value, userId));
 	}
 
 	@Override
 	@Transactional(isolation = Isolation.READ_COMMITTED)
-	public Map<Room, List<ClientAuthentication>> cleanVotes(final int cleanupFeedbackDelay) {
-		final Map<Room, List<ClientAuthentication>> removedFeedbackOfUsersInSession = new HashMap<>();
+	public Map<Room, List<String>> cleanVotes(final int cleanupFeedbackDelay) {
+		final Map<Room, List<String>> removedFeedbackOfUsersInSession = new HashMap<>();
 		for (final Room room : data.keySet()) {
 			if (!room.getSettings().isQuickSurveyEnabled()) {
-				List<ClientAuthentication> affectedUsers = cleanVotesByRoom(room, cleanupFeedbackDelay);
-				if (!affectedUsers.isEmpty()) {
-					removedFeedbackOfUsersInSession.put(room, affectedUsers);
+				List<String> affectedUserIds = cleanVotesByRoom(room, cleanupFeedbackDelay);
+				if (!affectedUserIds.isEmpty()) {
+					removedFeedbackOfUsersInSession.put(room, affectedUserIds);
 				}
 			}
 		}
@@ -145,23 +144,23 @@ public class FeedbackStorageServiceImpl implements FeedbackStorageService {
 
 	@Override
 	@Transactional(isolation = Isolation.READ_COMMITTED)
-	public List<ClientAuthentication> cleanVotesByRoom(final Room room, final int cleanupFeedbackDelayInMins) {
+	public List<String> cleanVotesByRoom(final Room room, final int cleanupFeedbackDelayInMins) {
 		final long timelimitInMillis = TimeUnit.MILLISECONDS.convert(cleanupFeedbackDelayInMins, TimeUnit.MINUTES);
 		final Date maxAllowedTime = new Date(System.currentTimeMillis() - timelimitInMillis);
 		final boolean forceClean = cleanupFeedbackDelayInMins == 0;
 
-		final Map<ClientAuthentication, FeedbackStorageObject> roomFeedbacks = data.get(room);
-		final List<ClientAuthentication> affectedUsers = new ArrayList<>();
+		final Map<String, FeedbackStorageObject> roomFeedbacks = data.get(room);
+		final List<String> affectedUsers = new ArrayList<>();
 
 		if (roomFeedbacks != null) {
-			for (final Map.Entry<ClientAuthentication, FeedbackStorageObject> entry : roomFeedbacks.entrySet()) {
-				final ClientAuthentication user = entry.getKey();
+			for (final Map.Entry<String, FeedbackStorageObject> entry : roomFeedbacks.entrySet()) {
+				final String userId = entry.getKey();
 				final FeedbackStorageObject feedback = entry.getValue();
 				final boolean timeIsUp = feedback.getTimestamp().before(maxAllowedTime);
-				final boolean isAwayFeedback = getByRoomAndUser(room, user).equals(Feedback.FEEDBACK_AWAY);
+				final boolean isAwayFeedback = getByRoomAndUserId(room, userId).equals(Feedback.FEEDBACK_AWAY);
 				if (forceClean || timeIsUp && !isAwayFeedback) {
-					roomFeedbacks.remove(user);
-					affectedUsers.add(user);
+					roomFeedbacks.remove(userId);
+					affectedUsers.add(userId);
 				}
 			}
 		}
diff --git a/src/main/java/de/thm/arsnova/service/MotdServiceImpl.java b/src/main/java/de/thm/arsnova/service/MotdServiceImpl.java
index 66f6e0142bfe777046468eaf4756310bb8bbf8af..6a2b09d40b421e1b9d3a5ddb98f1351dbdc0c97e 100644
--- a/src/main/java/de/thm/arsnova/service/MotdServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/MotdServiceImpl.java
@@ -19,8 +19,8 @@ package de.thm.arsnova.service;
 
 import de.thm.arsnova.model.Motd;
 import de.thm.arsnova.model.Room;
-import de.thm.arsnova.web.exceptions.BadRequestException;
 import de.thm.arsnova.persistence.MotdRepository;
+import de.thm.arsnova.web.exceptions.BadRequestException;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.cache.annotation.Cacheable;
diff --git a/src/main/java/de/thm/arsnova/service/RoomService.java b/src/main/java/de/thm/arsnova/service/RoomService.java
index 4fb3543326b3daf89d274cec66bdd3f3faf85c6b..2c30896d2c5b137d3de79d8c1870c6ae9f493308 100644
--- a/src/main/java/de/thm/arsnova/service/RoomService.java
+++ b/src/main/java/de/thm/arsnova/service/RoomService.java
@@ -36,7 +36,7 @@ public interface RoomService extends EntityService<Room> {
 
 	Room getForAdmin(final String id);
 
-	Room getInternal(String id, ClientAuthentication user);
+	Room getInternal(String id, String userId);
 
 	boolean isShortIdAvailable(String shortId);
 
diff --git a/src/main/java/de/thm/arsnova/service/RoomServiceImpl.java b/src/main/java/de/thm/arsnova/service/RoomServiceImpl.java
index 816a49aa3ad377bee047d0f089057841039e0ba1..f5d566f3f05ba6441b1374d7d2713452d00a222e 100644
--- a/src/main/java/de/thm/arsnova/service/RoomServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/RoomServiceImpl.java
@@ -19,25 +19,26 @@ package de.thm.arsnova.service;
 
 import de.thm.arsnova.connector.client.ConnectorClient;
 import de.thm.arsnova.connector.model.Course;
-import de.thm.arsnova.model.Room;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
-import de.thm.arsnova.model.UserProfile;
-import de.thm.arsnova.model.transport.ImportExportContainer;
-import de.thm.arsnova.model.transport.ScoreStatistics;
 import de.thm.arsnova.event.DeleteRoomEvent;
 import de.thm.arsnova.event.FeatureChangeEvent;
 import de.thm.arsnova.event.FlipFlashcardsEvent;
 import de.thm.arsnova.event.LockFeedbackEvent;
 import de.thm.arsnova.event.StatusRoomEvent;
-import de.thm.arsnova.web.exceptions.ForbiddenException;
-import de.thm.arsnova.web.exceptions.NotFoundException;
+import de.thm.arsnova.model.Room;
+import de.thm.arsnova.model.UserProfile;
+import de.thm.arsnova.model.migration.v2.ClientAuthentication;
+import de.thm.arsnova.model.transport.ImportExportContainer;
+import de.thm.arsnova.model.transport.ScoreStatistics;
 import de.thm.arsnova.persistence.AnswerRepository;
 import de.thm.arsnova.persistence.CommentRepository;
 import de.thm.arsnova.persistence.ContentRepository;
 import de.thm.arsnova.persistence.LogEntryRepository;
 import de.thm.arsnova.persistence.RoomRepository;
+import de.thm.arsnova.security.User;
 import de.thm.arsnova.service.score.ScoreCalculator;
 import de.thm.arsnova.service.score.ScoreCalculatorFactory;
+import de.thm.arsnova.web.exceptions.ForbiddenException;
+import de.thm.arsnova.web.exceptions.NotFoundException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -56,11 +57,11 @@ import org.springframework.stereotype.Service;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Comparator;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.UUID;
 import java.util.stream.Collectors;
-import java.util.Set;
-import java.util.HashSet;
 
 /**
  * Performs all room related operations.
@@ -223,8 +224,8 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public Room getByShortId(final String shortId) {
-		final ClientAuthentication user = userService.getCurrentUser();
-		return this.getInternal(getIdByShortId(shortId), user);
+		final User user = userService.getCurrentUser();
+		return this.getInternal(getIdByShortId(shortId), user.getId());
 	}
 
 	@Override
@@ -251,12 +252,12 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 	 * TODO: Find a better way of doing this...
 	 */
 	@Override
-	public Room getInternal(final String id, final ClientAuthentication user) {
+	public Room getInternal(final String id, final String userId) {
 		final Room room = roomRepository.findOne(id);
 		if (room == null) {
 			throw new NotFoundException();
 		}
-		if (room.isClosed() && !room.getOwnerId().equals(user.getId())) {
+		if (room.isClosed() && !room.getOwnerId().equals(userId)) {
 			throw new ForbiddenException("User is not room creator.");
 		}
 
@@ -289,7 +290,7 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public List<Room> getMyRooms(final int offset, final int limit) {
-		return roomRepository.findByOwner(userService.getCurrentUser(), offset, limit);
+		return roomRepository.findByOwnerId(userService.getCurrentUser().getId(), offset, limit);
 	}
 
 	@Override
@@ -301,14 +302,14 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public List<Room> getMyPublicPoolRoomsInfo() {
-		return roomRepository.findInfosForPublicPoolByOwner(userService.getCurrentUser());
+		return roomRepository.findInfosForPublicPoolByOwnerId(userService.getCurrentUser().getId());
 	}
 
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public List<Room> getMyRoomsInfo(final int offset, final int limit) {
-		final ClientAuthentication user = userService.getCurrentUser();
-		return roomRepository.getRoomsWithStatsForOwner(user, offset, limit);
+		final User user = userService.getCurrentUser();
+		return roomRepository.getRoomsWithStatsForOwnerId(user.getId(), offset, limit);
 	}
 
 	@Override
@@ -333,7 +334,7 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 	@PreAuthorize("isAuthenticated()")
 	public List<Room> getMyRoomHistoryInfo(final int offset, final int limit) {
 		List<Room> rooms = getMyRoomHistory(0, 0);
-		roomRepository.getRoomHistoryWithStatsForUser(rooms, userService.getCurrentUser());
+		roomRepository.getRoomHistoryWithStatsForUser(rooms, userService.getCurrentUser().getId());
 
 		return rooms;
 	}
@@ -478,16 +479,16 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 	@PreAuthorize("hasPermission(#id, 'room', 'read')")
 	public ScoreStatistics getMyLearningProgress(final String id, final String type, final String questionVariant) {
 		final Room room = roomRepository.findOne(id);
-		final ClientAuthentication user = userService.getCurrentUser();
+		final User user = userService.getCurrentUser();
 		ScoreCalculator scoreCalculator = scoreCalculatorFactory.create(type, questionVariant);
-		return scoreCalculator.getMyProgress(room, user);
+		return scoreCalculator.getMyProgress(room, user.getId());
 	}
 
 	@Override
 	@PreAuthorize("hasPermission('', 'room', 'create')")
 	public Room importRooms(ImportExportContainer importRoom) {
-		final ClientAuthentication user = userService.getCurrentUser();
-		final Room info = roomRepository.importRoom(user, importRoom);
+		final User user = userService.getCurrentUser();
+		final Room info = roomRepository.importRoom(user.getId(), importRoom);
 		if (info == null) {
 			throw new NullPointerException("Could not import room.");
 		}
@@ -506,8 +507,8 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 		ImportExportContainer temp = roomRepository.exportRoom(id, false, false);
 		temp.getSession().setPublicPool(pp);
 		temp.getSession().setSessionType("public_pool");
-		final ClientAuthentication user = userService.getCurrentUser();
-		return roomRepository.importRoom(user, temp);
+		final User user = userService.getCurrentUser();
+		return roomRepository.importRoom(user.getId(), temp);
 	}
 
 	@Override
@@ -525,7 +526,6 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 	@PreAuthorize("hasPermission(#id, 'room', 'owner')")
 	public Room.Settings updateFeatures(String id, Room.Settings settings) {
 		final Room room = roomRepository.findOne(id);
-		final ClientAuthentication user = userService.getCurrentUser();
 		room.setSettings(settings);
 		this.publisher.publishEvent(new FeatureChangeEvent(this, room));
 		roomRepository.save(room);
@@ -537,7 +537,6 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 	@PreAuthorize("hasPermission(#id, 'room', 'owner')")
 	public boolean lockFeedbackInput(String id, Boolean lock) {
 		final Room room = roomRepository.findOne(id);
-		final ClientAuthentication user = userService.getCurrentUser();
 		if (!lock) {
 			feedbackService.cleanFeedbackVotesByRoomId(id, 0);
 		}
diff --git a/src/main/java/de/thm/arsnova/service/TimerService.java b/src/main/java/de/thm/arsnova/service/TimerService.java
index 1db313d6390b890c8aae9814715ea18e025665b9..caf4372cb2d317fc131db04ef689fb45befec471 100644
--- a/src/main/java/de/thm/arsnova/service/TimerService.java
+++ b/src/main/java/de/thm/arsnova/service/TimerService.java
@@ -1,9 +1,7 @@
 package de.thm.arsnova.service;
 
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
-
 public interface TimerService {
-	void startNewRound(final String contentId, ClientAuthentication user);
+	void startNewRound(final String contentId);
 	void startNewRoundDelayed(final String contentId, final int time);
 	void cancelRoundChange(final String contentId);
 	void cancelDelayedRoundChange(final String contentId);
diff --git a/src/main/java/de/thm/arsnova/service/TimerServiceImpl.java b/src/main/java/de/thm/arsnova/service/TimerServiceImpl.java
index b676a41e1e9120e199bfad295b201d3a8834ca34..263ef8caa95e706227d99e16df7e8e1718e01d86 100644
--- a/src/main/java/de/thm/arsnova/service/TimerServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/TimerServiceImpl.java
@@ -1,15 +1,15 @@
 package de.thm.arsnova.service;
 
-import de.thm.arsnova.model.Content;
-import de.thm.arsnova.model.Room;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.event.PiRoundCancelEvent;
 import de.thm.arsnova.event.PiRoundDelayedStartEvent;
 import de.thm.arsnova.event.PiRoundEndEvent;
 import de.thm.arsnova.event.PiRoundResetEvent;
+import de.thm.arsnova.model.Content;
+import de.thm.arsnova.model.Room;
 import de.thm.arsnova.persistence.AnswerRepository;
 import de.thm.arsnova.persistence.ContentRepository;
 import de.thm.arsnova.persistence.RoomRepository;
+import de.thm.arsnova.security.User;
 import org.springframework.cache.annotation.CacheEvict;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.context.ApplicationEventPublisherAware;
@@ -40,14 +40,10 @@ public class TimerServiceImpl implements TimerService, ApplicationEventPublisher
 
 	@Override
 	@PreAuthorize("isAuthenticated() and hasPermission(#contentId, 'content', 'owner')")
-	public void startNewRound(final String contentId, ClientAuthentication user) {
+	public void startNewRound(final String contentId) {
 		final Content content = contentRepository.findOne(contentId);
 		final Room room = roomRepository.findOne(content.getRoomId());
 
-		if (null == user) {
-			user = userService.getCurrentUser();
-		}
-
 		cancelDelayedRoundChange(contentId);
 
 		content.getState().setRoundEndTimestamp(null);
@@ -61,7 +57,7 @@ public class TimerServiceImpl implements TimerService, ApplicationEventPublisher
 	@Override
 	@PreAuthorize("hasPermission(#contentId, 'content', 'owner')")
 	public void startNewRoundDelayed(final String contentId, final int time) {
-		final ClientAuthentication user = userService.getCurrentUser();
+		final User user = userService.getCurrentUser();
 		final Content content = contentRepository.findOne(contentId);
 		final Room room = roomRepository.findOne(content.getRoomId());
 
@@ -77,7 +73,7 @@ public class TimerServiceImpl implements TimerService, ApplicationEventPublisher
 		timer.schedule(new TimerTask() {
 			@Override
 			public void run() {
-				startNewRound(contentId, user);
+				startNewRound(contentId);
 			}
 		}, endDate);
 	}
diff --git a/src/main/java/de/thm/arsnova/service/UserService.java b/src/main/java/de/thm/arsnova/service/UserService.java
index 0f2138223930a86752a700ba28b33679942cd107..57422647aa18c26a221ccfbe122ba93c9fdb6076 100644
--- a/src/main/java/de/thm/arsnova/service/UserService.java
+++ b/src/main/java/de/thm/arsnova/service/UserService.java
@@ -18,7 +18,6 @@
 package de.thm.arsnova.service;
 
 import de.thm.arsnova.model.Room;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.UserProfile;
 import de.thm.arsnova.security.User;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
@@ -36,7 +35,7 @@ import java.util.UUID;
 public interface UserService extends EntityService<UserProfile> {
 	UserProfile getCurrentUserProfile();
 
-	ClientAuthentication getCurrentUser();
+	User getCurrentUser();
 
 	de.thm.arsnova.model.ClientAuthentication getCurrentClientAuthentication();
 
@@ -46,17 +45,17 @@ public interface UserService extends EntityService<UserProfile> {
 
 	void increaseFailedLoginCount(String addr);
 
-	ClientAuthentication getUserToSocketId(UUID socketId);
+	String getUserIdToSocketId(UUID socketId);
 
-	void putUserToSocketId(UUID socketId, ClientAuthentication user);
+	void putUserIdToSocketId(UUID socketId, String userId);
 
 	void removeUserToSocketId(UUID socketId);
 
-	Set<Map.Entry<UUID, ClientAuthentication>> getSocketIdToUser();
+	Set<Map.Entry<UUID, String>> getSocketIdToUserId();
 
-	boolean isUserInRoom(ClientAuthentication user, String roomId);
+	boolean isUserInRoom(String userId, String roomId);
 
-	Set<ClientAuthentication> getUsersByRoomId(String roomId);
+	Set<String> getUsersByRoomId(String roomId);
 
 	String getRoomIdByUserId(String userId);
 
@@ -64,7 +63,7 @@ public interface UserService extends EntityService<UserProfile> {
 
 	void removeUserFromRoomBySocketId(UUID socketId);
 
-	void removeUserFromMaps(ClientAuthentication user);
+	void removeUserIdFromMaps(String userId);
 
 	int loggedInUsers();
 
diff --git a/src/main/java/de/thm/arsnova/service/UserServiceImpl.java b/src/main/java/de/thm/arsnova/service/UserServiceImpl.java
index 51498b832d4c1c1e9f2dcd11bea0559571aa40d0..dfa71b0c842f08dfd3e4473ea8779a1a93eeb626 100644
--- a/src/main/java/de/thm/arsnova/service/UserServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/service/UserServiceImpl.java
@@ -18,17 +18,17 @@
 package de.thm.arsnova.service;
 
 import com.codahale.metrics.annotation.Gauge;
+import de.thm.arsnova.model.ClientAuthentication;
 import de.thm.arsnova.model.Room;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.UserProfile;
-import de.thm.arsnova.web.exceptions.BadRequestException;
-import de.thm.arsnova.web.exceptions.NotFoundException;
-import de.thm.arsnova.web.exceptions.UnauthorizedException;
 import de.thm.arsnova.persistence.UserRepository;
 import de.thm.arsnova.security.GuestUserDetailsService;
 import de.thm.arsnova.security.User;
 import de.thm.arsnova.security.jwt.JwtService;
 import de.thm.arsnova.security.jwt.JwtToken;
+import de.thm.arsnova.web.exceptions.BadRequestException;
+import de.thm.arsnova.web.exceptions.NotFoundException;
+import de.thm.arsnova.web.exceptions.UnauthorizedException;
 import org.apache.commons.lang.RandomStringUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
@@ -91,10 +91,10 @@ public class UserServiceImpl extends DefaultEntityServiceImpl<UserProfile> imple
 
 	private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
 
-	private static final ConcurrentHashMap<UUID, ClientAuthentication> socketIdToUser = new ConcurrentHashMap<>();
+	private static final ConcurrentHashMap<UUID, String> socketIdToUserId = new ConcurrentHashMap<>();
 
 	/* used for Socket.IO online check solution (new) */
-	private static final ConcurrentHashMap<ClientAuthentication, String> userToRoomId = new ConcurrentHashMap<>();
+	private static final ConcurrentHashMap<String, String> userIdToRoomId = new ConcurrentHashMap<>();
 
 	private UserRepository userRepository;
 	private JwtService jwtService;
@@ -194,24 +194,18 @@ public class UserServiceImpl extends DefaultEntityServiceImpl<UserProfile> imple
 
 	@Override
 	public UserProfile getCurrentUserProfile() {
-		final ClientAuthentication authentication = getCurrentUser();
-		return getByAuthProviderAndLoginId(authentication.getAuthProvider(), authentication.getUsername());
+		final User user = getCurrentUser();
+		return getByAuthProviderAndLoginId(user.getAuthProvider(), user.getUsername());
 	}
 
 	@Override
-	public ClientAuthentication getCurrentUser() {
+	public User getCurrentUser() {
 		final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
-		if (authentication == null || authentication.getPrincipal() == null) {
+		if (authentication == null || !(authentication.getPrincipal() instanceof User)) {
 			return null;
 		}
 
-		ClientAuthentication user = new ClientAuthentication(authentication);
-		if (user == null || "anonymous".equals(user.getUsername())) {
-			throw new UnauthorizedException();
-		}
-		user.setAdmin(Arrays.asList(adminAccounts).contains(user.getUsername()));
-
-		return user;
+		return (User) authentication.getPrincipal();
 	}
 
 	@Override
@@ -224,8 +218,8 @@ public class UserServiceImpl extends DefaultEntityServiceImpl<UserProfile> imple
 		String jwt = authentication instanceof JwtToken ?
 				(String) authentication.getCredentials() : jwtService.createSignedToken(user);
 
-		de.thm.arsnova.model.ClientAuthentication clientAuthentication =
-				new de.thm.arsnova.model.ClientAuthentication(user.getId(), user.getUsername(),
+		ClientAuthentication clientAuthentication =
+				new ClientAuthentication(user.getId(), user.getUsername(),
 						user.getAuthProvider(), jwt);
 
 		return clientAuthentication;
@@ -257,36 +251,36 @@ public class UserServiceImpl extends DefaultEntityServiceImpl<UserProfile> imple
 	}
 
 	@Override
-	public ClientAuthentication getUserToSocketId(final UUID socketId) {
-		return socketIdToUser.get(socketId);
+	public String getUserIdToSocketId(final UUID socketId) {
+		return socketIdToUserId.get(socketId);
 	}
 
 	@Override
-	public void putUserToSocketId(final UUID socketId, final ClientAuthentication user) {
-		socketIdToUser.put(socketId, user);
+	public void putUserIdToSocketId(final UUID socketId, final String userId) {
+		socketIdToUserId.put(socketId, userId);
 	}
 
 	@Override
-	public Set<Map.Entry<UUID, ClientAuthentication>> getSocketIdToUser() {
-		return socketIdToUser.entrySet();
+	public Set<Entry<UUID, String>> getSocketIdToUserId() {
+		return socketIdToUserId.entrySet();
 	}
 
 	@Override
 	public void removeUserToSocketId(final UUID socketId) {
-		socketIdToUser.remove(socketId);
+		socketIdToUserId.remove(socketId);
 	}
 
 	@Override
-	public boolean isUserInRoom(final ClientAuthentication user, final String expectedRoomId) {
-		String actualRoomId = userToRoomId.get(user);
+	public boolean isUserInRoom(final String userId, final String expectedRoomId) {
+		String actualRoomId = userIdToRoomId.get(userId);
 
 		return actualRoomId != null && actualRoomId.equals(expectedRoomId);
 	}
 
 	@Override
-	public Set<ClientAuthentication> getUsersByRoomId(final String roomId) {
-		final Set<ClientAuthentication> result = new HashSet<>();
-		for (final Entry<ClientAuthentication, String> e : userToRoomId.entrySet()) {
+	public Set<String> getUsersByRoomId(final String roomId) {
+		final Set<String> result = new HashSet<>();
+		for (final Entry<String, String> e : userIdToRoomId.entrySet()) {
 			if (e.getValue().equals(roomId)) {
 				result.add(e.getKey());
 			}
@@ -298,26 +292,26 @@ public class UserServiceImpl extends DefaultEntityServiceImpl<UserProfile> imple
 	@Override
 	@Transactional(isolation = Isolation.READ_COMMITTED)
 	public void addUserToRoomBySocketId(final UUID socketId, final String roomId) {
-		final ClientAuthentication user = socketIdToUser.get(socketId);
-		userToRoomId.put(user, roomId);
+		final String userId = socketIdToUserId.get(socketId);
+		userIdToRoomId.put(userId, roomId);
 	}
 
 	@Override
 	@Transactional(isolation = Isolation.READ_COMMITTED)
 	public void removeUserFromRoomBySocketId(final UUID socketId) {
-		final ClientAuthentication user = socketIdToUser.get(socketId);
-		if (null == user) {
+		final String userId = socketIdToUserId.get(socketId);
+		if (null == userId) {
 			logger.warn("No user exists for socket {}.", socketId);
 
 			return;
 		}
-		userToRoomId.remove(user);
+		userIdToRoomId.remove(userId);
 	}
 
 	@Override
 	public String getRoomIdByUserId(final String userId) {
-		for (final Entry<ClientAuthentication, String> entry  : userToRoomId.entrySet()) {
-			if (entry.getKey().getId().equals(userId)) {
+		for (final Entry<String, String> entry  : userIdToRoomId.entrySet()) {
+			if (entry.getKey().equals(userId)) {
 				return entry.getValue();
 			}
 		}
@@ -331,16 +325,16 @@ public class UserServiceImpl extends DefaultEntityServiceImpl<UserProfile> imple
 	}
 
 	@Override
-	public void removeUserFromMaps(final ClientAuthentication user) {
-		if (user != null) {
-			userToRoomId.remove(user);
+	public void removeUserIdFromMaps(final String userId) {
+		if (userId != null) {
+			userIdToRoomId.remove(userId);
 		}
 	}
 
 	@Override
 	@Gauge
 	public int loggedInUsers() {
-		return userToRoomId.size();
+		return userIdToRoomId.size();
 	}
 
 	@Override
@@ -517,7 +511,7 @@ public class UserServiceImpl extends DefaultEntityServiceImpl<UserProfile> imple
 
 	@Override
 	public UserProfile deleteByUsername(String username) {
-		ClientAuthentication user = getCurrentUser();
+		User user = getCurrentUser();
 		if (!user.getUsername().equals(username.toLowerCase())
 				&& !SecurityContextHolder.getContext().getAuthentication().getAuthorities()
 						.contains(new SimpleGrantedAuthority("ROLE_ADMIN"))) {
diff --git a/src/main/java/de/thm/arsnova/service/score/QuestionBasedScoreCalculator.java b/src/main/java/de/thm/arsnova/service/score/QuestionBasedScoreCalculator.java
index 0eed46c4d470384e693aa2357699ca96ba0dffa2..55f7df91a503d0034b92aa62472d6e4a653e2182 100644
--- a/src/main/java/de/thm/arsnova/service/score/QuestionBasedScoreCalculator.java
+++ b/src/main/java/de/thm/arsnova/service/score/QuestionBasedScoreCalculator.java
@@ -17,7 +17,6 @@
  */
 package de.thm.arsnova.service.score;
 
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.transport.ScoreStatistics;
 import de.thm.arsnova.persistence.SessionStatisticsRepository;
 
@@ -71,8 +70,8 @@ public class QuestionBasedScoreCalculator extends VariantScoreCalculator {
 	}
 
 	@Override
-	protected ScoreStatistics createMyProgress(ClientAuthentication user) {
-		final int numerator = numQuestionsCorrectForUser(user);
+	protected ScoreStatistics createMyProgress(String userId) {
+		final int numerator = numQuestionsCorrectForUser(userId);
 		final int denominator = courseScore.getQuestionCount();
 		ScoreStatistics lpv = new ScoreStatistics();
 		lpv.setCourseProgress(calculateCourseProgress());
@@ -84,19 +83,19 @@ public class QuestionBasedScoreCalculator extends VariantScoreCalculator {
 		return lpv;
 	}
 
-	private int numQuestionsCorrectForUser(ClientAuthentication user) {
+	private int numQuestionsCorrectForUser(String userId) {
 		int numQuestionsCorrect = 0;
 		for (QuestionScore questionScore : courseScore) {
-			numQuestionsCorrect += countCorrectAnswersForUser(user, questionScore);
+			numQuestionsCorrect += countCorrectAnswersForUser(userId, questionScore);
 		}
 		return numQuestionsCorrect;
 	}
 
-	private int countCorrectAnswersForUser(ClientAuthentication user, QuestionScore questionScore) {
+	private int countCorrectAnswersForUser(String userId, QuestionScore questionScore) {
 		int numQuestionsCorrect = 0;
 		int requiredScore = questionScore.getMaximum();
 		for (UserScore userScore : questionScore) {
-			if (!userScore.isUser(user)) {
+			if (!userScore.isUser(userId)) {
 				continue;
 			}
 			if (userScore.hasScore(requiredScore)) {
diff --git a/src/main/java/de/thm/arsnova/service/score/QuestionScore.java b/src/main/java/de/thm/arsnova/service/score/QuestionScore.java
index 0ea10b92d1b197bb60538b2ca4fb3f92a60a7f2e..6989b6c987148d2994db06c6dc34565461d0a84d 100644
--- a/src/main/java/de/thm/arsnova/service/score/QuestionScore.java
+++ b/src/main/java/de/thm/arsnova/service/score/QuestionScore.java
@@ -17,8 +17,6 @@
  */
 package de.thm.arsnova.service.score;
 
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
-
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
@@ -60,9 +58,9 @@ public class QuestionScore implements Iterable<UserScore> {
 		return !this.userScores.isEmpty();
 	}
 
-	public void add(int piRound, String username, int userscore) {
+	public void add(int piRound, String userId, int userscore) {
 		if (this.piRound == piRound) {
-			userScores.add(new UserScore(username, userscore));
+			userScores.add(new UserScore(userId, userscore));
 		}
 	}
 
@@ -74,10 +72,10 @@ public class QuestionScore implements Iterable<UserScore> {
 		return totalScore;
 	}
 
-	public int getTotalUserScore(ClientAuthentication user) {
+	public int getTotalUserScore(String userId) {
 		int totalScore = 0;
 		for (UserScore score : userScores) {
-			if (score.isUser(user)) {
+			if (score.isUser(userId)) {
 				totalScore += score.getScore();
 			}
 		}
@@ -90,7 +88,7 @@ public class QuestionScore implements Iterable<UserScore> {
 
 	public void collectUsers(Set<String> users) {
 		for (UserScore score : userScores) {
-			users.add(score.getUsername());
+			users.add(score.getUserId());
 		}
 	}
 
diff --git a/src/main/java/de/thm/arsnova/service/score/Score.java b/src/main/java/de/thm/arsnova/service/score/Score.java
index d3c5e4d299db8a54afe93ccfcffbab8836753314..0cc7361b9bb0ae5c5e4f8adbd27ac11172024980 100644
--- a/src/main/java/de/thm/arsnova/service/score/Score.java
+++ b/src/main/java/de/thm/arsnova/service/score/Score.java
@@ -17,8 +17,6 @@
  */
 package de.thm.arsnova.service.score;
 
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
-
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -48,18 +46,18 @@ public class Score implements Iterable<QuestionScore> {
 		scores.put(questionId, new QuestionScore(questionId, questionVariant, piRound, questionScore));
 	}
 
-	public void addAnswer(String questionId, int piRound, String username, int userscore) {
+	public void addAnswer(String questionId, int piRound, String userId, int userscore) {
 		if (!scores.containsKey(questionId)) {
 			// Precondition failed, ignore this element.
 			// Most likely this is a question that has no score value.
 			return;
 		}
-		if (username == null || username.isEmpty()) {
+		if (userId == null || userId.isEmpty()) {
 			// Precondition failed: ignore anonymous users
 			return;
 		}
 		QuestionScore questionScore = scores.get(questionId);
-		questionScore.add(piRound, username, userscore);
+		questionScore.add(piRound, userId, userscore);
 	}
 
 	public Score filterVariant(String questionVariant) {
@@ -90,10 +88,10 @@ public class Score implements Iterable<QuestionScore> {
 		return score;
 	}
 
-	public double getTotalUserScore(ClientAuthentication user) {
+	public double getTotalUserScore(String userId) {
 		int score = 0;
 		for (QuestionScore questionScore : this) {
-			score += questionScore.getTotalUserScore(user);
+			score += questionScore.getTotalUserScore(userId);
 		}
 		return score;
 	}
diff --git a/src/main/java/de/thm/arsnova/service/score/ScoreBasedScoreCalculator.java b/src/main/java/de/thm/arsnova/service/score/ScoreBasedScoreCalculator.java
index 7b34fddbded6fd919ae780831eb87521fe1e6d1b..56d5e47778b1199ebbccd2727234f43a65095a1f 100644
--- a/src/main/java/de/thm/arsnova/service/score/ScoreBasedScoreCalculator.java
+++ b/src/main/java/de/thm/arsnova/service/score/ScoreBasedScoreCalculator.java
@@ -17,7 +17,6 @@
  */
 package de.thm.arsnova.service.score;
 
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.transport.ScoreStatistics;
 import de.thm.arsnova.persistence.SessionStatisticsRepository;
 
@@ -54,20 +53,20 @@ public class ScoreBasedScoreCalculator extends VariantScoreCalculator {
 	}
 
 	@Override
-	protected ScoreStatistics createMyProgress(ClientAuthentication user) {
+	protected ScoreStatistics createMyProgress(String userId) {
 		ScoreStatistics lpv = new ScoreStatistics();
 		lpv.setCourseProgress(coursePercentage());
 		lpv.setNumQuestions(courseScore.getQuestionCount());
 		lpv.setNumUsers(courseScore.getTotalUserCount());
-		lpv.setMyProgress(myPercentage(user));
-		lpv.setNumerator((int) courseScore.getTotalUserScore(user));
+		lpv.setMyProgress(myPercentage(userId));
+		lpv.setNumerator((int) courseScore.getTotalUserScore(userId));
 		lpv.setDenominator(courseScore.getMaximumScore());
 		return lpv;
 	}
 
-	private int myPercentage(ClientAuthentication user) {
+	private int myPercentage(String userId) {
 		final int courseMaximumValue = courseScore.getMaximumScore();
-		final double userTotalValue = courseScore.getTotalUserScore(user);
+		final double userTotalValue = courseScore.getTotalUserScore(userId);
 		if (courseMaximumValue == 0) {
 			return 0;
 		}
diff --git a/src/main/java/de/thm/arsnova/service/score/ScoreCalculator.java b/src/main/java/de/thm/arsnova/service/score/ScoreCalculator.java
index 7eb61b0c72983782f91e96174378be3c90b81214..ce03ccb4187de94957c455738c05578fab0a314c 100644
--- a/src/main/java/de/thm/arsnova/service/score/ScoreCalculator.java
+++ b/src/main/java/de/thm/arsnova/service/score/ScoreCalculator.java
@@ -18,7 +18,6 @@
 package de.thm.arsnova.service.score;
 
 import de.thm.arsnova.model.Room;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.transport.ScoreStatistics;
 
 /**
@@ -28,5 +27,5 @@ public interface ScoreCalculator {
 
 	ScoreStatistics getCourseProgress(Room room);
 
-	ScoreStatistics getMyProgress(Room room, ClientAuthentication user);
+	ScoreStatistics getMyProgress(Room room, String userId);
 }
diff --git a/src/main/java/de/thm/arsnova/service/score/UserScore.java b/src/main/java/de/thm/arsnova/service/score/UserScore.java
index bc91a25594f83537e180a655fc265888e32d9a52..4310c8c78438959a251e5a4b98a89900392f91fd 100644
--- a/src/main/java/de/thm/arsnova/service/score/UserScore.java
+++ b/src/main/java/de/thm/arsnova/service/score/UserScore.java
@@ -17,19 +17,17 @@
  */
 package de.thm.arsnova.service.score;
 
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
-
 /**
  * The learning progress answer score of a particular user.
  */
 public class UserScore {
 
-	private String username;
+	private String userId;
 
 	private int score;
 
-	public UserScore(String username, int score) {
-		this.username = username;
+	public UserScore(String userId, int score) {
+		this.userId = userId;
 		this.score = score;
 	}
 
@@ -41,11 +39,11 @@ public class UserScore {
 		return score;
 	}
 
-	public boolean isUser(ClientAuthentication user) {
-		return user.getUsername().equals(username);
+	public boolean isUser(String userId) {
+		return this.userId.equals(userId);
 	}
 
-	public String getUsername() {
-		return username;
+	public String getUserId() {
+		return userId;
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/service/score/VariantScoreCalculator.java b/src/main/java/de/thm/arsnova/service/score/VariantScoreCalculator.java
index de9b62054cc45457a6b4daed1f898dadf0785e0b..f7266b9524e88d0f0db2e848129527163173ae06 100644
--- a/src/main/java/de/thm/arsnova/service/score/VariantScoreCalculator.java
+++ b/src/main/java/de/thm/arsnova/service/score/VariantScoreCalculator.java
@@ -18,7 +18,6 @@
 package de.thm.arsnova.service.score;
 
 import de.thm.arsnova.model.Room;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.transport.ScoreStatistics;
 import de.thm.arsnova.persistence.SessionStatisticsRepository;
 import org.springframework.cache.annotation.Cacheable;
@@ -61,10 +60,10 @@ abstract class VariantScoreCalculator implements ScoreCalculator {
 	protected abstract ScoreStatistics createCourseProgress();
 
 	@Override
-	public ScoreStatistics getMyProgress(Room room, ClientAuthentication user) {
+	public ScoreStatistics getMyProgress(Room room, String userId) {
 		this.refreshProgress(room);
 		this.filterVariant();
-		return this.createMyProgress(user);
+		return this.createMyProgress(userId);
 	}
 
 	private void filterVariant() {
@@ -73,6 +72,6 @@ abstract class VariantScoreCalculator implements ScoreCalculator {
 		}
 	}
 
-	protected abstract ScoreStatistics createMyProgress(ClientAuthentication user);
+	protected abstract ScoreStatistics createMyProgress(String userId);
 
 }
diff --git a/src/main/java/de/thm/arsnova/web/RangeAspect.java b/src/main/java/de/thm/arsnova/web/RangeAspect.java
index 9959fab9cd884c9ee25973cb96ca4d10cdb6d757..c015e1369ec164e7ca789bcb9fdba8430f9ad217 100644
--- a/src/main/java/de/thm/arsnova/web/RangeAspect.java
+++ b/src/main/java/de/thm/arsnova/web/RangeAspect.java
@@ -17,9 +17,9 @@
  */
 package de.thm.arsnova.web;
 
-import de.thm.arsnova.util.PaginationListDecorator;
 import de.thm.arsnova.controller.PaginationController;
 import de.thm.arsnova.service.ResponseProviderService;
+import de.thm.arsnova.util.PaginationListDecorator;
 import org.aspectj.lang.ProceedingJoinPoint;
 import org.aspectj.lang.annotation.Around;
 import org.aspectj.lang.annotation.Aspect;
diff --git a/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java b/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java
index 70ab9d83c3a238a83a05447623301687c5545665..0e20156dfa0748e51fc02140968725b5a9cd8d47 100644
--- a/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java
+++ b/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java
@@ -28,22 +28,21 @@ import com.corundumstudio.socketio.listener.DataListener;
 import com.corundumstudio.socketio.listener.DisconnectListener;
 import com.corundumstudio.socketio.protocol.Packet;
 import com.corundumstudio.socketio.protocol.PacketType;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
+import de.thm.arsnova.event.*;
 import de.thm.arsnova.model.Comment;
 import de.thm.arsnova.model.ScoreOptions;
 import de.thm.arsnova.model.migration.ToV2Migrator;
-import de.thm.arsnova.event.*;
-import de.thm.arsnova.web.exceptions.NoContentException;
-import de.thm.arsnova.web.exceptions.NotFoundException;
-import de.thm.arsnova.web.exceptions.UnauthorizedException;
 import de.thm.arsnova.service.AnswerService;
 import de.thm.arsnova.service.CommentService;
-import de.thm.arsnova.service.FeedbackService;
 import de.thm.arsnova.service.ContentService;
+import de.thm.arsnova.service.FeedbackService;
 import de.thm.arsnova.service.RoomService;
 import de.thm.arsnova.service.UserService;
-import de.thm.arsnova.websocket.message.Feedback;
+import de.thm.arsnova.web.exceptions.NoContentException;
+import de.thm.arsnova.web.exceptions.NotFoundException;
+import de.thm.arsnova.web.exceptions.UnauthorizedException;
 import de.thm.arsnova.websocket.message.Content;
+import de.thm.arsnova.websocket.message.Feedback;
 import de.thm.arsnova.websocket.message.Room;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -145,21 +144,21 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 			@Override
 			@Timed(name = "setFeedbackEvent.onData")
 			public void onData(final SocketIOClient client, final Feedback data, final AckRequest ackSender) {
-				final ClientAuthentication u = userService.getUserToSocketId(client.getSessionId());
-				if (u == null) {
+				final String userId = userService.getUserIdToSocketId(client.getSessionId());
+				if (userId == null) {
 					logger.info("Client {} tried to send feedback but is not mapped to a user", client.getSessionId());
 
 					return;
 				}
-				final String roomId = userService.getRoomIdByUserId(u.getId());
-				final de.thm.arsnova.model.Room room = roomService.getInternal(roomId, u);
+				final String roomId = userService.getRoomIdByUserId(userId);
+				final de.thm.arsnova.model.Room room = roomService.getInternal(roomId, userId);
 
 				if (room.getSettings().isFeedbackLocked()) {
-					logger.debug("Feedback ignored: User: {}, Room Id: {}, Feedback: {}", u, roomId, data.getValue());
+					logger.debug("Feedback ignored: User: {}, Room Id: {}, Feedback: {}", userId, roomId, data.getValue());
 				} else {
-					logger.debug("Feedback received: User: {}, Room Id: {}, Feedback: {}", u, roomId, data.getValue());
+					logger.debug("Feedback received: User: {}, Room Id: {}, Feedback: {}", userId, roomId, data.getValue());
 					if (null != roomId) {
-						feedbackService.save(roomId, data.getValue(), u);
+						feedbackService.save(roomId, data.getValue(), userId);
 					}
 				}
 			}
@@ -169,13 +168,13 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 			@Override
 			@Timed(name = "setSessionEvent.onData")
 			public void onData(final SocketIOClient client, final Room room, final AckRequest ackSender) {
-				final ClientAuthentication u = userService.getUserToSocketId(client.getSessionId());
-				if (null == u) {
+				final String userId = userService.getUserIdToSocketId(client.getSessionId());
+				if (null == userId) {
 					logger.info("Client {} requested to join room but is not mapped to a user", client.getSessionId());
 
 					return;
 				}
-				final String oldRoomId = userService.getRoomIdByUserId(u.getId());
+				final String oldRoomId = userService.getRoomIdByUserId(userId);
 				if (null != room.getKeyword()) {
 					if (room.getKeyword().equals(oldRoomId)) {
 						return;
@@ -186,7 +185,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 						/* active user count has to be sent to the client since the broadcast is
 						 * not always sent as long as the polling solution is active simultaneously */
 						reportActiveUserCountForRoom(roomId);
-						reportRoomDataToClient(roomId, u, client);
+						reportRoomDataToClient(roomId, userId, client);
 					}
 				}
 				if (null != oldRoomId) {
@@ -206,7 +205,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 					SocketIOClient client,
 					Comment comment,
 					AckRequest ackRequest) {
-				final ClientAuthentication user = userService.getUserToSocketId(client.getSessionId());
+				final String user = userService.getUserIdToSocketId(client.getSessionId());
 				try {
 					commentService.getAndMarkRead(comment.getId());
 				} catch (IOException | NotFoundException | UnauthorizedException e) {
@@ -218,11 +217,11 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		server.addEventListener("readFreetextAnswer", String.class, new DataListener<String>() {
 			@Override
 			public void onData(SocketIOClient client, String answerId, AckRequest ackRequest) {
-				final ClientAuthentication user = userService.getUserToSocketId(client.getSessionId());
+				final String userId = userService.getUserIdToSocketId(client.getSessionId());
 				try {
-					answerService.getFreetextAnswerAndMarkRead(answerId, user);
+					answerService.getFreetextAnswerAndMarkRead(answerId, userId);
 				} catch (NotFoundException | UnauthorizedException e) {
-					logger.error("Marking answer {} as read failed for user {} with exception {}", answerId, user, e.getMessage());
+					logger.error("Marking answer {} as read failed for user {} with exception {}", answerId, userId, e.getMessage());
 				}
 			}
 		});
@@ -261,11 +260,11 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 				if (
 						userService == null
 						|| client.getSessionId() == null
-						|| userService.getUserToSocketId(client.getSessionId()) == null
+						|| userService.getUserIdToSocketId(client.getSessionId()) == null
 						) {
 					return;
 				}
-				final String userId = userService.getUserToSocketId(client.getSessionId()).getId();
+				final String userId = userService.getUserIdToSocketId(client.getSessionId());
 				final String roomId = userService.getRoomIdByUserId(userId);
 				userService.removeUserFromRoomBySocketId(client.getSessionId());
 				userService.removeUserToSocketId(client.getSessionId());
@@ -339,28 +338,28 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		this.useSSL = useSSL;
 	}
 
-	public void reportDeletedFeedback(final ClientAuthentication user, final Set<de.thm.arsnova.model.Room> rooms) {
+	public void reportDeletedFeedback(final String userId, final Set<de.thm.arsnova.model.Room> rooms) {
 		final List<String> roomShortIds = new ArrayList<>();
 		for (final de.thm.arsnova.model.Room room : rooms) {
 			roomShortIds.add(room.getShortId());
 		}
-		this.sendToUser(user, "feedbackReset", roomShortIds);
+		this.sendToUser(userId, "feedbackReset", roomShortIds);
 	}
 
-	private List<UUID> findConnectionIdForUser(final ClientAuthentication user) {
+	private List<UUID> findConnectionIdForUserId(final String userId) {
 		final List<UUID> result = new ArrayList<>();
-		for (final Entry<UUID, ClientAuthentication> e : userService.getSocketIdToUser()) {
+		for (final Entry<UUID, String> e : userService.getSocketIdToUserId()) {
 			final UUID someUsersConnectionId = e.getKey();
-			final ClientAuthentication someUser = e.getValue();
-			if (someUser.equals(user)) {
+			final String someUser = e.getValue();
+			if (someUser.equals(userId)) {
 				result.add(someUsersConnectionId);
 			}
 		}
 		return result;
 	}
 
-	private void sendToUser(final ClientAuthentication user, final String event, Object data) {
-		final List<UUID> connectionIds = findConnectionIdForUser(user);
+	private void sendToUser(final String userId, final String event, Object data) {
+		final List<UUID> connectionIds = findConnectionIdForUserId(userId);
 		if (connectionIds.isEmpty()) {
 			return;
 		}
@@ -375,12 +374,12 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 	 * Currently only sends the feedback data to the client. Should be used for all
 	 * relevant Socket.IO data, the client needs to know after joining a session.
 	 */
-	public void reportRoomDataToClient(final String roomId, final ClientAuthentication user, final SocketIOClient client) {
-		final de.thm.arsnova.model.Room room = roomService.getInternal(roomId, user);
+	public void reportRoomDataToClient(final String roomId, final String userId, final SocketIOClient client) {
+		final de.thm.arsnova.model.Room room = roomService.getInternal(roomId, userId);
 		final de.thm.arsnova.model.Room.Settings settings = room.getSettings();
 
-		client.sendEvent("unansweredLecturerQuestions", contentService.getUnAnsweredLectureContentIds(roomId, user));
-		client.sendEvent("unansweredPreparationQuestions", contentService.getUnAnsweredPreparationContentIds(roomId, user));
+		client.sendEvent("unansweredLecturerQuestions", contentService.getUnAnsweredLectureContentIds(roomId, userId));
+		client.sendEvent("unansweredPreparationQuestions", contentService.getUnAnsweredPreparationContentIds(roomId, userId));
 		/* FIXME: Content variant is ignored for now */
 		client.sendEvent("countLectureQuestionAnswers", answerService.countTotalAnswersByRoomId(roomId));
 		client.sendEvent("countPreparationQuestionAnswers", answerService.countTotalAnswersByRoomId(roomId));
@@ -414,15 +413,15 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		}
 	}
 
-	public void reportFeedbackForUserInRoom(final Room room, final ClientAuthentication user) {
-		final de.thm.arsnova.model.Feedback fb = feedbackService.getByRoomId(room.getKeyword());
+	public void reportFeedbackForUserInRoom(final String roomId, final String userId) {
+		final de.thm.arsnova.model.Feedback fb = feedbackService.getByRoomId(roomId);
 		Long averageFeedback;
 		try {
-			averageFeedback = feedbackService.calculateRoundedAverageFeedback(room.getKeyword());
+			averageFeedback = feedbackService.calculateRoundedAverageFeedback(roomId);
 		} catch (final NoContentException e) {
 			averageFeedback = null;
 		}
-		final List<UUID> connectionIds = findConnectionIdForUser(user);
+		final List<UUID> connectionIds = findConnectionIdForUserId(userId);
 		if (connectionIds.isEmpty()) {
 			return;
 		}
@@ -480,11 +479,11 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		 * all connected clients and if send feedback, if user is in current
 		 * room
 		 */
-		final Set<ClientAuthentication> users = userService.getUsersByRoomId(roomId);
+		final Set<String> userIds = userService.getUsersByRoomId(roomId);
 
 		for (final SocketIOClient c : server.getAllClients()) {
-			final ClientAuthentication u = userService.getUserToSocketId(c.getSessionId());
-			if (u != null && users.contains(u)) {
+			final String userId = userService.getUserIdToSocketId(c.getSessionId());
+			if (userId != null && userIds.contains(userId)) {
 				c.sendEvent(eventName, data);
 			}
 		}
@@ -534,9 +533,9 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		// Update the unanswered count for the content variant that was answered.
 		final de.thm.arsnova.model.Content content = event.getContent();
 		if (content.getGroups().contains("lecture")) {
-			sendToUser(event.getUser(), "unansweredLecturerQuestions", contentService.getUnAnsweredLectureContentIds(roomId, event.getUser()));
+			sendToUser(event.getUserId(), "unansweredLecturerQuestions", contentService.getUnAnsweredLectureContentIds(roomId, event.getUserId()));
 		} else if (content.getGroups().contains("preparation")) {
-			sendToUser(event.getUser(), "unansweredPreparationQuestions", contentService.getUnAnsweredPreparationContentIds(roomId, event.getUser()));
+			sendToUser(event.getUserId(), "unansweredPreparationQuestions", contentService.getUnAnsweredPreparationContentIds(roomId, event.getUserId()));
 		}
 	}
 
@@ -677,7 +676,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 
 	@Override
 	public void visit(DeleteFeedbackForRoomsEvent event) {
-		this.reportDeletedFeedback(event.getUser(), event.getSessions());
+		this.reportDeletedFeedback(event.getUserId(), event.getSessions());
 
 	}
 
diff --git a/src/main/java/de/thm/arsnova/websocket/WebsocketAuthenticationAspect.java b/src/main/java/de/thm/arsnova/websocket/WebsocketAuthenticationAspect.java
index 18ef7807352a9af0fe4099936fc3b6334b287680..23fad2da876bfd00ca20e86a958bda30003a5c90 100644
--- a/src/main/java/de/thm/arsnova/websocket/WebsocketAuthenticationAspect.java
+++ b/src/main/java/de/thm/arsnova/websocket/WebsocketAuthenticationAspect.java
@@ -18,7 +18,6 @@
 package de.thm.arsnova.websocket;
 
 import com.corundumstudio.socketio.SocketIOClient;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.security.User;
 import de.thm.arsnova.service.UserService;
 import org.aspectj.lang.ProceedingJoinPoint;
@@ -68,14 +67,14 @@ public class WebsocketAuthenticationAspect {
 	}
 
 	private void populateSecurityContext(final UUID socketId) {
-		ClientAuthentication userAuth = userService.getUserToSocketId(socketId);
-		if (userAuth == null) {
+		String userId = userService.getUserIdToSocketId(socketId);
+		if (userId == null) {
 			throw new AccessDeniedException("No user authenticated for WebSocket connection");
 		}
 		SecurityContext context = SecurityContextHolder.getContext();
 		Set<GrantedAuthority> authorities = new HashSet<>();
 		authorities.add(WEBSOCKET_AUTHORITY);
-		User user = new User(userAuth, authorities);
+		User user = userService.loadUser(userId, authorities);
 		Authentication auth = new UsernamePasswordAuthenticationToken(user, null, authorities);
 		context.setAuthentication(auth);
 		SecurityContextHolder.setContext(context);
diff --git a/src/test/java/de/thm/arsnova/config/TestSecurityConfig.java b/src/test/java/de/thm/arsnova/config/TestSecurityConfig.java
index ee25ccee92c899a77fc67a755f67ff3a39ff6e19..e3d998e6f588f95aa2a4d89ac9d8238264aa34f6 100644
--- a/src/test/java/de/thm/arsnova/config/TestSecurityConfig.java
+++ b/src/test/java/de/thm/arsnova/config/TestSecurityConfig.java
@@ -26,12 +26,10 @@ import org.springframework.context.annotation.AdviceMode;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.context.annotation.Profile;
-import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.cas.ServiceProperties;
 import org.springframework.security.cas.authentication.CasAuthenticationProvider;
 import org.springframework.security.cas.web.CasAuthenticationEntryPoint;
 import org.springframework.security.cas.web.CasAuthenticationFilter;
-import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
 import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
diff --git a/src/test/java/de/thm/arsnova/model/EntityTest.java b/src/test/java/de/thm/arsnova/model/EntityTest.java
index d5edc7e761db8676d477252e17b0cc3138000226..01d8d0e7426e171833fb99cc1dcd4a2b2d37c437 100644
--- a/src/test/java/de/thm/arsnova/model/EntityTest.java
+++ b/src/test/java/de/thm/arsnova/model/EntityTest.java
@@ -22,7 +22,8 @@ import org.springframework.core.style.ToStringCreator;
 
 import java.util.Date;
 
-import static org.hamcrest.Matchers.*;
+import static org.hamcrest.Matchers.endsWith;
+import static org.hamcrest.Matchers.startsWith;
 import static org.junit.Assert.*;
 
 /**
diff --git a/src/test/java/de/thm/arsnova/service/DefaultEntityServiceImplTest.java b/src/test/java/de/thm/arsnova/service/DefaultEntityServiceImplTest.java
index 2a8ccbecc4890f0c71ea4951e215eedb6750f217..7af352356079ee807e99d0cd7ac24183bacc5d4a 100644
--- a/src/test/java/de/thm/arsnova/service/DefaultEntityServiceImplTest.java
+++ b/src/test/java/de/thm/arsnova/service/DefaultEntityServiceImplTest.java
@@ -24,9 +24,10 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import static org.mockito.AdditionalAnswers.*;
-import static org.mockito.Mockito.*;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.mockito.AdditionalAnswers.returnsFirstArg;
+import static org.mockito.Mockito.any;
+import static org.mockito.Mockito.when;
 
 
 @RunWith(SpringJUnit4ClassRunner.class)
diff --git a/src/test/java/de/thm/arsnova/service/StubUserService.java b/src/test/java/de/thm/arsnova/service/StubUserService.java
index a08514848086c4bd2ca5fac35b572a364563f27b..c1df90a5cda6142a8f817237c8fb866f783cf48d 100644
--- a/src/test/java/de/thm/arsnova/service/StubUserService.java
+++ b/src/test/java/de/thm/arsnova/service/StubUserService.java
@@ -17,25 +17,22 @@
  */
 package de.thm.arsnova.service;
 
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.UserProfile;
 import de.thm.arsnova.persistence.UserRepository;
 import de.thm.arsnova.security.User;
 import org.springframework.beans.factory.annotation.Qualifier;
 import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
 import org.springframework.mail.javamail.JavaMailSender;
-import org.springframework.security.authentication.AnonymousAuthenticationToken;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
 
-import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 import java.util.UUID;
 
 public class StubUserService extends UserServiceImpl {
 	private final Set<GrantedAuthority> grantedAuthorities;
-	private ClientAuthentication stubUser = null;
+	private User stubUser = null;
 
 	public StubUserService(
 			UserRepository repository,
@@ -54,19 +51,14 @@ public class StubUserService extends UserServiceImpl {
 		if (isAuthenticated) {
 			UserProfile userProfile = new UserProfile(UserProfile.AuthProvider.ARSNOVA, username);
 			userProfile.setId(UUID.randomUUID().toString());
-			User user = new User(userProfile, grantedAuthorities);
-			stubUser = new ClientAuthentication(user);
+			stubUser = new User(userProfile, grantedAuthorities);
 		} else {
 			stubUser = null;
 		}
 	}
 
-	public void useAnonymousUser() {
-		stubUser = new ClientAuthentication(new AnonymousAuthenticationToken(UUID.randomUUID().toString(), "anonymous", Collections.emptyList()));
-	}
-
 	@Override
-	public ClientAuthentication getCurrentUser() {
+	public User getCurrentUser() {
 		return stubUser;
 	}
 }
diff --git a/src/test/java/de/thm/arsnova/service/UserServiceTest.java b/src/test/java/de/thm/arsnova/service/UserServiceTest.java
index 6794fa424733523bb133d1c2d74ad2dca1bad72d..606f4fea8ce441194a8c03e7336e634ce9c75aa2 100644
--- a/src/test/java/de/thm/arsnova/service/UserServiceTest.java
+++ b/src/test/java/de/thm/arsnova/service/UserServiceTest.java
@@ -21,8 +21,8 @@ import de.thm.arsnova.config.AppConfig;
 import de.thm.arsnova.config.TestAppConfig;
 import de.thm.arsnova.config.TestPersistanceConfig;
 import de.thm.arsnova.config.TestSecurityConfig;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.UserProfile;
+import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.security.User;
 import de.thm.arsnova.security.pac4j.OAuthToken;
 import org.junit.Test;
diff --git a/src/test/java/de/thm/arsnova/service/score/QuestionBasedScoreCalculatorTest.java b/src/test/java/de/thm/arsnova/service/score/QuestionBasedScoreCalculatorTest.java
index dad34d7b79ba1eca43964b362b13f4e095374437..725d57a972d2dd2e7efa8b1db69844d349208e7c 100644
--- a/src/test/java/de/thm/arsnova/service/score/QuestionBasedScoreCalculatorTest.java
+++ b/src/test/java/de/thm/arsnova/service/score/QuestionBasedScoreCalculatorTest.java
@@ -42,9 +42,9 @@ public class QuestionBasedScoreCalculatorTest {
 		return questionId;
 	}
 
-	private void addAnswer(String questionId, ClientAuthentication user, int points) {
+	private void addAnswer(String questionId, String userId, int points) {
 		final int piRound = 1;
-		courseScore.addAnswer(questionId, piRound, user.getUsername(), points);
+		courseScore.addAnswer(questionId, piRound, userId, points);
 	}
 
 	@Before
@@ -62,32 +62,32 @@ public class QuestionBasedScoreCalculatorTest {
 	public void shouldIgnoreQuestionsWithoutCorrectAnswers() {
 		final int questionMaxValue = 0;
 		final int userScore = 0;
-		ClientAuthentication user = new TestClient("username");
+		String userId = "user1";
 		String questionId = this.addQuestion("lecture", questionMaxValue);
-		this.addAnswer(questionId, user, userScore);
+		this.addAnswer(questionId, userId, userScore);
 
 		ScoreStatistics expected = new ScoreStatistics();
 		expected.setCourseProgress(0);
 		expected.setMyProgress(0);
 		expected.setNumQuestions(0);
-		ScoreStatistics actual = lp.getMyProgress(null, user);
+		ScoreStatistics actual = lp.getMyProgress(null, userId);
 
 		assertEquals(expected, actual);
 	}
 
 	@Test
 	public void shouldIgnoreQuestionsWithoutCorrectAnswersInQuestionCount() {
-		ClientAuthentication user = new TestClient("username");
+		String userId = "user";
 		courseScore.addQuestion("question-without-correct-answers", "lecture", 1, 0);
 		courseScore.addQuestion("question-with-correct-answers", "lecture", 1, 50);
-		courseScore.addAnswer("question-without-correct-answers", 1, user.getUsername(), 0);
-		courseScore.addAnswer("question-with-correct-answers", 1, user.getUsername(), 50);
+		courseScore.addAnswer("question-without-correct-answers", 1, userId, 0);
+		courseScore.addAnswer("question-with-correct-answers", 1, userId, 50);
 
 		ScoreStatistics expected = new ScoreStatistics();
 		expected.setCourseProgress(100);
 		expected.setMyProgress(100);
 		expected.setNumQuestions(1);
-		ScoreStatistics actual = lp.getMyProgress(null, user);
+		ScoreStatistics actual = lp.getMyProgress(null, userId);
 
 		assertEquals(expected, actual);
 	}
@@ -99,9 +99,9 @@ public class QuestionBasedScoreCalculatorTest {
 	public void shouldCalculatePercentageOfOneQuestionWithSomeWrongAnswers() {
 		String questionId = this.addQuestion("lecture", 10);
 		for (int i = 0; i < 99; i++) {
-			this.addAnswer(questionId, new TestClient("user"+i), 10);
+			this.addAnswer(questionId, "user" + i, 10);
 		}
-		this.addAnswer(questionId, new TestClient("user-with-a-wrong-answer"), 0);
+		this.addAnswer(questionId, "user-with-a-wrong-answer", 0);
 
 		int expected = 99;
 		int actual = lp.getCourseProgress(null).getCourseProgress();
@@ -120,13 +120,13 @@ public class QuestionBasedScoreCalculatorTest {
 		String q1 = this.addQuestion("lecture", 10);
 		String q2 = this.addQuestion("lecture", 10);
 		// two users
-		ClientAuthentication u1 = new TestClient("user1");
-		ClientAuthentication u2 = new TestClient("user2");
+		String userId1 = "user1";
+		String userId2 = "user2";
 		// four answers, last one is wrong
-		this.addAnswer(q1, u1, 10);
-		this.addAnswer(q1, u2, 10);
-		this.addAnswer(q2, u1, 10);
-		this.addAnswer(q2, u2, 0);
+		this.addAnswer(q1, userId1, 10);
+		this.addAnswer(q1, userId2, 10);
+		this.addAnswer(q2, userId1, 10);
+		this.addAnswer(q2, userId2, 0);
 
 		int expected = 75;
 		int actual = lp.getCourseProgress(null).getCourseProgress();
@@ -141,10 +141,10 @@ public class QuestionBasedScoreCalculatorTest {
 		String q2 = this.addQuestion("lecture", 1);
 		// first question has many answers, all of them correct
 		for (int i = 0; i < 100; i++) {
-			this.addAnswer(q1, new TestClient("user"+i), 1000);
+			this.addAnswer(q1, "user" + i, 1000);
 		}
 		// second question has one wrong answer
-		this.addAnswer(q2,  new TestClient("another-user"), 0);
+		this.addAnswer(q2,  "another-user", 0);
 
 		int expected = 50;
 		int actual = lp.getCourseProgress(null).getCourseProgress();
@@ -156,20 +156,20 @@ public class QuestionBasedScoreCalculatorTest {
 	public void shouldFilterBasedOnQuestionVariant() {
 		String q1 = this.addQuestion("lecture", 100);
 		String q2 = this.addQuestion("preparation", 100);
-		ClientAuthentication u1 = new TestClient("user1");
-		ClientAuthentication u2 = new TestClient("user2");
+		String userId1 = "user1";
+		String userId2 = "user2";
 		// first question is answered correctly, second one is not
-		this.addAnswer(q1, u1, 100);
-		this.addAnswer(q1, u2, 100);
-		this.addAnswer(q2, u1, 0);
-		this.addAnswer(q2, u2, 0);
+		this.addAnswer(q1, userId1, 100);
+		this.addAnswer(q1, userId2, 100);
+		this.addAnswer(q2, userId1, 0);
+		this.addAnswer(q2, userId2, 0);
 
 		lp.setQuestionVariant("lecture");
 		ScoreStatistics lectureProgress = lp.getCourseProgress(null);
-		ScoreStatistics myLectureProgress = lp.getMyProgress(null, u1);
+		ScoreStatistics myLectureProgress = lp.getMyProgress(null, userId1);
 		lp.setQuestionVariant("preparation");
 		ScoreStatistics prepProgress = lp.getCourseProgress(null);
-		ScoreStatistics myPrepProgress = lp.getMyProgress(null, u1);
+		ScoreStatistics myPrepProgress = lp.getMyProgress(null, userId1);
 
 		assertEquals(100, lectureProgress.getCourseProgress());
 		assertEquals(100, myLectureProgress.getMyProgress());
@@ -179,19 +179,19 @@ public class QuestionBasedScoreCalculatorTest {
 
 	@Test
 	public void shouldConsiderAnswersOfSamePiRound() {
-		ClientAuthentication u1 = new TestClient("user1");
-		ClientAuthentication u2 = new TestClient("user2");
+		String userId1 = "user1";
+		String userId2 = "user2";
 		// question is in round 2
 		courseScore.addQuestion("q1", "lecture", 2, 100);
 		// 25 points in round 1, 75 points in round two for the first user
-		courseScore.addAnswer("q1", 1, u1.getUsername(), 25);
-		courseScore.addAnswer("q1", 2, u1.getUsername(), 100);
+		courseScore.addAnswer("q1", 1, userId1, 25);
+		courseScore.addAnswer("q1", 2, userId1, 100);
 		// 75 points in round 1, 25 points in round two for the second user
-		courseScore.addAnswer("q1", 1, u2.getUsername(), 100);
-		courseScore.addAnswer("q1", 2, u2.getUsername(), 25);
+		courseScore.addAnswer("q1", 1, userId2, 100);
+		courseScore.addAnswer("q1", 2, userId2, 25);
 
-		ScoreStatistics u1Progress = lp.getMyProgress(null, u1);
-		ScoreStatistics u2Progress = lp.getMyProgress(null, u2);
+		ScoreStatistics u1Progress = lp.getMyProgress(null, userId1);
+		ScoreStatistics u2Progress = lp.getMyProgress(null, userId2);
 
 		// only the answer for round 2 should be considered
 		assertEquals(50, u1Progress.getCourseProgress());
@@ -206,16 +206,16 @@ public class QuestionBasedScoreCalculatorTest {
 		String q1 = this.addQuestion("lecture", 10);
 		String q2 = this.addQuestion("lecture", 10);
 		// three users
-		ClientAuthentication u1 = new TestClient("user1");
-		ClientAuthentication u2 = new TestClient("user2");
-		ClientAuthentication u3 = new TestClient("user3");
+		String userId1 = "user1";
+		String userId2 = "user2";
+		String userId3 = "user3";
 		// six answers
-		this.addAnswer(q1, u1, 10);
-		this.addAnswer(q2, u1, -100);
-		this.addAnswer(q1, u2, -100);
-		this.addAnswer(q2, u2, -100);
-		this.addAnswer(q1, u3, -100);
-		this.addAnswer(q2, u3, -100);
+		this.addAnswer(q1, userId1, 10);
+		this.addAnswer(q2, userId1, -100);
+		this.addAnswer(q1, userId2, -100);
+		this.addAnswer(q2, userId2, -100);
+		this.addAnswer(q1, userId3, -100);
+		this.addAnswer(q2, userId3, -100);
 
 		int numerator = lp.getCourseProgress(null).getNumerator();
 		int denominator = lp.getCourseProgress(null).getDenominator();
diff --git a/src/test/java/de/thm/arsnova/service/score/ScoreBasedScoreCalculatorTest.java b/src/test/java/de/thm/arsnova/service/score/ScoreBasedScoreCalculatorTest.java
index 5469530b0924751a8a526e2e238267d8d63cd115..fe0f43689d9ccef00baa473c880b371123f76697 100644
--- a/src/test/java/de/thm/arsnova/service/score/ScoreBasedScoreCalculatorTest.java
+++ b/src/test/java/de/thm/arsnova/service/score/ScoreBasedScoreCalculatorTest.java
@@ -17,8 +17,6 @@
  */
 package de.thm.arsnova.service.score;
 
-import de.thm.arsnova.model.TestClient;
-import de.thm.arsnova.model.migration.v2.ClientAuthentication;
 import de.thm.arsnova.model.transport.ScoreStatistics;
 import de.thm.arsnova.persistence.SessionStatisticsRepository;
 import org.junit.Before;
@@ -42,9 +40,9 @@ public class ScoreBasedScoreCalculatorTest {
 		return questionId;
 	}
 
-	private void addAnswer(String questionId, ClientAuthentication user, int points) {
+	private void addAnswer(String questionId, String userId, int points) {
 		final int piRound = 1;
-		courseScore.addAnswer(questionId, piRound, user.getUsername(), points);
+		courseScore.addAnswer(questionId, piRound, userId, points);
 	}
 
 	@Before
@@ -61,22 +59,22 @@ public class ScoreBasedScoreCalculatorTest {
 		String q1 = this.addQuestion("lecture", 100);
 		String q2 = this.addQuestion("lecture", 100);
 		String q3 = this.addQuestion("lecture", 100);
-		ClientAuthentication u1 = new TestClient("user1");
-		ClientAuthentication u2 = new TestClient("user2");
-		ClientAuthentication u3 = new TestClient("user3");
+		String userId1 = "user1";
+		String userId2 = "user2";
+		String userId3 = "user3";
 		// Both users achieve 200 points
-		this.addAnswer(q1, u1, 100);
-		this.addAnswer(q1, u2, 100);
-		this.addAnswer(q1, u3, 0);
-		this.addAnswer(q2, u1, 0);
-		this.addAnswer(q2, u2, 100);
-		this.addAnswer(q2, u3, 0);
-		this.addAnswer(q3, u1, 100);
-		this.addAnswer(q3, u2, 100);
-		this.addAnswer(q3, u3, 0);
+		this.addAnswer(q1, userId1, 100);
+		this.addAnswer(q1, userId2, 100);
+		this.addAnswer(q1, userId3, 0);
+		this.addAnswer(q2, userId1, 0);
+		this.addAnswer(q2, userId2, 100);
+		this.addAnswer(q2, userId3, 0);
+		this.addAnswer(q3, userId1, 100);
+		this.addAnswer(q3, userId2, 100);
+		this.addAnswer(q3, userId3, 0);
 
 		lp.setQuestionVariant("lecture");
-		ScoreStatistics u1LectureProgress = lp.getMyProgress(null, u1);
+		ScoreStatistics u1LectureProgress = lp.getMyProgress(null, userId1);
 		// (500/3) / 300 ~= 0,56.
 		assertEquals(56, u1LectureProgress.getCourseProgress());
 		// 200 / 300 ~= 0,67.
@@ -89,18 +87,18 @@ public class ScoreBasedScoreCalculatorTest {
 		String q1 = this.addQuestion("lecture", 100);
 		String q2 = this.addQuestion("lecture", 100);
 		String q3 = this.addQuestion("lecture", 100);
-		ClientAuthentication u1 = new TestClient("user1");
-		ClientAuthentication u2 = new TestClient("user2");
+		String userId1 = "user1";
+		String userId2 = "user2";
 		// Both users achieve 200 points
-		this.addAnswer(q1, u1, 100);
-		this.addAnswer(q1, u2, 100);
-		this.addAnswer(q2, u1, 0);
-		this.addAnswer(q2, u2, 0);
-		this.addAnswer(q3, u1, 100);
-		this.addAnswer(q3, u2, 100);
+		this.addAnswer(q1, userId1, 100);
+		this.addAnswer(q1, userId2, 100);
+		this.addAnswer(q2, userId1, 0);
+		this.addAnswer(q2, userId2, 0);
+		this.addAnswer(q3, userId1, 100);
+		this.addAnswer(q3, userId2, 100);
 
 		lp.setQuestionVariant("lecture");
-		ScoreStatistics u1LectureProgress = lp.getMyProgress(null, u1);
+		ScoreStatistics u1LectureProgress = lp.getMyProgress(null, userId1);
 		// 200 / 300 = 0,67
 		assertEquals(67, u1LectureProgress.getCourseProgress());
 		assertEquals(67, u1LectureProgress.getMyProgress());
@@ -108,19 +106,19 @@ public class ScoreBasedScoreCalculatorTest {
 
 	@Test
 	public void shouldConsiderAnswersOfSamePiRound() {
-		ClientAuthentication u1 = new TestClient("user1");
-		ClientAuthentication u2 = new TestClient("user2");
+		String userId1 = "user1";
+		String userId2 = "user2";
 		// question is in round 2
 		courseScore.addQuestion("q1", "lecture", 2, 100);
 		// 25 points in round 1, 75 points in round two for the first user
-		courseScore.addAnswer("q1", 1, u1.getUsername(), 25);
-		courseScore.addAnswer("q1", 2, u1.getUsername(), 75);
+		courseScore.addAnswer("q1", 1, userId1, 25);
+		courseScore.addAnswer("q1", 2, userId1, 75);
 		// 75 points in round 1, 25 points in round two for the second user
-		courseScore.addAnswer("q1", 1, u2.getUsername(), 75);
-		courseScore.addAnswer("q1", 2, u2.getUsername(), 25);
+		courseScore.addAnswer("q1", 1, userId2, 75);
+		courseScore.addAnswer("q1", 2, userId2, 25);
 
-		ScoreStatistics u1Progress = lp.getMyProgress(null, u1);
-		ScoreStatistics u2Progress = lp.getMyProgress(null, u2);
+		ScoreStatistics u1Progress = lp.getMyProgress(null, userId1);
+		ScoreStatistics u2Progress = lp.getMyProgress(null, userId2);
 
 		// only the answer for round 2 should be considered
 		assertEquals(50, u1Progress.getCourseProgress());
@@ -135,16 +133,16 @@ public class ScoreBasedScoreCalculatorTest {
 		String q1 = this.addQuestion("lecture", 10);
 		String q2 = this.addQuestion("lecture", 10);
 		// three users
-		ClientAuthentication u1 = new TestClient("user1");
-		ClientAuthentication u2 = new TestClient("user2");
-		ClientAuthentication u3 = new TestClient("user3");
+		String userId1 = "user1";
+		String userId2 = "user2";
+		String userId3 = "user3";
 		// six answers
-		this.addAnswer(q1, u1, 10);
-		this.addAnswer(q2, u1, 0);
-		this.addAnswer(q1, u2, 10);
-		this.addAnswer(q2, u2, 0);
-		this.addAnswer(q1, u3, 10);
-		this.addAnswer(q2, u3, 0);
+		this.addAnswer(q1, userId1, 10);
+		this.addAnswer(q2, userId1, 0);
+		this.addAnswer(q1, userId2, 10);
+		this.addAnswer(q2, userId2, 0);
+		this.addAnswer(q1, userId3, 10);
+		this.addAnswer(q2, userId3, 0);
 
 		int numerator = lp.getCourseProgress(null).getNumerator();
 		int denominator = lp.getCourseProgress(null).getDenominator();
diff --git a/src/test/java/de/thm/arsnova/util/ImageUtilsTest.java b/src/test/java/de/thm/arsnova/util/ImageUtilsTest.java
index 4833b071aa97d232ff52887ccda8790cdb5de8a1..d07fd9bd4714bf5a1eb1ee02348726024422bf78 100644
--- a/src/test/java/de/thm/arsnova/util/ImageUtilsTest.java
+++ b/src/test/java/de/thm/arsnova/util/ImageUtilsTest.java
@@ -21,7 +21,6 @@ import de.thm.arsnova.config.AppConfig;
 import de.thm.arsnova.config.TestAppConfig;
 import de.thm.arsnova.config.TestPersistanceConfig;
 import de.thm.arsnova.config.TestSecurityConfig;
-import de.thm.arsnova.util.ImageUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.test.context.ActiveProfiles;