From 0e54b029fd7d298582badd0a0930b066cf107349 Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <code@dgerhardt.net>
Date: Tue, 5 Sep 2017 16:59:23 +0200
Subject: [PATCH] Refactor API/entities for users

---
 .../arsnova/controller/CourseController.java  |   4 +-
 .../controller/FeedbackController.java        |   4 +-
 .../arsnova/controller/LoginController.java   |   8 +-
 .../arsnova/controller/MotdController.java    |   2 +-
 .../arsnova/controller/SocketController.java  |   4 +-
 .../arsnova/controller/UserController.java    |   2 +-
 .../{User.java => UserAuthentication.java}    |  28 +--
 .../de/thm/arsnova/entities/UserProfile.java  | 192 ++++++++++++++++++
 .../entities/migration/V2Migrator.java        |  42 +++-
 .../entities/migration/v2/Comment.java        |   4 +-
 .../entities/{ => migration/v2}/DbUser.java   |   3 +-
 .../entities/{ => migration/v2}/LoggedIn.java |   4 +-
 .../entities/{ => migration/v2}/MotdList.java |   3 +-
 .../entities/migration/v2/Session.java        |   4 +-
 .../{ => migration/v2}/VisitedSession.java    |   2 +-
 .../CouchDbTypeFieldConverter.java            |   4 +-
 .../transport/AnswerQueueElement.java         |   8 +-
 .../transport/ImportExportSession.java        |   4 +-
 .../DeleteFeedbackForSessionsEvent.java       |   8 +-
 .../de/thm/arsnova/events/NewAnswerEvent.java |   8 +-
 .../arsnova/persistance/AnswerRepository.java |   6 +-
 .../persistance/CommentRepository.java        |   8 +-
 .../persistance/ContentRepository.java        |   8 +-
 .../persistance/MotdListRepository.java       |   2 +-
 .../persistance/SessionRepository.java        |  18 +-
 .../arsnova/persistance/UserRepository.java   |   2 +-
 .../couchdb/CouchDbAnswerRepository.java      |   6 +-
 .../couchdb/CouchDbCommentRepository.java     |   8 +-
 .../couchdb/CouchDbContentRepository.java     |   8 +-
 .../couchdb/CouchDbMotdListRepository.java    |   2 +-
 .../couchdb/CouchDbSessionRepository.java     |  22 +-
 .../couchdb/CouchDbUserRepository.java        |   2 +-
 .../CouchDbVisitedSessionRepository.java      |   2 +-
 .../ApplicationPermissionEvaluator.java       |  10 +-
 .../security/DbUserDetailsService.java        |   2 +-
 .../thm/arsnova/services/CommentService.java  |   4 +-
 .../arsnova/services/CommentServiceImpl.java  |  18 +-
 .../thm/arsnova/services/ContentService.java  |  10 +-
 .../arsnova/services/ContentServiceImpl.java  |  50 ++---
 .../thm/arsnova/services/FeedbackService.java |   6 +-
 .../arsnova/services/FeedbackServiceImpl.java |  24 +--
 .../services/FeedbackStorageService.java      |  10 +-
 .../services/FeedbackStorageServiceImpl.java  |  32 +--
 .../de/thm/arsnova/services/MotdService.java  |   2 +-
 .../thm/arsnova/services/MotdServiceImpl.java |  10 +-
 .../thm/arsnova/services/SessionService.java  |   6 +-
 .../arsnova/services/SessionServiceImpl.java  |  24 +--
 .../de/thm/arsnova/services/UserService.java  |  18 +-
 .../thm/arsnova/services/UserServiceImpl.java |  56 ++---
 .../arsnova/services/UserSessionService.java  |   6 +-
 .../services/UserSessionServiceImpl.java      |   8 +-
 .../score/QuestionBasedScoreCalculator.java   |   8 +-
 .../arsnova/services/score/QuestionScore.java |   4 +-
 .../de/thm/arsnova/services/score/Score.java  |   4 +-
 .../score/ScoreBasedScoreCalculator.java      |   6 +-
 .../services/score/ScoreCalculator.java       |   4 +-
 .../thm/arsnova/services/score/UserScore.java |   4 +-
 .../score/VariantScoreCalculator.java         |   6 +-
 .../websocket/ArsnovaSocketioServerImpl.java  |  30 +--
 .../de/thm/arsnova/entities/TestUser.java     |   2 +-
 .../thm/arsnova/services/StubUserService.java |  10 +-
 .../thm/arsnova/services/UserServiceTest.java |  15 +-
 .../QuestionBasedScoreCalculatorTest.java     |  29 ++-
 .../score/ScoreBasedScoreCalculatorTest.java  |  25 +--
 64 files changed, 552 insertions(+), 323 deletions(-)
 rename src/main/java/de/thm/arsnova/entities/{User.java => UserAuthentication.java} (82%)
 create mode 100644 src/main/java/de/thm/arsnova/entities/UserProfile.java
 rename src/main/java/de/thm/arsnova/entities/{ => migration/v2}/DbUser.java (97%)
 rename src/main/java/de/thm/arsnova/entities/{ => migration/v2}/LoggedIn.java (95%)
 rename src/main/java/de/thm/arsnova/entities/{ => migration/v2}/MotdList.java (96%)
 rename src/main/java/de/thm/arsnova/entities/{ => migration/v2}/VisitedSession.java (97%)

diff --git a/src/main/java/de/thm/arsnova/controller/CourseController.java b/src/main/java/de/thm/arsnova/controller/CourseController.java
index 74e6c514..7671b524 100644
--- a/src/main/java/de/thm/arsnova/controller/CourseController.java
+++ b/src/main/java/de/thm/arsnova/controller/CourseController.java
@@ -20,7 +20,7 @@ package de.thm.arsnova.controller;
 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.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.exceptions.NotImplementedException;
 import de.thm.arsnova.exceptions.UnauthorizedException;
 import de.thm.arsnova.services.UserService;
@@ -54,7 +54,7 @@ public class CourseController extends AbstractController {
 			@RequestParam(value = "sortby", defaultValue = "name") final String sortby
 			) {
 
-		final User currentUser = userService.getCurrentUser();
+		final UserAuthentication currentUser = userService.getCurrentUser();
 
 		if (currentUser == null || currentUser.getUsername() == null) {
 			throw new UnauthorizedException();
diff --git a/src/main/java/de/thm/arsnova/controller/FeedbackController.java b/src/main/java/de/thm/arsnova/controller/FeedbackController.java
index 0d6c54d3..b5b29c47 100644
--- a/src/main/java/de/thm/arsnova/controller/FeedbackController.java
+++ b/src/main/java/de/thm/arsnova/controller/FeedbackController.java
@@ -18,7 +18,7 @@
 package de.thm.arsnova.controller;
 
 import de.thm.arsnova.entities.Feedback;
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.exceptions.NotFoundException;
 import de.thm.arsnova.services.FeedbackService;
 import de.thm.arsnova.services.UserService;
@@ -94,7 +94,7 @@ public class FeedbackController extends AbstractController {
 			@PathVariable final String sessionkey,
 			@RequestBody final int value
 			) {
-		User user = userService.getCurrentUser();
+		UserAuthentication user = userService.getCurrentUser();
 		feedbackService.save(sessionkey, value, user);
 		Feedback feedback = feedbackService.getBySessionKey(sessionkey);
 
diff --git a/src/main/java/de/thm/arsnova/controller/LoginController.java b/src/main/java/de/thm/arsnova/controller/LoginController.java
index e4ef20e0..36525fa2 100644
--- a/src/main/java/de/thm/arsnova/controller/LoginController.java
+++ b/src/main/java/de/thm/arsnova/controller/LoginController.java
@@ -18,8 +18,8 @@
 package de.thm.arsnova.controller;
 
 import de.thm.arsnova.entities.ServiceDescription;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Session;
-import de.thm.arsnova.entities.User;
 import de.thm.arsnova.exceptions.UnauthorizedException;
 import de.thm.arsnova.services.UserService;
 import de.thm.arsnova.services.UserSessionService;
@@ -304,7 +304,7 @@ public class LoginController extends AbstractController {
 
 	@RequestMapping(value = { "/auth/", "/whoami" }, method = RequestMethod.GET)
 	@ResponseBody
-	public User whoami() {
+	public UserAuthentication whoami() {
 		userSessionService.setUser(userService.getCurrentUser());
 		return userService.getCurrentUser();
 	}
@@ -431,8 +431,8 @@ public class LoginController extends AbstractController {
 
 	@RequestMapping(value = { "/test/me" }, method = RequestMethod.GET)
 	@ResponseBody
-	public User me() {
-		final User me = userSessionService.getUser();
+	public UserAuthentication me() {
+		final UserAuthentication me = userSessionService.getUser();
 		if (me == null) {
 			throw new UnauthorizedException();
 		}
diff --git a/src/main/java/de/thm/arsnova/controller/MotdController.java b/src/main/java/de/thm/arsnova/controller/MotdController.java
index e9a19f58..293080f4 100644
--- a/src/main/java/de/thm/arsnova/controller/MotdController.java
+++ b/src/main/java/de/thm/arsnova/controller/MotdController.java
@@ -18,7 +18,7 @@
 package de.thm.arsnova.controller;
 
 import de.thm.arsnova.entities.Motd;
-import de.thm.arsnova.entities.MotdList;
+import de.thm.arsnova.entities.migration.v2.MotdList;
 import de.thm.arsnova.services.MotdService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
diff --git a/src/main/java/de/thm/arsnova/controller/SocketController.java b/src/main/java/de/thm/arsnova/controller/SocketController.java
index 0fa66e39..66fc3c12 100644
--- a/src/main/java/de/thm/arsnova/controller/SocketController.java
+++ b/src/main/java/de/thm/arsnova/controller/SocketController.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.controller;
 
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.services.UserService;
 import de.thm.arsnova.services.UserSessionService;
 import de.thm.arsnova.websocket.ArsnovaSocketioServer;
@@ -74,7 +74,7 @@ public class SocketController extends AbstractController {
 			response.setStatus(HttpStatus.BAD_REQUEST.value());
 			return;
 		}
-		User u = userService.getCurrentUser();
+		UserAuthentication u = userService.getCurrentUser();
 		if (null == u) {
 			logger.debug("Client {} requested to assign Websocket session but has not authenticated.", socketid);
 			response.setStatus(HttpStatus.FORBIDDEN.value());
diff --git a/src/main/java/de/thm/arsnova/controller/UserController.java b/src/main/java/de/thm/arsnova/controller/UserController.java
index c0fa9ead..ae03cd09 100644
--- a/src/main/java/de/thm/arsnova/controller/UserController.java
+++ b/src/main/java/de/thm/arsnova/controller/UserController.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.controller;
 
-import de.thm.arsnova.entities.DbUser;
+import de.thm.arsnova.entities.migration.v2.DbUser;
 import de.thm.arsnova.services.UserService;
 import de.thm.arsnova.services.UserSessionService;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/src/main/java/de/thm/arsnova/entities/User.java b/src/main/java/de/thm/arsnova/entities/UserAuthentication.java
similarity index 82%
rename from src/main/java/de/thm/arsnova/entities/User.java
rename to src/main/java/de/thm/arsnova/entities/UserAuthentication.java
index cbd822c1..b8e52dc4 100644
--- a/src/main/java/de/thm/arsnova/entities/User.java
+++ b/src/main/java/de/thm/arsnova/entities/UserAuthentication.java
@@ -32,7 +32,7 @@ import java.io.Serializable;
 /**
  * Represents a user.
  */
-public class User implements Serializable {
+public class UserAuthentication implements Serializable {
 	public static final String GOOGLE = "google";
 	public static final String TWITTER = "twitter";
 	public static final String FACEBOOK = "facebook";
@@ -48,32 +48,32 @@ public class User implements Serializable {
 	private UserSessionService.Role role;
 	private boolean isAdmin;
 
-	public User(Google2Profile profile) {
+	public UserAuthentication(Google2Profile profile) {
 		setUsername(profile.getEmail());
-		setType(User.GOOGLE);
+		setType(UserAuthentication.GOOGLE);
 	}
 
-	public User(TwitterProfile profile) {
+	public UserAuthentication(TwitterProfile profile) {
 		setUsername(profile.getUsername());
-		setType(User.TWITTER);
+		setType(UserAuthentication.TWITTER);
 	}
 
-	public User(FacebookProfile profile) {
+	public UserAuthentication(FacebookProfile profile) {
 		setUsername(profile.getProfileUrl().toString());
-		setType(User.FACEBOOK);
+		setType(UserAuthentication.FACEBOOK);
 	}
 
-	public User(AttributePrincipal principal) {
+	public UserAuthentication(AttributePrincipal principal) {
 		setUsername(principal.getName());
-		setType(User.THM);
+		setType(UserAuthentication.THM);
 	}
 
-	public User(AnonymousAuthenticationToken token) {
-		setUsername(User.ANONYMOUS);
-		setType(User.ANONYMOUS);
+	public UserAuthentication(AnonymousAuthenticationToken token) {
+		setUsername(UserAuthentication.ANONYMOUS);
+		setType(UserAuthentication.ANONYMOUS);
 	}
 
-	public User(UsernamePasswordAuthenticationToken token) {
+	public UserAuthentication(UsernamePasswordAuthenticationToken token) {
 		setUsername(token.getName());
 		setType(LDAP);
 	}
@@ -138,7 +138,7 @@ public class User implements Serializable {
 		if (obj == null || !obj.getClass().equals(this.getClass())) {
 			return false;
 		}
-		User other = (User) obj;
+		UserAuthentication other = (UserAuthentication) obj;
 		return this.username.equals(other.username) && this.type.equals(other.type);
 	}
 
diff --git a/src/main/java/de/thm/arsnova/entities/UserProfile.java b/src/main/java/de/thm/arsnova/entities/UserProfile.java
new file mode 100644
index 00000000..8a9ae428
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/entities/UserProfile.java
@@ -0,0 +1,192 @@
+package de.thm.arsnova.entities;
+
+import com.fasterxml.jackson.annotation.JsonView;
+import de.thm.arsnova.entities.serialization.View;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class UserProfile implements Entity {
+	public class Account {
+		private String password;
+		private String activationKey;
+		private String passwordResetKey;
+		private long passwordResetTime;
+
+		@JsonView(View.Persistence.class)
+		public String getPassword() {
+			return password;
+		}
+
+		@JsonView(View.Persistence.class)
+		public void setPassword(String password) {
+			this.password = password;
+		}
+
+		@JsonView(View.Persistence.class)
+		public String getActivationKey() {
+			return activationKey;
+		}
+
+		@JsonView(View.Persistence.class)
+		public void setActivationKey(String activationKey) {
+			this.activationKey = activationKey;
+		}
+
+		@JsonView(View.Persistence.class)
+		public String getPasswordResetKey() {
+			return passwordResetKey;
+		}
+
+		@JsonView(View.Persistence.class)
+		public void setPasswordResetKey(String passwordResetKey) {
+			this.passwordResetKey = passwordResetKey;
+		}
+
+		@JsonView(View.Persistence.class)
+		public long getPasswordResetTime() {
+			return passwordResetTime;
+		}
+
+		@JsonView(View.Persistence.class)
+		public void setPasswordResetTime(long passwordResetTime) {
+			this.passwordResetTime = passwordResetTime;
+		}
+	}
+
+	public class SessionHistoryEntry {
+		private String sessionId;
+		private long lastVisit;
+
+		public SessionHistoryEntry() {
+
+		}
+
+		public SessionHistoryEntry(String sessionId, long lastVisit) {
+			this.sessionId = sessionId;
+			this.lastVisit = lastVisit;
+		}
+
+		public String getSessionId() {
+			return sessionId;
+		}
+
+		public void setSessionId(String sessionId) {
+			this.sessionId = sessionId;
+		}
+
+		public long getLastVisit() {
+			return lastVisit;
+		}
+
+		public void setLastVisit(long lastVisit) {
+			this.lastVisit = lastVisit;
+		}
+	}
+
+	private String id;
+	private String rev;
+	private String authProvider;
+	private String loginId;
+	private long creation;
+	private long lastLogin;
+	private Account account;
+	private List<SessionHistoryEntry> sessionHistory = new ArrayList<>();
+	private Set<String> acknowledgedMotds = new HashSet<>();
+
+	@Override
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getId() {
+		return id;
+	}
+
+	@Override
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setId(String id) {
+		this.id = id;
+	}
+
+	@Override
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getRevision() {
+		return rev;
+	}
+
+	@Override
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setRevision(String rev) {
+		this.rev = rev;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getAuthProvider() {
+		return authProvider;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setAuthProvider(String authProvider) {
+		this.authProvider = authProvider;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getLoginId() {
+		return loginId;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setLoginId(String loginId) {
+		this.loginId = loginId;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public long getCreation() {
+		return creation;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setCreation(long creation) {
+		this.creation = creation;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public long getLastLogin() {
+		return lastLogin;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setLastLogin(long lastLogin) {
+		this.lastLogin = lastLogin;
+	}
+
+	@JsonView(View.Persistence.class)
+	public Account getAccount() {
+		return account;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setAccount(Account account) {
+		this.account = account;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public List<SessionHistoryEntry> getSessionHistory() {
+		return sessionHistory;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setSessionHistory(List<SessionHistoryEntry> sessionHistory) {
+		this.sessionHistory = sessionHistory;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public Set<String> getAcknowledgedMotds() {
+		return acknowledgedMotds;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setAcknowledgedMotds(Set<String> acknowledgedMotds) {
+		this.acknowledgedMotds = acknowledgedMotds;
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/entities/migration/V2Migrator.java b/src/main/java/de/thm/arsnova/entities/migration/V2Migrator.java
index f12beab1..f37fd437 100644
--- a/src/main/java/de/thm/arsnova/entities/migration/V2Migrator.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/V2Migrator.java
@@ -2,17 +2,22 @@ package de.thm.arsnova.entities.migration;
 
 import de.thm.arsnova.entities.ChoiceAnswer;
 import de.thm.arsnova.entities.ChoiceQuestionContent;
-import de.thm.arsnova.entities.DbUser;
 import de.thm.arsnova.entities.Entity;
 import de.thm.arsnova.entities.TextAnswer;
+import de.thm.arsnova.entities.UserProfile;
 import de.thm.arsnova.entities.migration.v2.Answer;
 import de.thm.arsnova.entities.migration.v2.AnswerOption;
 import de.thm.arsnova.entities.migration.v2.Comment;
 import de.thm.arsnova.entities.migration.v2.Content;
+import de.thm.arsnova.entities.migration.v2.DbUser;
+import de.thm.arsnova.entities.migration.v2.LoggedIn;
+import de.thm.arsnova.entities.migration.v2.MotdList;
 import de.thm.arsnova.entities.migration.v2.Session;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
+import java.util.stream.Collectors;
 
 public class V2Migrator {
 	private void copyCommonProperties(final Entity from, final Entity to) {
@@ -20,6 +25,41 @@ public class V2Migrator {
 		to.setRevision(from.getRevision());
 	}
 
+	public UserProfile migrate(final DbUser dbUser, final LoggedIn loggedIn, final MotdList motdList) {
+		if (dbUser != null && loggedIn != null && !loggedIn.getUser().equals(dbUser.getUsername())) {
+			throw new IllegalArgumentException("Username of loggedIn object does not match.");
+		}
+		if (dbUser != null && motdList != null && !motdList.getUsername().equals(dbUser.getUsername())) {
+			throw new IllegalArgumentException("Username of motdList object does not match.");
+		}
+		if (loggedIn != null && motdList != null && !loggedIn.getUser().equals(motdList.getUsername())) {
+			throw new IllegalArgumentException("Usernames of loggedIn and motdList objects do not match.");
+		}
+		final UserProfile profile = new UserProfile();
+		if (dbUser != null) {
+			profile.setLoginId(dbUser.getUsername());
+			UserProfile.Account account = profile.new Account();
+			profile.setAccount(account);
+			account.setPassword(dbUser.getPassword());
+			account.setActivationKey(dbUser.getActivationKey());
+			account.setPasswordResetKey(dbUser.getPasswordResetKey());
+			account.setPasswordResetTime(dbUser.getPasswordResetTime());
+		}
+		if (loggedIn != null) {
+			profile.setLoginId(loggedIn.getUser());
+			profile.setLastLogin(loggedIn.getTimestamp());
+			List<UserProfile.SessionHistoryEntry> sessionHistory = loggedIn.getVisitedSessions().stream()
+					.map(entry -> profile.new SessionHistoryEntry(entry.getId(), 0))
+					.collect(Collectors.toList());
+			profile.setSessionHistory(sessionHistory);
+		}
+		if (motdList != null && motdList.getMotdkeys() != null) {
+			profile.setAcknowledgedMotds(Arrays.stream(motdList.getMotdkeys().split(",")).collect(Collectors.toSet()));
+		}
+
+		return profile;
+	}
+
 	public de.thm.arsnova.entities.Session migrate(final Session from, final DbUser owner) {
 		if (!owner.getUsername().equals(from.getCreator())) {
 			throw new IllegalArgumentException("Username of owner object does not match session creator.");
diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/Comment.java b/src/main/java/de/thm/arsnova/entities/migration/v2/Comment.java
index f0ea862d..9dd6196e 100644
--- a/src/main/java/de/thm/arsnova/entities/migration/v2/Comment.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Comment.java
@@ -19,7 +19,7 @@ package de.thm.arsnova.entities.migration.v2;
 
 import com.fasterxml.jackson.annotation.JsonView;
 import de.thm.arsnova.entities.Entity;
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.serialization.View;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -128,7 +128,7 @@ public class Comment implements Entity {
 		this.creator = creator;
 	}
 
-	public boolean isCreator(User user) {
+	public boolean isCreator(UserAuthentication user) {
 		return user.getUsername().equals(creator);
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/entities/DbUser.java b/src/main/java/de/thm/arsnova/entities/migration/v2/DbUser.java
similarity index 97%
rename from src/main/java/de/thm/arsnova/entities/DbUser.java
rename to src/main/java/de/thm/arsnova/entities/migration/v2/DbUser.java
index ff2e99f1..9aaa1040 100644
--- a/src/main/java/de/thm/arsnova/entities/DbUser.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/DbUser.java
@@ -15,9 +15,10 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-package de.thm.arsnova.entities;
+package de.thm.arsnova.entities.migration.v2;
 
 import com.fasterxml.jackson.annotation.JsonView;
+import de.thm.arsnova.entities.Entity;
 import de.thm.arsnova.entities.serialization.View;
 
 /**
diff --git a/src/main/java/de/thm/arsnova/entities/LoggedIn.java b/src/main/java/de/thm/arsnova/entities/migration/v2/LoggedIn.java
similarity index 95%
rename from src/main/java/de/thm/arsnova/entities/LoggedIn.java
rename to src/main/java/de/thm/arsnova/entities/migration/v2/LoggedIn.java
index 49da6266..1345f76b 100644
--- a/src/main/java/de/thm/arsnova/entities/LoggedIn.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/LoggedIn.java
@@ -15,10 +15,12 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-package de.thm.arsnova.entities;
+package de.thm.arsnova.entities.migration.v2;
 
 import com.fasterxml.jackson.annotation.JsonView;
+import de.thm.arsnova.entities.Entity;
 import de.thm.arsnova.entities.migration.v2.Session;
+import de.thm.arsnova.entities.migration.v2.VisitedSession;
 import de.thm.arsnova.entities.serialization.View;
 
 import java.util.ArrayList;
diff --git a/src/main/java/de/thm/arsnova/entities/MotdList.java b/src/main/java/de/thm/arsnova/entities/migration/v2/MotdList.java
similarity index 96%
rename from src/main/java/de/thm/arsnova/entities/MotdList.java
rename to src/main/java/de/thm/arsnova/entities/migration/v2/MotdList.java
index 35b611fe..af766875 100644
--- a/src/main/java/de/thm/arsnova/entities/MotdList.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/MotdList.java
@@ -15,9 +15,10 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-package de.thm.arsnova.entities;
+package de.thm.arsnova.entities.migration.v2;
 
 import com.fasterxml.jackson.annotation.JsonView;
+import de.thm.arsnova.entities.Entity;
 import de.thm.arsnova.entities.serialization.View;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/Session.java b/src/main/java/de/thm/arsnova/entities/migration/v2/Session.java
index 13e6191f..fe0ef885 100644
--- a/src/main/java/de/thm/arsnova/entities/migration/v2/Session.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Session.java
@@ -21,7 +21,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore;
 import com.fasterxml.jackson.annotation.JsonView;
 import de.thm.arsnova.entities.Entity;
 import de.thm.arsnova.entities.ScoreOptions;
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.serialization.View;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -144,7 +144,7 @@ public class Session implements Entity {
 		this.lastOwnerActivity = lastOwnerActivity;
 	}
 
-	public boolean isCreator(final User user) {
+	public boolean isCreator(final UserAuthentication user) {
 		return user.getUsername().equals(creator);
 	}
 
diff --git a/src/main/java/de/thm/arsnova/entities/VisitedSession.java b/src/main/java/de/thm/arsnova/entities/migration/v2/VisitedSession.java
similarity index 97%
rename from src/main/java/de/thm/arsnova/entities/VisitedSession.java
rename to src/main/java/de/thm/arsnova/entities/migration/v2/VisitedSession.java
index dd61538b..c5626a4f 100644
--- a/src/main/java/de/thm/arsnova/entities/VisitedSession.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/VisitedSession.java
@@ -15,7 +15,7 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-package de.thm.arsnova.entities;
+package de.thm.arsnova.entities.migration.v2;
 
 import com.fasterxml.jackson.annotation.JsonView;
 import de.thm.arsnova.entities.migration.v2.Session;
diff --git a/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java b/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java
index f461eb88..05ce0734 100644
--- a/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java
+++ b/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java
@@ -22,12 +22,12 @@ import com.fasterxml.jackson.databind.type.TypeFactory;
 import com.fasterxml.jackson.databind.util.Converter;
 import de.thm.arsnova.entities.migration.v2.Answer;
 import de.thm.arsnova.entities.migration.v2.Comment;
-import de.thm.arsnova.entities.DbUser;
+import de.thm.arsnova.entities.migration.v2.DbUser;
 import de.thm.arsnova.entities.Entity;
 import de.thm.arsnova.entities.LogEntry;
 import de.thm.arsnova.entities.Motd;
 import de.thm.arsnova.entities.migration.v2.Content;
-import de.thm.arsnova.entities.MotdList;
+import de.thm.arsnova.entities.migration.v2.MotdList;
 import de.thm.arsnova.entities.migration.v2.Session;
 
 import java.util.HashMap;
diff --git a/src/main/java/de/thm/arsnova/entities/transport/AnswerQueueElement.java b/src/main/java/de/thm/arsnova/entities/transport/AnswerQueueElement.java
index 9a1e30d2..ad004160 100644
--- a/src/main/java/de/thm/arsnova/entities/transport/AnswerQueueElement.java
+++ b/src/main/java/de/thm/arsnova/entities/transport/AnswerQueueElement.java
@@ -17,10 +17,10 @@
  */
 package de.thm.arsnova.entities.transport;
 
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Answer;
 import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.migration.v2.Session;
-import de.thm.arsnova.entities.User;
 
 /**
  * An answer that is about to get saved in the database. Answers are not saved immediately, they are instead stored
@@ -34,9 +34,9 @@ public class AnswerQueueElement {
 
 	private final Answer answer;
 
-	private final User user;
+	private final UserAuthentication user;
 
-	public AnswerQueueElement(Session session, Content content, Answer answer, User user) {
+	public AnswerQueueElement(Session session, Content content, Answer answer, UserAuthentication user) {
 		this.session = session;
 		this.content = content;
 		this.answer = answer;
@@ -55,7 +55,7 @@ public class AnswerQueueElement {
 		return answer;
 	}
 
-	public User getUser() {
+	public UserAuthentication getUser() {
 		return user;
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java b/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java
index 4cc735e2..552a6484 100644
--- a/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java
+++ b/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java
@@ -25,7 +25,7 @@ import de.thm.arsnova.entities.Motd;
 import de.thm.arsnova.entities.migration.v2.Session;
 import de.thm.arsnova.entities.migration.v2.SessionFeature;
 import de.thm.arsnova.entities.migration.v2.SessionInfo;
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.serialization.View;
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
@@ -134,7 +134,7 @@ public class ImportExportSession {
 		questions.add(ieq);
 	}
 
-	public Session generateSessionEntity(User user) {
+	public Session generateSessionEntity(UserAuthentication user) {
 		final Session s = new Session();
 		// import fields
 		s.setActive(session.isActive());
diff --git a/src/main/java/de/thm/arsnova/events/DeleteFeedbackForSessionsEvent.java b/src/main/java/de/thm/arsnova/events/DeleteFeedbackForSessionsEvent.java
index feb5aa8a..f1e5f569 100644
--- a/src/main/java/de/thm/arsnova/events/DeleteFeedbackForSessionsEvent.java
+++ b/src/main/java/de/thm/arsnova/events/DeleteFeedbackForSessionsEvent.java
@@ -17,8 +17,8 @@
  */
 package de.thm.arsnova.events;
 
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Session;
-import de.thm.arsnova.entities.User;
 
 import java.util.Set;
 
@@ -31,9 +31,9 @@ public class DeleteFeedbackForSessionsEvent extends ArsnovaEvent {
 
 	private final Set<Session> sessions;
 
-	private final User user;
+	private final UserAuthentication user;
 
-	public DeleteFeedbackForSessionsEvent(Object source, Set<Session> sessions, User user) {
+	public DeleteFeedbackForSessionsEvent(Object source, Set<Session> sessions, UserAuthentication user) {
 		super(source);
 		this.sessions = sessions;
 		this.user = user;
@@ -43,7 +43,7 @@ public class DeleteFeedbackForSessionsEvent extends ArsnovaEvent {
 		return sessions;
 	}
 
-	public User getUser() {
+	public UserAuthentication getUser() {
 		return user;
 	}
 
diff --git a/src/main/java/de/thm/arsnova/events/NewAnswerEvent.java b/src/main/java/de/thm/arsnova/events/NewAnswerEvent.java
index 7ed4f893..394fc2f9 100644
--- a/src/main/java/de/thm/arsnova/events/NewAnswerEvent.java
+++ b/src/main/java/de/thm/arsnova/events/NewAnswerEvent.java
@@ -17,10 +17,10 @@
  */
 package de.thm.arsnova.events;
 
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Answer;
 import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.migration.v2.Session;
-import de.thm.arsnova.entities.User;
 
 /**
  * Fires whenever a new answer is added.
@@ -31,11 +31,11 @@ public class NewAnswerEvent extends SessionEvent {
 
 	private final Answer answer;
 
-	private final User user;
+	private final UserAuthentication user;
 
 	private final Content content;
 
-	public NewAnswerEvent(Object source, Session session, Answer answer, User user, Content content) {
+	public NewAnswerEvent(Object source, Session session, Answer answer, UserAuthentication user, Content content) {
 		super(source, session);
 		this.answer = answer;
 		this.user = user;
@@ -51,7 +51,7 @@ public class NewAnswerEvent extends SessionEvent {
 		return answer;
 	}
 
-	public User getUser() {
+	public UserAuthentication getUser() {
 		return user;
 	}
 
diff --git a/src/main/java/de/thm/arsnova/persistance/AnswerRepository.java b/src/main/java/de/thm/arsnova/persistance/AnswerRepository.java
index 25fe4368..8c7ff531 100644
--- a/src/main/java/de/thm/arsnova/persistance/AnswerRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/AnswerRepository.java
@@ -17,20 +17,20 @@
  */
 package de.thm.arsnova.persistance;
 
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Answer;
-import de.thm.arsnova.entities.User;
 import org.springframework.data.repository.CrudRepository;
 
 import java.util.List;
 
 public interface AnswerRepository extends CrudRepository<Answer, String> {
-	Answer findByQuestionIdUserPiRound(String questionId, User user, int piRound);
+	Answer findByQuestionIdUserPiRound(String questionId, UserAuthentication user, int piRound);
 	List<Answer> findByContentIdPiRound(String contentId, int piRound);
 	List<Answer> findByContentId(String contentId);
 	int countByContentIdRound(String contentId, int round);
 	int countByContentId(String contentId);
 	List<Answer> findByContentId(String contentId, int start, int limit);
-	List<Answer> findByUserSessionId(User user, String sessionId);
+	List<Answer> findByUserSessionId(UserAuthentication user, String sessionId);
 	int countBySessionKey(String sessionKey);
 	int deleteByContentId(String contentId);
 	int countBySessionIdLectureVariant(String sessionId);
diff --git a/src/main/java/de/thm/arsnova/persistance/CommentRepository.java b/src/main/java/de/thm/arsnova/persistance/CommentRepository.java
index 8efb7240..228f50d3 100644
--- a/src/main/java/de/thm/arsnova/persistance/CommentRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/CommentRepository.java
@@ -1,8 +1,8 @@
 package de.thm.arsnova.persistance;
 
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Comment;
 import de.thm.arsnova.entities.migration.v2.CommentReadingCount;
-import de.thm.arsnova.entities.User;
 import org.springframework.data.repository.CrudRepository;
 
 import java.util.List;
@@ -10,10 +10,10 @@ import java.util.List;
 public interface CommentRepository extends CrudRepository<Comment, String> {
 	int countBySessionId(String sessionKey);
 	CommentReadingCount countReadingBySessionId(String sessionId);
-	CommentReadingCount countReadingBySessionIdAndUser(String sessionId, User user);
+	CommentReadingCount countReadingBySessionIdAndUser(String sessionId, UserAuthentication user);
 	List<Comment> findBySessionId(String sessionId, int start, int limit);
-	List<Comment> findBySessionIdAndUser(String sessionId, User user, int start, int limit);
+	List<Comment> findBySessionIdAndUser(String sessionId, UserAuthentication user, int start, int limit);
 	Comment findOne(String commentId);
 	int deleteBySessionId(String sessionId);
-	int deleteBySessionIdAndUser(String sessionId, User user);
+	int deleteBySessionIdAndUser(String sessionId, UserAuthentication user);
 }
diff --git a/src/main/java/de/thm/arsnova/persistance/ContentRepository.java b/src/main/java/de/thm/arsnova/persistance/ContentRepository.java
index 5e0113d1..e4363c34 100644
--- a/src/main/java/de/thm/arsnova/persistance/ContentRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/ContentRepository.java
@@ -1,7 +1,7 @@
 package de.thm.arsnova.persistance;
 
 import de.thm.arsnova.entities.migration.v2.Content;
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 import org.springframework.data.repository.CrudRepository;
 
 import java.util.List;
@@ -14,7 +14,7 @@ public interface ContentRepository extends CrudRepository<Content, String> {
 	List<String> findIdsBySessionId(String sessionId);
 	List<String> findIdsBySessionIdAndVariant(String sessionId, String variant);
 	int deleteBySessionId(String sessionId);
-	List<String> findUnansweredIdsBySessionIdAndUser(String sessionId, User user);
+	List<String> findUnansweredIdsBySessionIdAndUser(String sessionId, UserAuthentication user);
 	List<Content> findBySessionIdOnlyLectureVariantAndActive(String sessionId);
 	List<Content> findBySessionIdOnlyLectureVariant(String sessionId);
 	List<Content> findBySessionIdOnlyFlashcardVariantAndActive(String sessionId);
@@ -27,6 +27,6 @@ public interface ContentRepository extends CrudRepository<Content, String> {
 	int countPreparationVariantBySessionId(String sessionId);
 	List<String> findIdsBySessionIdAndVariantAndSubject(String sessionId, String questionVariant, String subject);
 	List<String> findSubjectsBySessionIdAndVariant(String sessionId, String questionVariant);
-	List<String> findUnansweredIdsBySessionIdAndUserOnlyLectureVariant(String sessionId, User user);
-	List<String> findUnansweredIdsBySessionIdAndUserOnlyPreparationVariant(String sessionId, User user);
+	List<String> findUnansweredIdsBySessionIdAndUserOnlyLectureVariant(String sessionId, UserAuthentication user);
+	List<String> findUnansweredIdsBySessionIdAndUserOnlyPreparationVariant(String sessionId, UserAuthentication user);
 }
diff --git a/src/main/java/de/thm/arsnova/persistance/MotdListRepository.java b/src/main/java/de/thm/arsnova/persistance/MotdListRepository.java
index 5b3a460f..a407c7ec 100644
--- a/src/main/java/de/thm/arsnova/persistance/MotdListRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/MotdListRepository.java
@@ -1,6 +1,6 @@
 package de.thm.arsnova.persistance;
 
-import de.thm.arsnova.entities.MotdList;
+import de.thm.arsnova.entities.migration.v2.MotdList;
 
 public interface MotdListRepository {
 	MotdList findByUsername(String username);
diff --git a/src/main/java/de/thm/arsnova/persistance/SessionRepository.java b/src/main/java/de/thm/arsnova/persistance/SessionRepository.java
index 5a1150ec..b7a4888b 100644
--- a/src/main/java/de/thm/arsnova/persistance/SessionRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/SessionRepository.java
@@ -18,10 +18,10 @@
 package de.thm.arsnova.persistance;
 
 import de.thm.arsnova.connector.model.Course;
-import de.thm.arsnova.entities.LoggedIn;
+import de.thm.arsnova.entities.migration.v2.LoggedIn;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Session;
 import de.thm.arsnova.entities.migration.v2.SessionInfo;
-import de.thm.arsnova.entities.User;
 import de.thm.arsnova.entities.transport.ImportExportSession;
 import org.springframework.data.repository.CrudRepository;
 
@@ -30,17 +30,17 @@ import java.util.List;
 public interface SessionRepository extends CrudRepository<Session, String> {
 	Session findByKeyword(String keyword);
 	List<Session> findInactiveGuestSessionsMetadata(long lastActivityBefore);
-	List<Session> findByUser(User user, int start, int limit);
+	List<Session> findByUser(UserAuthentication user, int start, int limit);
 	List<Session> findByUsername(String username, int start, int limit);
 	List<Session> findAllForPublicPool();
-	List<Session> findForPublicPoolByUser(User user);
+	List<Session> findForPublicPoolByUser(UserAuthentication user);
 	List<Session> findVisitedByUsername(String username, int start, int limit);
-	List<SessionInfo> getMySessionsInfo(User user, int start, int limit);
+	List<SessionInfo> getMySessionsInfo(UserAuthentication user, int start, int limit);
 	List<SessionInfo> findInfosForPublicPool();
-	List<SessionInfo> findInfosForPublicPoolByUser(User user);
-	List<SessionInfo> findInfoForVisitedByUser(User currentUser, int start, int limit);
+	List<SessionInfo> findInfosForPublicPoolByUser(UserAuthentication user);
+	List<SessionInfo> findInfoForVisitedByUser(UserAuthentication currentUser, int start, int limit);
 	List<Session> findSessionsByCourses(List<Course> courses);
-	SessionInfo importSession(User user, ImportExportSession importSession);
+	SessionInfo importSession(UserAuthentication user, ImportExportSession importSession);
 	ImportExportSession exportSession(String sessionkey, Boolean withAnswer, Boolean withFeedbackQuestions);
-	LoggedIn registerAsOnlineUser(User user, Session session);
+	LoggedIn registerAsOnlineUser(UserAuthentication user, Session session);
 }
diff --git a/src/main/java/de/thm/arsnova/persistance/UserRepository.java b/src/main/java/de/thm/arsnova/persistance/UserRepository.java
index c4480fac..8b9dde5a 100644
--- a/src/main/java/de/thm/arsnova/persistance/UserRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/UserRepository.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.persistance;
 
-import de.thm.arsnova.entities.DbUser;
+import de.thm.arsnova.entities.migration.v2.DbUser;
 import org.springframework.data.repository.CrudRepository;
 
 public interface UserRepository extends CrudRepository<DbUser, String> {
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbAnswerRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbAnswerRepository.java
index 6488e593..d63f4c06 100644
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbAnswerRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbAnswerRepository.java
@@ -2,8 +2,8 @@ package de.thm.arsnova.persistance.couchdb;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.collect.Lists;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Answer;
-import de.thm.arsnova.entities.User;
 import de.thm.arsnova.persistance.AnswerRepository;
 import de.thm.arsnova.persistance.LogEntryRepository;
 import org.ektorp.BulkDeleteDocument;
@@ -70,7 +70,7 @@ public class CouchDbAnswerRepository extends CouchDbCrudRepository<Answer> imple
 	}
 
 	@Override
-	public Answer findByQuestionIdUserPiRound(final String contentId, final User user, final int piRound) {
+	public Answer findByQuestionIdUserPiRound(final String contentId, final UserAuthentication user, final int piRound) {
 		final List<Answer> answerList = queryView("by_questionid_user_piround",
 				ComplexKey.of(contentId, user.getUsername(), piRound));
 		return answerList.isEmpty() ? null : answerList.get(0);
@@ -164,7 +164,7 @@ public class CouchDbAnswerRepository extends CouchDbCrudRepository<Answer> imple
 	}
 
 	@Override
-	public List<Answer> findByUserSessionId(final User user, final String sessionId) {
+	public List<Answer> findByUserSessionId(final UserAuthentication user, final String sessionId) {
 		return queryView("by_user_sessionid", ComplexKey.of(user.getUsername(), sessionId));
 	}
 
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbCommentRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbCommentRepository.java
index f8b878d7..3eb714da 100644
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbCommentRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbCommentRepository.java
@@ -1,9 +1,9 @@
 package de.thm.arsnova.persistance.couchdb;
 
 import com.fasterxml.jackson.databind.JsonNode;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Comment;
 import de.thm.arsnova.entities.migration.v2.CommentReadingCount;
-import de.thm.arsnova.entities.User;
 import de.thm.arsnova.persistance.CommentRepository;
 import de.thm.arsnova.persistance.LogEntryRepository;
 import org.ektorp.ComplexKey;
@@ -50,7 +50,7 @@ public class CouchDbCommentRepository extends CouchDbCrudRepository<Comment> imp
 	}
 
 	@Override
-	public CommentReadingCount countReadingBySessionIdAndUser(final String sessionId, final User user) {
+	public CommentReadingCount countReadingBySessionIdAndUser(final String sessionId, final UserAuthentication user) {
 		final ViewResult result = db.queryView(createQuery("by_sessionid_creator_read")
 				.startKey(ComplexKey.of(sessionId, user.getUsername()))
 				.endKey(ComplexKey.of(sessionId, user.getUsername(), ComplexKey.emptyObject()))
@@ -123,7 +123,7 @@ public class CouchDbCommentRepository extends CouchDbCrudRepository<Comment> imp
 	}
 
 	@Override
-	public List<Comment> findBySessionIdAndUser(final String sessionId, final User user, final int start, final int limit) {
+	public List<Comment> findBySessionIdAndUser(final String sessionId, final UserAuthentication user, final int start, final int limit) {
 		final int qSkip = start > 0 ? start : -1;
 		final int qLimit = limit > 0 ? limit : -1;
 
@@ -150,7 +150,7 @@ public class CouchDbCommentRepository extends CouchDbCrudRepository<Comment> imp
 	}
 
 	@Override
-	public int deleteBySessionIdAndUser(final String sessionId, final User user) {
+	public int deleteBySessionIdAndUser(final String sessionId, final UserAuthentication user) {
 		final ViewResult result = db.queryView(createQuery("by_sessionid_creator_read")
 				.startKey(ComplexKey.of(sessionId, user.getUsername()))
 				.endKey(ComplexKey.of(sessionId, user.getUsername(), ComplexKey.emptyObject())));
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbContentRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbContentRepository.java
index 85ae6921..119a6b05 100644
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbContentRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbContentRepository.java
@@ -1,7 +1,7 @@
 package de.thm.arsnova.persistance.couchdb;
 
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Content;
-import de.thm.arsnova.entities.User;
 import de.thm.arsnova.persistance.ContentRepository;
 import de.thm.arsnova.persistance.LogEntryRepository;
 import org.ektorp.BulkDeleteDocument;
@@ -90,7 +90,7 @@ public class CouchDbContentRepository extends CouchDbCrudRepository<Content> imp
 	}
 
 	@Override
-	public List<String> findUnansweredIdsBySessionIdAndUser(final String sessionId, final User user) {
+	public List<String> findUnansweredIdsBySessionIdAndUser(final String sessionId, final UserAuthentication user) {
 		final ViewResult result = db.queryView(createQuery("questionid_by_user_sessionid_variant")
 				.designDocId("_design/Answer")
 				.startKey(ComplexKey.of(user.getUsername(), sessionId))
@@ -103,7 +103,7 @@ public class CouchDbContentRepository extends CouchDbCrudRepository<Content> imp
 	}
 
 	@Override
-	public List<String> findUnansweredIdsBySessionIdAndUserOnlyLectureVariant(final String sessionId, final User user) {
+	public List<String> findUnansweredIdsBySessionIdAndUserOnlyLectureVariant(final String sessionId, final UserAuthentication user) {
 		final ViewResult result = db.queryView(createQuery("questionid_piround_by_user_sessionid_variant")
 				.designDocId("_design/Answer")
 				.key(ComplexKey.of(user.getUsername(), sessionId, "lecture")));
@@ -116,7 +116,7 @@ public class CouchDbContentRepository extends CouchDbCrudRepository<Content> imp
 	}
 
 	@Override
-	public List<String> findUnansweredIdsBySessionIdAndUserOnlyPreparationVariant(final String sessionId, final User user) {
+	public List<String> findUnansweredIdsBySessionIdAndUserOnlyPreparationVariant(final String sessionId, final UserAuthentication user) {
 		final ViewResult result = db.queryView(createQuery("questionid_piround_by_user_sessionid_variant")
 				.designDocId("_design/Answer")
 				.key(ComplexKey.of(user.getUsername(), sessionId, "preparation")));
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbMotdListRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbMotdListRepository.java
index 499013a8..dcdb8ead 100644
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbMotdListRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbMotdListRepository.java
@@ -1,6 +1,6 @@
 package de.thm.arsnova.persistance.couchdb;
 
-import de.thm.arsnova.entities.MotdList;
+import de.thm.arsnova.entities.migration.v2.MotdList;
 import de.thm.arsnova.persistance.MotdListRepository;
 import org.ektorp.CouchDbConnector;
 import org.ektorp.DbAccessException;
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbSessionRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbSessionRepository.java
index 29b948a8..99b211bc 100644
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbSessionRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbSessionRepository.java
@@ -18,12 +18,12 @@
 package de.thm.arsnova.persistance.couchdb;
 
 import de.thm.arsnova.connector.model.Course;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Comment;
-import de.thm.arsnova.entities.LoggedIn;
+import de.thm.arsnova.entities.migration.v2.LoggedIn;
 import de.thm.arsnova.entities.migration.v2.Session;
 import de.thm.arsnova.entities.migration.v2.SessionInfo;
-import de.thm.arsnova.entities.User;
-import de.thm.arsnova.entities.VisitedSession;
+import de.thm.arsnova.entities.migration.v2.VisitedSession;
 import de.thm.arsnova.entities.transport.ImportExportSession;
 import de.thm.arsnova.exceptions.NotFoundException;
 import de.thm.arsnova.persistance.LogEntryRepository;
@@ -144,7 +144,7 @@ public class CouchDbSessionRepository extends CouchDbCrudRepository<Session> imp
 	}
 
 	@Override
-	public List<SessionInfo> findInfoForVisitedByUser(final User user, final int start, final int limit) {
+	public List<SessionInfo> findInfoForVisitedByUser(final UserAuthentication user, final int start, final int limit) {
 		final List<Session> sessions = findVisitedByUsername(user.getUsername(), start, limit);
 		if (sessions.isEmpty()) {
 			return new ArrayList<>();
@@ -177,7 +177,7 @@ public class CouchDbSessionRepository extends CouchDbCrudRepository<Session> imp
 
 	/* TODO: Move to service layer. */
 	@Override
-	public SessionInfo importSession(final User user, final ImportExportSession importSession) {
+	public SessionInfo importSession(final UserAuthentication user, final ImportExportSession importSession) {
 		/* FIXME: not yet migrated - move to service layer */
 		throw new UnsupportedOperationException();
 //		final Session session = this.saveSession(user, importSession.generateSessionEntity(user));
@@ -338,7 +338,7 @@ public class CouchDbSessionRepository extends CouchDbCrudRepository<Session> imp
 	}
 
 	@Override
-	public List<Session> findByUser(final User user, final int start, final int limit) {
+	public List<Session> findByUser(final UserAuthentication user, final int start, final int limit) {
 		return findByUsername(user.getUsername(), start, limit);
 	}
 
@@ -371,7 +371,7 @@ public class CouchDbSessionRepository extends CouchDbCrudRepository<Session> imp
 	}
 
 	@Override
-	public List<Session> findForPublicPoolByUser(final User user) {
+	public List<Session> findForPublicPoolByUser(final UserAuthentication user) {
 		/* TODO: Only load IDs and check against cache for data. */
 		return db.queryView(
 				createQuery("partial_by_sessiontype_creator_name")
@@ -383,7 +383,7 @@ public class CouchDbSessionRepository extends CouchDbCrudRepository<Session> imp
 
 	/* TODO: Move to service layer. */
 	@Override
-	public List<SessionInfo> findInfosForPublicPoolByUser(final User user) {
+	public List<SessionInfo> findInfosForPublicPoolByUser(final UserAuthentication user) {
 		final List<Session> sessions = this.findForPublicPoolByUser(user);
 		if (sessions.isEmpty()) {
 			return new ArrayList<>();
@@ -393,7 +393,7 @@ public class CouchDbSessionRepository extends CouchDbCrudRepository<Session> imp
 
 	/* TODO: Move to service layer. */
 	@Override
-	public List<SessionInfo> getMySessionsInfo(final User user, final int start, final int limit) {
+	public List<SessionInfo> getMySessionsInfo(final UserAuthentication user, final int start, final int limit) {
 		final List<Session> sessions = this.findByUser(user, start, limit);
 		if (sessions.isEmpty()) {
 			return new ArrayList<>();
@@ -417,7 +417,7 @@ public class CouchDbSessionRepository extends CouchDbCrudRepository<Session> imp
 	}
 
 	/* TODO: Move to service layer. */
-	private List<SessionInfo> getInfosForVisitedSessions(final List<Session> sessions, final User user) {
+	private List<SessionInfo> getInfosForVisitedSessions(final List<Session> sessions, final UserAuthentication user) {
 		final ViewQuery answeredQuestionsView = createQuery("by_user_sessionid").designDocId("_design/Answer")
 				.keys(sessions.stream().map(session -> ComplexKey.of(user.getUsername(), session.getId())).collect(Collectors.toList()));
 		final ViewQuery contentIdsView = createQuery("by_sessionid").designDocId("_design/Content")
@@ -539,7 +539,7 @@ public class CouchDbSessionRepository extends CouchDbCrudRepository<Session> imp
 
 	/* TODO: Move to service layer. */
 	@Override
-	public LoggedIn registerAsOnlineUser(final User user, final Session session) {
+	public LoggedIn registerAsOnlineUser(final UserAuthentication user, final Session session) {
 		LoggedIn loggedIn = new LoggedIn();
 		try {
 			final List<LoggedIn> loggedInList = db.queryView(createQuery("all").designDocId("_design/LoggedIn").key(user.getUsername()), LoggedIn.class);
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbUserRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbUserRepository.java
index e2e5e913..328beee9 100644
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbUserRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbUserRepository.java
@@ -18,7 +18,7 @@
 package de.thm.arsnova.persistance.couchdb;
 
 import com.google.common.collect.Lists;
-import de.thm.arsnova.entities.DbUser;
+import de.thm.arsnova.entities.migration.v2.DbUser;
 import de.thm.arsnova.persistance.UserRepository;
 import org.ektorp.BulkDeleteDocument;
 import org.ektorp.CouchDbConnector;
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbVisitedSessionRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbVisitedSessionRepository.java
index a9bacfe2..82a76074 100644
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbVisitedSessionRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbVisitedSessionRepository.java
@@ -1,7 +1,7 @@
 package de.thm.arsnova.persistance.couchdb;
 
 import com.google.common.collect.Lists;
-import de.thm.arsnova.entities.VisitedSession;
+import de.thm.arsnova.entities.migration.v2.VisitedSession;
 import de.thm.arsnova.persistance.LogEntryRepository;
 import de.thm.arsnova.persistance.VisitedSessionRepository;
 import org.ektorp.BulkDeleteDocument;
diff --git a/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java b/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java
index e81cd011..fe14c9c1 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.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Comment;
 import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.migration.v2.Session;
-import de.thm.arsnova.entities.User;
 import de.thm.arsnova.persistance.CommentRepository;
 import de.thm.arsnova.persistance.ContentRepository;
 import de.thm.arsnova.persistance.SessionRepository;
@@ -176,18 +176,18 @@ public class ApplicationPermissionEvaluator implements PermissionEvaluator {
 		}
 
 		if (authentication instanceof Pac4jAuthenticationToken) {
-			User user = null;
+			UserAuthentication user = null;
 
 			final Pac4jAuthenticationToken token = (Pac4jAuthenticationToken) authentication;
 			if (token.getProfile() instanceof Google2Profile) {
 				final Google2Profile profile = (Google2Profile) token.getProfile();
-				user = new User(profile);
+				user = new UserAuthentication(profile);
 			} else if (token.getProfile() instanceof TwitterProfile) {
 				final TwitterProfile profile = (TwitterProfile) token.getProfile();
-				user = new User(profile);
+				user = new UserAuthentication(profile);
 			} else if (token.getProfile() instanceof FacebookProfile) {
 				final FacebookProfile profile = (FacebookProfile) token.getProfile();
-				user = new User(profile);
+				user = new UserAuthentication(profile);
 			}
 
 			if (user != null) {
diff --git a/src/main/java/de/thm/arsnova/security/DbUserDetailsService.java b/src/main/java/de/thm/arsnova/security/DbUserDetailsService.java
index 5351d98c..ac06be6e 100644
--- a/src/main/java/de/thm/arsnova/security/DbUserDetailsService.java
+++ b/src/main/java/de/thm/arsnova/security/DbUserDetailsService.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.security;
 
-import de.thm.arsnova.entities.DbUser;
+import de.thm.arsnova.entities.migration.v2.DbUser;
 import de.thm.arsnova.persistance.UserRepository;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/src/main/java/de/thm/arsnova/services/CommentService.java b/src/main/java/de/thm/arsnova/services/CommentService.java
index 1525981e..6039ae13 100644
--- a/src/main/java/de/thm/arsnova/services/CommentService.java
+++ b/src/main/java/de/thm/arsnova/services/CommentService.java
@@ -2,7 +2,7 @@ package de.thm.arsnova.services;
 
 import de.thm.arsnova.entities.migration.v2.Comment;
 import de.thm.arsnova.entities.migration.v2.CommentReadingCount;
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 
 import java.util.List;
 
@@ -17,7 +17,7 @@ public interface CommentService extends EntityService<Comment> {
 
 	Comment getAndMarkRead(String commentId);
 
-	Comment getAndMarkReadInternal(String commentId, User user);
+	Comment getAndMarkReadInternal(String commentId, UserAuthentication user);
 
 	void delete(String commentId);
 
diff --git a/src/main/java/de/thm/arsnova/services/CommentServiceImpl.java b/src/main/java/de/thm/arsnova/services/CommentServiceImpl.java
index c0fd1fbc..62141d4d 100644
--- a/src/main/java/de/thm/arsnova/services/CommentServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/services/CommentServiceImpl.java
@@ -1,9 +1,9 @@
 package de.thm.arsnova.services;
 
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Comment;
 import de.thm.arsnova.entities.migration.v2.CommentReadingCount;
 import de.thm.arsnova.entities.migration.v2.Session;
-import de.thm.arsnova.entities.User;
 import de.thm.arsnova.events.DeleteCommentEvent;
 import de.thm.arsnova.events.NewCommentEvent;
 import de.thm.arsnova.exceptions.ForbiddenException;
@@ -53,7 +53,7 @@ public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implem
 	@PreAuthorize("isAuthenticated()")
 	public boolean save(final Comment comment) {
 		final Session session = sessionRepository.findByKeyword(comment.getSessionId());
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		comment.setSessionId(session.getId());
 		comment.setCreator(user.getUsername());
 		comment.setRead(false);
@@ -91,7 +91,7 @@ public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implem
 		if (session == null) {
 			throw new UnauthorizedException();
 		}
-		final User user = getCurrentUser();
+		final UserAuthentication user = getCurrentUser();
 		if (session.isCreator(user)) {
 			commentRepository.deleteBySessionId(session.getId());
 		} else {
@@ -115,7 +115,7 @@ public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implem
 		if (username == null) {
 			return commentRepository.countReadingBySessionId(session.getId());
 		} else {
-			User currentUser = userService.getCurrentUser();
+			UserAuthentication currentUser = userService.getCurrentUser();
 			if (!currentUser.getUsername().equals(username)) {
 				throw new ForbiddenException();
 			}
@@ -128,7 +128,7 @@ public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implem
 	@PreAuthorize("isAuthenticated()")
 	public List<Comment> getBySessionKey(final String sessionKey, final int offset, final int limit) {
 		final Session session = this.getSession(sessionKey);
-		final User user = getCurrentUser();
+		final UserAuthentication user = getCurrentUser();
 		if (session.isCreator(user)) {
 			return commentRepository.findBySessionId(session.getId(), offset, limit);
 		} else {
@@ -139,7 +139,7 @@ public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implem
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public Comment getAndMarkRead(final String commentId) {
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		return this.getAndMarkReadInternal(commentId, user);
 	}
 
@@ -148,7 +148,7 @@ public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implem
 	 * TODO: Find a better way of doing this...
 	 */
 	@Override
-	public Comment getAndMarkReadInternal(final String commentId, User user) {
+	public Comment getAndMarkReadInternal(final String commentId, UserAuthentication user) {
 		final Comment comment = commentRepository.findOne(commentId);
 		if (comment == null) {
 			throw new NotFoundException();
@@ -164,8 +164,8 @@ public class CommentServiceImpl extends DefaultEntityServiceImpl<Comment> implem
 		return comment;
 	}
 
-	private User getCurrentUser() {
-		final User user = userService.getCurrentUser();
+	private UserAuthentication getCurrentUser() {
+		final UserAuthentication user = userService.getCurrentUser();
 		if (user == null) {
 			throw new UnauthorizedException();
 		}
diff --git a/src/main/java/de/thm/arsnova/services/ContentService.java b/src/main/java/de/thm/arsnova/services/ContentService.java
index b5891c2b..375aabad 100644
--- a/src/main/java/de/thm/arsnova/services/ContentService.java
+++ b/src/main/java/de/thm/arsnova/services/ContentService.java
@@ -17,9 +17,9 @@
  */
 package de.thm.arsnova.services;
 
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Answer;
 import de.thm.arsnova.entities.migration.v2.Content;
-import de.thm.arsnova.entities.User;
 
 import java.util.List;
 import java.util.Map;
@@ -38,7 +38,7 @@ public interface ContentService extends EntityService<Content> {
 
 	void delete(String questionId);
 
-	void startNewPiRound(String questionId, User user);
+	void startNewPiRound(String questionId, UserAuthentication user);
 
 	void startNewPiRoundDelayed(String questionId, int time);
 
@@ -52,7 +52,7 @@ public interface ContentService extends EntityService<Content> {
 
 	Answer getMyAnswer(String questionId);
 
-	void getFreetextAnswerAndMarkRead(String answerId, User user);
+	void getFreetextAnswerAndMarkRead(String answerId, UserAuthentication user);
 
 	List<Answer> getAnswers(String questionId, int piRound, int offset, int limit);
 
@@ -118,11 +118,11 @@ public interface ContentService extends EntityService<Content> {
 
 	List<String> getUnAnsweredLectureQuestionIds(String sessionkey);
 
-	List<String> getUnAnsweredLectureQuestionIds(String sessionKey, User user);
+	List<String> getUnAnsweredLectureQuestionIds(String sessionKey, UserAuthentication user);
 
 	List<String> getUnAnsweredPreparationQuestionIds(String sessionkey);
 
-	List<String> getUnAnsweredPreparationQuestionIds(String sessionKey, User user);
+	List<String> getUnAnsweredPreparationQuestionIds(String sessionKey, UserAuthentication user);
 
 	void publishAll(String sessionkey, boolean publish);
 
diff --git a/src/main/java/de/thm/arsnova/services/ContentServiceImpl.java b/src/main/java/de/thm/arsnova/services/ContentServiceImpl.java
index 3fc47c22..64b74496 100644
--- a/src/main/java/de/thm/arsnova/services/ContentServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/services/ContentServiceImpl.java
@@ -17,13 +17,13 @@
  */
 package de.thm.arsnova.services;
 
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.transport.AnswerQueueElement;
 import de.thm.arsnova.persistance.LogEntryRepository;
 import de.thm.arsnova.util.ImageUtils;
 import de.thm.arsnova.entities.migration.v2.Answer;
 import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.migration.v2.Session;
-import de.thm.arsnova.entities.User;
 import de.thm.arsnova.events.*;
 import de.thm.arsnova.exceptions.BadRequestException;
 import de.thm.arsnova.exceptions.NotFoundException;
@@ -179,7 +179,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 			@CacheEvict(value = "flashcardcontentlists", allEntries = true, condition = "#content.getQuestionVariant().equals('flashcard')") },
 			put = {@CachePut(value = "contents", key = "#content.id")})
 	public Content update(final Content content) {
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		final Content oldContent = contentRepository.findOne(content.getId());
 		if (null == oldContent) {
 			throw new NotFoundException();
@@ -217,7 +217,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	//@Cacheable("contentlists")
 	public List<Content> getBySessionKey(final String sessionkey) {
 		final Session session = getSession(sessionkey);
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		if (session.isCreator(user)) {
 			return contentRepository.findBySessionIdForSpeaker(session.getId());
 		} else {
@@ -351,7 +351,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 
 	@Override
 	@PreAuthorize("isAuthenticated() and hasPermission(#questionId, 'content', 'owner')")
-	public void startNewPiRound(final String questionId, User user) {
+	public void startNewPiRound(final String questionId, UserAuthentication user) {
 		final Content content = contentRepository.findOne(questionId);
 		final Session session = sessionRepository.findOne(content.getSessionId());
 
@@ -373,7 +373,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	@PreAuthorize("hasPermission(#questionId, 'content', 'owner')")
 	public void startNewPiRoundDelayed(final String questionId, final int time) {
 		final ContentService contentService = this;
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		final Content content = contentRepository.findOne(questionId);
 		final Session session = sessionRepository.findOne(content.getSessionId());
 
@@ -475,7 +475,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 			@CacheEvict(value = "preparationcontentlists", key = "#sessionId"),
 			@CacheEvict(value = "flashcardcontentlists", key = "#sessionId") })
 	public void setVotingAdmissions(final String sessionkey, final boolean disableVoting, List<Content> contents) {
-		final User user = getCurrentUser();
+		final UserAuthentication user = getCurrentUser();
 		final Session session = getSession(sessionkey);
 		if (!session.isCreator(user)) {
 			throw new UnauthorizedException();
@@ -497,7 +497,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public void setVotingAdmissionForAllQuestions(final String sessionkey, final boolean disableVoting) {
-		final User user = getCurrentUser();
+		final UserAuthentication user = getCurrentUser();
 		final Session session = getSession(sessionkey);
 		if (!session.isCreator(user)) {
 			throw new UnauthorizedException();
@@ -507,7 +507,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	}
 
 	private Session getSessionWithAuthCheck(final String sessionKeyword) {
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		final Session session = sessionRepository.findByKeyword(sessionKeyword);
 		if (user == null || session == null || !session.isCreator(user)) {
 			throw new UnauthorizedException();
@@ -527,13 +527,13 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public List<String> getUnAnsweredQuestionIds(final String sessionKey) {
-		final User user = getCurrentUser();
+		final UserAuthentication user = getCurrentUser();
 		final Session session = getSession(sessionKey);
 		return contentRepository.findUnansweredIdsBySessionIdAndUser(session.getId(), user);
 	}
 
-	private User getCurrentUser() {
-		final User user = userService.getCurrentUser();
+	private UserAuthentication getCurrentUser() {
+		final UserAuthentication user = userService.getCurrentUser();
 		if (user == null) {
 			throw new UnauthorizedException();
 		}
@@ -551,7 +551,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	}
 
 	@Override
-	public void getFreetextAnswerAndMarkRead(final String answerId, final User user) {
+	public void getFreetextAnswerAndMarkRead(final String answerId, final UserAuthentication user) {
 		final Answer answer = answerRepository.findOne(answerId);
 		if (answer == null) {
 			throw new NotFoundException();
@@ -713,7 +713,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	@PreAuthorize("isAuthenticated()")
 	@CacheEvict(value = "answerlists", key = "#contentId")
 	public Answer saveAnswer(final String contentId, final Answer answer) {
-		final User user = getCurrentUser();
+		final UserAuthentication user = getCurrentUser();
 		final Content content = get(contentId);
 		if (content == null) {
 			throw new NotFoundException();
@@ -752,7 +752,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	@PreAuthorize("isAuthenticated()")
 	@CacheEvict(value = "answerlists", allEntries = true)
 	public Answer updateAnswer(final Answer answer) {
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		final Answer realAnswer = this.getMyAnswer(answer.getQuestionId());
 		if (user == null || realAnswer == null || !user.getUsername().equals(realAnswer.getUser())) {
 			throw new UnauthorizedException();
@@ -781,7 +781,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 		if (content == null) {
 			throw new NotFoundException();
 		}
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		final Session session = sessionRepository.findOne(content.getSessionId());
 		if (user == null || session == null || !session.isCreator(user)) {
 			throw new UnauthorizedException();
@@ -797,7 +797,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	//@Cacheable("lecturecontentlists")
 	public List<Content> getLectureQuestions(final String sessionkey) {
 		final Session session = getSession(sessionkey);
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		if (session.isCreator(user)) {
 			return contentRepository.findBySessionIdOnlyLectureVariant(session.getId());
 		} else {
@@ -811,7 +811,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	//@Cacheable("flashcardcontentlists")
 	public List<Content> getFlashcards(final String sessionkey) {
 		final Session session = getSession(sessionkey);
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		if (session.isCreator(user)) {
 			return contentRepository.findBySessionIdOnlyFlashcardVariant(session.getId());
 		} else {
@@ -825,7 +825,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	//@Cacheable("preparationcontentlists")
 	public List<Content> getPreparationQuestions(final String sessionkey) {
 		final Session session = getSession(sessionkey);
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		if (session.isCreator(user)) {
 			return contentRepository.findBySessionIdOnlyPreparationVariant(session.getId());
 		} else {
@@ -929,12 +929,12 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public List<String> getUnAnsweredLectureQuestionIds(final String sessionkey) {
-		final User user = getCurrentUser();
+		final UserAuthentication user = getCurrentUser();
 		return this.getUnAnsweredLectureQuestionIds(sessionkey, user);
 	}
 
 	@Override
-	public List<String> getUnAnsweredLectureQuestionIds(final String sessionkey, final User user) {
+	public List<String> getUnAnsweredLectureQuestionIds(final String sessionkey, final UserAuthentication user) {
 		final Session session = getSession(sessionkey);
 		return contentRepository.findUnansweredIdsBySessionIdAndUserOnlyLectureVariant(session.getId(), user);
 	}
@@ -942,12 +942,12 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public List<String> getUnAnsweredPreparationQuestionIds(final String sessionkey) {
-		final User user = getCurrentUser();
+		final UserAuthentication user = getCurrentUser();
 		return this.getUnAnsweredPreparationQuestionIds(sessionkey, user);
 	}
 
 	@Override
-	public List<String> getUnAnsweredPreparationQuestionIds(final String sessionkey, final User user) {
+	public List<String> getUnAnsweredPreparationQuestionIds(final String sessionkey, final UserAuthentication user) {
 		final Session session = getSession(sessionkey);
 		return contentRepository.findUnansweredIdsBySessionIdAndUserOnlyPreparationVariant(session.getId(), user);
 	}
@@ -956,7 +956,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	@PreAuthorize("isAuthenticated()")
 	public void publishAll(final String sessionkey, final boolean publish) {
 		/* TODO: resolve redundancies */
-		final User user = getCurrentUser();
+		final UserAuthentication user = getCurrentUser();
 		final Session session = getSession(sessionkey);
 		if (!session.isCreator(user)) {
 			throw new UnauthorizedException();
@@ -973,7 +973,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 			@CacheEvict(value = "preparationcontentlists", key = "#sessionId"),
 			@CacheEvict(value = "flashcardcontentlists", key = "#sessionId") })
 	public void publishQuestions(final String sessionkey, final boolean publish, List<Content> contents) {
-		final User user = getCurrentUser();
+		final UserAuthentication user = getCurrentUser();
 		final Session session = getSession(sessionkey);
 		if (!session.isCreator(user)) {
 			throw new UnauthorizedException();
@@ -995,7 +995,7 @@ public class ContentServiceImpl extends DefaultEntityServiceImpl<Content> implem
 	@PreAuthorize("isAuthenticated()")
 	@CacheEvict(value = "answerlists", allEntries = true)
 	public void deleteAllQuestionsAnswers(final String sessionkey) {
-		final User user = getCurrentUser();
+		final UserAuthentication user = getCurrentUser();
 		final Session session = getSession(sessionkey);
 		if (!session.isCreator(user)) {
 			throw new UnauthorizedException();
diff --git a/src/main/java/de/thm/arsnova/services/FeedbackService.java b/src/main/java/de/thm/arsnova/services/FeedbackService.java
index efa40e16..9c7fc03f 100644
--- a/src/main/java/de/thm/arsnova/services/FeedbackService.java
+++ b/src/main/java/de/thm/arsnova/services/FeedbackService.java
@@ -18,7 +18,7 @@
 package de.thm.arsnova.services;
 
 import de.thm.arsnova.entities.Feedback;
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 
 /**
  * The functionality the feedback service should provide.
@@ -36,7 +36,7 @@ public interface FeedbackService {
 
 	long calculateRoundedAverageFeedback(String sessionkey);
 
-	boolean save(String keyword, int value, User user);
+	boolean save(String keyword, int value, UserAuthentication user);
 
-	Integer getBySessionKeyAndUser(String keyword, User user);
+	Integer getBySessionKeyAndUser(String keyword, UserAuthentication user);
 }
diff --git a/src/main/java/de/thm/arsnova/services/FeedbackServiceImpl.java b/src/main/java/de/thm/arsnova/services/FeedbackServiceImpl.java
index f00a068e..0ec0321e 100644
--- a/src/main/java/de/thm/arsnova/services/FeedbackServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/services/FeedbackServiceImpl.java
@@ -18,8 +18,8 @@
 package de.thm.arsnova.services;
 
 import de.thm.arsnova.entities.Feedback;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Session;
-import de.thm.arsnova.entities.User;
 import de.thm.arsnova.events.DeleteFeedbackForSessionsEvent;
 import de.thm.arsnova.events.NewFeedbackEvent;
 import de.thm.arsnova.exceptions.NoContentException;
@@ -66,18 +66,18 @@ public class FeedbackServiceImpl implements FeedbackService, ApplicationEventPub
 	@Override
 	@Scheduled(fixedDelay = DEFAULT_SCHEDULER_DELAY)
 	public void cleanFeedbackVotes() {
-		Map<Session, List<User>> deletedFeedbackOfUsersInSession = feedbackStorage.cleanVotes(cleanupFeedbackDelay);
+		Map<Session, List<UserAuthentication>> deletedFeedbackOfUsersInSession = feedbackStorage.cleanVotes(cleanupFeedbackDelay);
 		/*
 		 * mapping (Session -> 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<User, Set<Session>> affectedSessionsOfUsers = new HashMap<>();
+		final Map<UserAuthentication, Set<Session>> affectedSessionsOfUsers = new HashMap<>();
 
-		for (Map.Entry<Session, List<User>> entry : deletedFeedbackOfUsersInSession.entrySet()) {
+		for (Map.Entry<Session, List<UserAuthentication>> entry : deletedFeedbackOfUsersInSession.entrySet()) {
 			final Session session = entry.getKey();
-			final List<User> users = entry.getValue();
-			for (User user : users) {
+			final List<UserAuthentication> users = entry.getValue();
+			for (UserAuthentication user : users) {
 				Set<Session> affectedSessions;
 				if (affectedSessionsOfUsers.containsKey(user)) {
 					affectedSessions = affectedSessionsOfUsers.get(user);
@@ -89,8 +89,8 @@ public class FeedbackServiceImpl implements FeedbackService, ApplicationEventPub
 			}
 		}
 		// Send feedback reset event to all affected users
-		for (Map.Entry<User, Set<Session>> entry : affectedSessionsOfUsers.entrySet()) {
-			final User user = entry.getKey();
+		for (Map.Entry<UserAuthentication, Set<Session>> entry : affectedSessionsOfUsers.entrySet()) {
+			final UserAuthentication user = entry.getKey();
 			final Set<Session> arsSessions = entry.getValue();
 			this.publisher.publishEvent(new DeleteFeedbackForSessionsEvent(this, arsSessions, user));
 		}
@@ -103,12 +103,12 @@ public class FeedbackServiceImpl implements FeedbackService, ApplicationEventPub
 	@Override
 	public void cleanFeedbackVotesBySessionKey(final String keyword, final int cleanupFeedbackDelayInMins) {
 		final Session session = sessionRepository.findByKeyword(keyword);
-		List<User> affectedUsers = feedbackStorage.cleanVotesBySession(session, cleanupFeedbackDelayInMins);
+		List<UserAuthentication> affectedUsers = feedbackStorage.cleanVotesBySession(session, cleanupFeedbackDelayInMins);
 		Set<Session> sessionSet = new HashSet<>();
 		sessionSet.add(session);
 
 		// Send feedback reset event to all affected users
-		for (User user : affectedUsers) {
+		for (UserAuthentication user : affectedUsers) {
 			this.publisher.publishEvent(new DeleteFeedbackForSessionsEvent(this, sessionSet, user));
 		}
 		// send the new feedback to all clients in affected session
@@ -157,7 +157,7 @@ public class FeedbackServiceImpl implements FeedbackService, ApplicationEventPub
 	}
 
 	@Override
-	public boolean save(final String keyword, final int value, final User user) {
+	public boolean save(final String keyword, final int value, final UserAuthentication user) {
 		final Session session = sessionRepository.findByKeyword(keyword);
 		if (session == null) {
 			throw new NotFoundException();
@@ -169,7 +169,7 @@ public class FeedbackServiceImpl implements FeedbackService, ApplicationEventPub
 	}
 
 	@Override
-	public Integer getBySessionKeyAndUser(final String keyword, final User user) {
+	public Integer getBySessionKeyAndUser(final String keyword, final UserAuthentication user) {
 		final Session session = sessionRepository.findByKeyword(keyword);
 		if (session == null) {
 			throw new NotFoundException();
diff --git a/src/main/java/de/thm/arsnova/services/FeedbackStorageService.java b/src/main/java/de/thm/arsnova/services/FeedbackStorageService.java
index cd583989..4bef32e9 100644
--- a/src/main/java/de/thm/arsnova/services/FeedbackStorageService.java
+++ b/src/main/java/de/thm/arsnova/services/FeedbackStorageService.java
@@ -1,16 +1,16 @@
 package de.thm.arsnova.services;
 
 import de.thm.arsnova.entities.Feedback;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Session;
-import de.thm.arsnova.entities.User;
 
 import java.util.List;
 import java.util.Map;
 
 public interface FeedbackStorageService {
 	Feedback getBySession(Session session);
-	Integer getBySessionAndUser(Session session, User u);
-	void save(Session session, int value, User user);
-	Map<Session, List<User>> cleanVotes(int cleanupFeedbackDelay);
-	List<User> cleanVotesBySession(Session session, int cleanupFeedbackDelayInMins);
+	Integer getBySessionAndUser(Session session, UserAuthentication u);
+	void save(Session session, int value, UserAuthentication user);
+	Map<Session, List<UserAuthentication>> cleanVotes(int cleanupFeedbackDelay);
+	List<UserAuthentication> cleanVotesBySession(Session session, int cleanupFeedbackDelayInMins);
 }
diff --git a/src/main/java/de/thm/arsnova/services/FeedbackStorageServiceImpl.java b/src/main/java/de/thm/arsnova/services/FeedbackStorageServiceImpl.java
index 60c317f0..3fc58e30 100644
--- a/src/main/java/de/thm/arsnova/services/FeedbackStorageServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/services/FeedbackStorageServiceImpl.java
@@ -18,8 +18,8 @@
 package de.thm.arsnova.services;
 
 import de.thm.arsnova.entities.Feedback;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Session;
-import de.thm.arsnova.entities.User;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Isolation;
 import org.springframework.transaction.annotation.Transactional;
@@ -40,9 +40,9 @@ public class FeedbackStorageServiceImpl implements FeedbackStorageService {
 	private static class FeedbackStorageObject {
 		private final int value;
 		private final Date timestamp;
-		private final User user;
+		private final UserAuthentication user;
 
-		public FeedbackStorageObject(final int initValue, final User u) {
+		public FeedbackStorageObject(final int initValue, final UserAuthentication u) {
 			value = initValue;
 			timestamp = new Date();
 			user = u;
@@ -54,12 +54,12 @@ public class FeedbackStorageServiceImpl implements FeedbackStorageService {
 		public Date getTimestamp() {
 			return timestamp;
 		}
-		public boolean fromUser(final User u) {
+		public boolean fromUser(final UserAuthentication u) {
 			return user.equals(u);
 		}
 	}
 
-	private final Map<Session, Map<User, FeedbackStorageObject>> data =
+	private final Map<Session, Map<UserAuthentication, FeedbackStorageObject>> data =
 			new ConcurrentHashMap<>();
 
 	@Override
@@ -95,7 +95,7 @@ public class FeedbackStorageServiceImpl implements FeedbackStorageService {
 	}
 
 	@Override
-	public Integer getBySessionAndUser(final Session session, final User u) {
+	public Integer getBySessionAndUser(final Session session, final UserAuthentication u) {
 		if (data.get(session) == null) {
 			return null;
 		}
@@ -111,9 +111,9 @@ public class FeedbackStorageServiceImpl implements FeedbackStorageService {
 
 	@Override
 	@Transactional(isolation = Isolation.READ_COMMITTED)
-	public void save(final Session session, final int value, final User user) {
+	public void save(final Session session, final int value, final UserAuthentication user) {
 		if (data.get(session) == null) {
-			data.put(session, new ConcurrentHashMap<User, FeedbackStorageObject>());
+			data.put(session, new ConcurrentHashMap<UserAuthentication, FeedbackStorageObject>());
 		}
 
 		data.get(session).put(user, new FeedbackStorageObject(value, user));
@@ -121,11 +121,11 @@ public class FeedbackStorageServiceImpl implements FeedbackStorageService {
 
 	@Override
 	@Transactional(isolation = Isolation.READ_COMMITTED)
-	public Map<Session, List<User>> cleanVotes(final int cleanupFeedbackDelay) {
-		final Map<Session, List<User>> removedFeedbackOfUsersInSession = new HashMap<>();
+	public Map<Session, List<UserAuthentication>> cleanVotes(final int cleanupFeedbackDelay) {
+		final Map<Session, List<UserAuthentication>> removedFeedbackOfUsersInSession = new HashMap<>();
 		for (final Session session : data.keySet()) {
 			if (!session.getFeatures().isLiveClicker()) {
-				List<User> affectedUsers = cleanVotesBySession(session, cleanupFeedbackDelay);
+				List<UserAuthentication> affectedUsers = cleanVotesBySession(session, cleanupFeedbackDelay);
 				if (!affectedUsers.isEmpty()) {
 					removedFeedbackOfUsersInSession.put(session, affectedUsers);
 				}
@@ -136,17 +136,17 @@ public class FeedbackStorageServiceImpl implements FeedbackStorageService {
 
 	@Override
 	@Transactional(isolation = Isolation.READ_COMMITTED)
-	public List<User> cleanVotesBySession(final Session session, final int cleanupFeedbackDelayInMins) {
+	public List<UserAuthentication> cleanVotesBySession(final Session session, 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<User, FeedbackStorageObject> sessionFeedbacks = data.get(session);
-		final List<User> affectedUsers = new ArrayList<>();
+		final Map<UserAuthentication, FeedbackStorageObject> sessionFeedbacks = data.get(session);
+		final List<UserAuthentication> affectedUsers = new ArrayList<>();
 
 		if (sessionFeedbacks != null) {
-			for (final Map.Entry<User, FeedbackStorageObject> entry : sessionFeedbacks.entrySet()) {
-				final User user = entry.getKey();
+			for (final Map.Entry<UserAuthentication, FeedbackStorageObject> entry : sessionFeedbacks.entrySet()) {
+				final UserAuthentication user = entry.getKey();
 				final FeedbackStorageObject feedback = entry.getValue();
 				final boolean timeIsUp = feedback.getTimestamp().before(maxAllowedTime);
 				final boolean isAwayFeedback = getBySessionAndUser(session, user).equals(Feedback.FEEDBACK_AWAY);
diff --git a/src/main/java/de/thm/arsnova/services/MotdService.java b/src/main/java/de/thm/arsnova/services/MotdService.java
index 91303a43..221fc6e0 100644
--- a/src/main/java/de/thm/arsnova/services/MotdService.java
+++ b/src/main/java/de/thm/arsnova/services/MotdService.java
@@ -18,7 +18,7 @@
 package de.thm.arsnova.services;
 
 import de.thm.arsnova.entities.Motd;
-import de.thm.arsnova.entities.MotdList;
+import de.thm.arsnova.entities.migration.v2.MotdList;
 
 import java.util.Date;
 import java.util.List;
diff --git a/src/main/java/de/thm/arsnova/services/MotdServiceImpl.java b/src/main/java/de/thm/arsnova/services/MotdServiceImpl.java
index 35d524cf..9577c4fc 100644
--- a/src/main/java/de/thm/arsnova/services/MotdServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/services/MotdServiceImpl.java
@@ -18,9 +18,9 @@
 package de.thm.arsnova.services;
 
 import de.thm.arsnova.entities.Motd;
-import de.thm.arsnova.entities.MotdList;
+import de.thm.arsnova.entities.migration.v2.MotdList;
 import de.thm.arsnova.entities.migration.v2.Session;
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.exceptions.BadRequestException;
 import de.thm.arsnova.persistance.MotdListRepository;
 import de.thm.arsnova.persistance.MotdRepository;
@@ -199,7 +199,7 @@ public class MotdServiceImpl extends DefaultEntityServiceImpl<Motd> implements M
 	@PreAuthorize("isAuthenticated()")
 	@Cacheable(cacheNames = "motdlist", key = "#username")
 	public MotdList getMotdListByUsername(final String username) {
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		if (username.equals(user.getUsername()) && !"guest".equals(user.getType())) {
 			return motdListRepository.findByUsername(username);
 		}
@@ -210,7 +210,7 @@ public class MotdServiceImpl extends DefaultEntityServiceImpl<Motd> implements M
 	@PreAuthorize("isAuthenticated()")
 	@CachePut(cacheNames = "motdlist", key = "#motdList.username")
 	public MotdList saveMotdList(MotdList motdList) {
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		if (user.getUsername().equals(motdList.getUsername())) {
 			return motdListRepository.save(motdList);
 		}
@@ -220,7 +220,7 @@ public class MotdServiceImpl extends DefaultEntityServiceImpl<Motd> implements M
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public MotdList updateMotdList(MotdList motdList) {
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		if (user.getUsername().equals(motdList.getUsername())) {
 			return motdListRepository.save(motdList);
 		}
diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java
index b1a23210..8c0a9e3c 100644
--- a/src/main/java/de/thm/arsnova/services/SessionService.java
+++ b/src/main/java/de/thm/arsnova/services/SessionService.java
@@ -18,10 +18,10 @@
 package de.thm.arsnova.services;
 
 import de.thm.arsnova.connector.model.Course;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Session;
 import de.thm.arsnova.entities.migration.v2.SessionFeature;
 import de.thm.arsnova.entities.migration.v2.SessionInfo;
-import de.thm.arsnova.entities.User;
 import de.thm.arsnova.entities.transport.ImportExportSession;
 import de.thm.arsnova.entities.transport.ScoreStatistics;
 
@@ -36,7 +36,7 @@ public interface SessionService extends EntityService<Session> {
 
 	Session getForAdmin(final String keyword);
 
-	Session getInternal(String keyword, User user);
+	Session getInternal(String keyword, UserAuthentication user);
 
 	Session save(Session session);
 
@@ -64,7 +64,7 @@ public interface SessionService extends EntityService<Session> {
 
 	Session updateCreator(String sessionkey, String newCreator);
 
-	Session updateInternal(Session session, User user);
+	Session updateInternal(Session session, UserAuthentication user);
 
 	int[] deleteCascading(Session session);
 
diff --git a/src/main/java/de/thm/arsnova/services/SessionServiceImpl.java b/src/main/java/de/thm/arsnova/services/SessionServiceImpl.java
index 57f38432..28795bdf 100644
--- a/src/main/java/de/thm/arsnova/services/SessionServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/services/SessionServiceImpl.java
@@ -17,6 +17,7 @@
  */
 package de.thm.arsnova.services;
 
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.persistance.AnswerRepository;
 import de.thm.arsnova.persistance.CommentRepository;
 import de.thm.arsnova.persistance.ContentRepository;
@@ -30,7 +31,6 @@ import de.thm.arsnova.entities.ScoreOptions;
 import de.thm.arsnova.entities.migration.v2.Session;
 import de.thm.arsnova.entities.migration.v2.SessionFeature;
 import de.thm.arsnova.entities.migration.v2.SessionInfo;
-import de.thm.arsnova.entities.User;
 import de.thm.arsnova.entities.transport.ImportExportSession;
 import de.thm.arsnova.entities.transport.ScoreStatistics;
 import de.thm.arsnova.events.DeleteSessionEvent;
@@ -217,7 +217,7 @@ public class SessionServiceImpl extends DefaultEntityServiceImpl<Session> implem
 			userService.removeUserFromSessionBySocketId(socketId);
 			return null;
 		}
-		final User user = userService.getUser2SocketId(socketId);
+		final UserAuthentication user = userService.getUser2SocketId(socketId);
 
 		userService.addUserToSessionBySocketId(socketId, keyword);
 
@@ -257,7 +257,7 @@ public class SessionServiceImpl extends DefaultEntityServiceImpl<Session> implem
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public Session getByKey(final String keyword) {
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		return this.getInternal(keyword, user);
 	}
 
@@ -271,7 +271,7 @@ public class SessionServiceImpl extends DefaultEntityServiceImpl<Session> implem
 	 * TODO: Find a better way of doing this...
 	 */
 	@Override
-	public Session getInternal(final String keyword, final User user) {
+	public Session getInternal(final String keyword, final UserAuthentication user) {
 		final Session session = sessionRepository.findByKeyword(keyword);
 		if (session == null) {
 			throw new NotFoundException();
@@ -319,7 +319,7 @@ public class SessionServiceImpl extends DefaultEntityServiceImpl<Session> implem
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public List<SessionInfo> getMySessionsInfo(final int offset, final int limit) {
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		return sessionRepository.getMySessionsInfo(user, offset, limit);
 	}
 
@@ -470,7 +470,7 @@ public class SessionServiceImpl extends DefaultEntityServiceImpl<Session> implem
 	 * TODO: Find a better way of doing this...
 	 */
 	@Override
-	public Session updateInternal(final Session session, final User user) {
+	public Session updateInternal(final Session session, final UserAuthentication user) {
 		if (session.isCreator(user)) {
 			sessionRepository.save(session);
 			return session;
@@ -508,7 +508,7 @@ public class SessionServiceImpl extends DefaultEntityServiceImpl<Session> implem
 	@PreAuthorize("hasPermission(#sessionkey, 'session', 'read')")
 	public ScoreStatistics getMyLearningProgress(final String sessionkey, final String type, final String questionVariant) {
 		final Session session = sessionRepository.findByKeyword(sessionkey);
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		ScoreCalculator scoreCalculator = scoreCalculatorFactory.create(type, questionVariant);
 		return scoreCalculator.getMyProgress(session, user);
 	}
@@ -516,7 +516,7 @@ public class SessionServiceImpl extends DefaultEntityServiceImpl<Session> implem
 	@Override
 	@PreAuthorize("hasPermission('', 'session', 'create')")
 	public SessionInfo importSession(ImportExportSession importSession) {
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		final SessionInfo info = sessionRepository.importSession(user, importSession);
 		if (info == null) {
 			throw new NullPointerException("Could not import session.");
@@ -536,7 +536,7 @@ public class SessionServiceImpl extends DefaultEntityServiceImpl<Session> implem
 		ImportExportSession temp = sessionRepository.exportSession(sessionkey, false, false);
 		temp.getSession().setPublicPool(pp);
 		temp.getSession().setSessionType("public_pool");
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		return sessionRepository.importSession(user, temp);
 	}
 
@@ -555,7 +555,7 @@ public class SessionServiceImpl extends DefaultEntityServiceImpl<Session> implem
 	@PreAuthorize("hasPermission(#sessionkey, 'session', 'owner')")
 	public SessionFeature updateFeatures(String sessionkey, SessionFeature features) {
 		final Session session = sessionRepository.findByKeyword(sessionkey);
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		session.setFeatures(features);
 		this.publisher.publishEvent(new FeatureChangeEvent(this, session));
 		sessionRepository.save(session);
@@ -567,7 +567,7 @@ public class SessionServiceImpl extends DefaultEntityServiceImpl<Session> implem
 	@PreAuthorize("hasPermission(#sessionkey, 'session', 'owner')")
 	public boolean lockFeedbackInput(String sessionkey, Boolean lock) {
 		final Session session = sessionRepository.findByKeyword(sessionkey);
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		if (!lock) {
 			feedbackService.cleanFeedbackVotesBySessionKey(sessionkey, 0);
 		}
@@ -583,7 +583,7 @@ public class SessionServiceImpl extends DefaultEntityServiceImpl<Session> implem
 	@PreAuthorize("hasPermission(#sessionkey, 'session', 'owner')")
 	public boolean flipFlashcards(String sessionkey, Boolean flip) {
 		final Session session = sessionRepository.findByKeyword(sessionkey);
-		final User user = userService.getCurrentUser();
+		final UserAuthentication user = userService.getCurrentUser();
 		session.setFlipFlashcards(flip);
 		this.publisher.publishEvent(new FlipFlashcardsEvent(this, session));
 		sessionRepository.save(session);
diff --git a/src/main/java/de/thm/arsnova/services/UserService.java b/src/main/java/de/thm/arsnova/services/UserService.java
index d48a3bf3..2a082a82 100644
--- a/src/main/java/de/thm/arsnova/services/UserService.java
+++ b/src/main/java/de/thm/arsnova/services/UserService.java
@@ -17,8 +17,8 @@
  */
 package de.thm.arsnova.services;
 
-import de.thm.arsnova.entities.DbUser;
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
+import de.thm.arsnova.entities.migration.v2.DbUser;
 
 import java.util.Map;
 import java.util.Set;
@@ -28,23 +28,23 @@ import java.util.UUID;
  * The functionality the user service should provide.
  */
 public interface UserService {
-	User getCurrentUser();
+	UserAuthentication getCurrentUser();
 
 	boolean isBannedFromLogin(String addr);
 
 	void increaseFailedLoginCount(String addr);
 
-	User getUser2SocketId(UUID socketId);
+	UserAuthentication getUser2SocketId(UUID socketId);
 
-	void putUser2SocketId(UUID socketId, User user);
+	void putUser2SocketId(UUID socketId, UserAuthentication user);
 
 	void removeUser2SocketId(UUID socketId);
 
-	Set<Map.Entry<UUID, User>> socketId2User();
+	Set<Map.Entry<UUID, UserAuthentication>> socketId2User();
 
-	boolean isUserInSession(User user, String keyword);
+	boolean isUserInSession(UserAuthentication user, String keyword);
 
-	Set<User> getUsersBySessionKey(String keyword);
+	Set<UserAuthentication> getUsersBySessionKey(String keyword);
 
 	String getSessionByUsername(String username);
 
@@ -52,7 +52,7 @@ public interface UserService {
 
 	void removeUserFromSessionBySocketId(UUID socketId);
 
-	void removeUserFromMaps(User user);
+	void removeUserFromMaps(UserAuthentication user);
 
 	int loggedInUsers();
 
diff --git a/src/main/java/de/thm/arsnova/services/UserServiceImpl.java b/src/main/java/de/thm/arsnova/services/UserServiceImpl.java
index 2adce602..9fe87668 100644
--- a/src/main/java/de/thm/arsnova/services/UserServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/services/UserServiceImpl.java
@@ -18,8 +18,8 @@
 package de.thm.arsnova.services;
 
 import com.codahale.metrics.annotation.Gauge;
-import de.thm.arsnova.entities.DbUser;
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
+import de.thm.arsnova.entities.migration.v2.DbUser;
 import de.thm.arsnova.exceptions.BadRequestException;
 import de.thm.arsnova.exceptions.NotFoundException;
 import de.thm.arsnova.exceptions.UnauthorizedException;
@@ -89,10 +89,10 @@ public class UserServiceImpl implements UserService {
 
 	private static final Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
 
-	private static final ConcurrentHashMap<UUID, User> socketid2user = new ConcurrentHashMap<>();
+	private static final ConcurrentHashMap<UUID, UserAuthentication> socketid2user = new ConcurrentHashMap<>();
 
 	/* used for Socket.IO online check solution (new) */
-	private static final ConcurrentHashMap<User, String> user2session = new ConcurrentHashMap<>();
+	private static final ConcurrentHashMap<UserAuthentication, String> user2session = new ConcurrentHashMap<>();
 
 	private UserRepository userRepository;
 
@@ -178,29 +178,29 @@ public class UserServiceImpl implements UserService {
 	}
 
 	@Override
-	public User getCurrentUser() {
+	public UserAuthentication getCurrentUser() {
 		final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
 		if (authentication == null || authentication.getPrincipal() == null) {
 			return null;
 		}
 
-		User user = null;
+		UserAuthentication user = null;
 
 		if (authentication instanceof Pac4jAuthenticationToken) {
 			user = getOAuthUser(authentication);
 		} else if (authentication instanceof CasAuthenticationToken) {
 			final CasAuthenticationToken token = (CasAuthenticationToken) authentication;
-			user = new User(token.getAssertion().getPrincipal());
+			user = new UserAuthentication(token.getAssertion().getPrincipal());
 		} else if (authentication instanceof AnonymousAuthenticationToken) {
 			final AnonymousAuthenticationToken token = (AnonymousAuthenticationToken) authentication;
-			user = new User(token);
+			user = new UserAuthentication(token);
 		} else if (authentication instanceof UsernamePasswordAuthenticationToken) {
 			final UsernamePasswordAuthenticationToken token = (UsernamePasswordAuthenticationToken) authentication;
-			user = new User(token);
+			user = new UserAuthentication(token);
 			if (authentication.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_GUEST"))) {
-				user.setType(User.GUEST);
+				user.setType(UserAuthentication.GUEST);
 			} else if (authentication.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_DB_USER"))) {
-				user.setType(User.ARSNOVA);
+				user.setType(UserAuthentication.ARSNOVA);
 			}
 		}
 
@@ -213,18 +213,18 @@ public class UserServiceImpl implements UserService {
 		return user;
 	}
 
-	private User getOAuthUser(final Authentication authentication) {
-		User user = null;
+	private UserAuthentication getOAuthUser(final Authentication authentication) {
+		UserAuthentication user = null;
 		final Pac4jAuthenticationToken token = (Pac4jAuthenticationToken) authentication;
 		if (token.getProfile() instanceof Google2Profile) {
 			final Google2Profile profile = (Google2Profile) token.getProfile();
-			user = new User(profile);
+			user = new UserAuthentication(profile);
 		} else if (token.getProfile() instanceof TwitterProfile) {
 			final TwitterProfile profile = (TwitterProfile) token.getProfile();
-			user = new User(profile);
+			user = new UserAuthentication(profile);
 		} else if (token.getProfile() instanceof FacebookProfile) {
 			final FacebookProfile profile = (FacebookProfile) token.getProfile();
-			user = new User(profile);
+			user = new UserAuthentication(profile);
 		}
 		return user;
 	}
@@ -250,17 +250,17 @@ public class UserServiceImpl implements UserService {
 	}
 
 	@Override
-	public User getUser2SocketId(final UUID socketId) {
+	public UserAuthentication getUser2SocketId(final UUID socketId) {
 		return socketid2user.get(socketId);
 	}
 
 	@Override
-	public void putUser2SocketId(final UUID socketId, final User user) {
+	public void putUser2SocketId(final UUID socketId, final UserAuthentication user) {
 		socketid2user.put(socketId, user);
 	}
 
 	@Override
-	public Set<Map.Entry<UUID, User>> socketId2User() {
+	public Set<Map.Entry<UUID, UserAuthentication>> socketId2User() {
 		return socketid2user.entrySet();
 	}
 
@@ -270,7 +270,7 @@ public class UserServiceImpl implements UserService {
 	}
 
 	@Override
-	public boolean isUserInSession(final User user, final String keyword) {
+	public boolean isUserInSession(final UserAuthentication user, final String keyword) {
 		if (keyword == null) {
 			return false;
 		}
@@ -280,9 +280,9 @@ public class UserServiceImpl implements UserService {
 	}
 
 	@Override
-	public Set<User> getUsersBySessionKey(final String keyword) {
-		final Set<User> result = new HashSet<>();
-		for (final Entry<User, String> e : user2session.entrySet()) {
+	public Set<UserAuthentication> getUsersBySessionKey(final String keyword) {
+		final Set<UserAuthentication> result = new HashSet<>();
+		for (final Entry<UserAuthentication, String> e : user2session.entrySet()) {
 			if (e.getValue().equals(keyword)) {
 				result.add(e.getKey());
 			}
@@ -294,14 +294,14 @@ public class UserServiceImpl implements UserService {
 	@Override
 	@Transactional(isolation = Isolation.READ_COMMITTED)
 	public void addUserToSessionBySocketId(final UUID socketId, final String keyword) {
-		final User user = socketid2user.get(socketId);
+		final UserAuthentication user = socketid2user.get(socketId);
 		user2session.put(user, keyword);
 	}
 
 	@Override
 	@Transactional(isolation = Isolation.READ_COMMITTED)
 	public void removeUserFromSessionBySocketId(final UUID socketId) {
-		final User user = socketid2user.get(socketId);
+		final UserAuthentication user = socketid2user.get(socketId);
 		if (null == user) {
 			logger.warn("No user exists for socket {}.", socketId);
 
@@ -312,7 +312,7 @@ public class UserServiceImpl implements UserService {
 
 	@Override
 	public String getSessionByUsername(final String username) {
-		for (final Entry<User, String> entry  : user2session.entrySet()) {
+		for (final Entry<UserAuthentication, String> entry  : user2session.entrySet()) {
 			if (entry.getKey().getUsername().equals(username)) {
 				return entry.getValue();
 			}
@@ -327,7 +327,7 @@ public class UserServiceImpl implements UserService {
 	}
 
 	@Override
-	public void removeUserFromMaps(final User user) {
+	public void removeUserFromMaps(final UserAuthentication user) {
 		if (user != null) {
 			user2session.remove(user);
 		}
@@ -446,7 +446,7 @@ public class UserServiceImpl implements UserService {
 
 	@Override
 	public DbUser deleteByUsername(String username) {
-		User user = getCurrentUser();
+		UserAuthentication 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/services/UserSessionService.java b/src/main/java/de/thm/arsnova/services/UserSessionService.java
index d886e18a..557044b8 100644
--- a/src/main/java/de/thm/arsnova/services/UserSessionService.java
+++ b/src/main/java/de/thm/arsnova/services/UserSessionService.java
@@ -17,8 +17,8 @@
  */
 package de.thm.arsnova.services;
 
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Session;
-import de.thm.arsnova.entities.User;
 
 import java.util.UUID;
 
@@ -32,8 +32,8 @@ public interface UserSessionService {
 		SPEAKER
 	}
 
-	void setUser(User user);
-	User getUser();
+	void setUser(UserAuthentication user);
+	UserAuthentication getUser();
 
 	void setSession(Session session);
 	Session getSession();
diff --git a/src/main/java/de/thm/arsnova/services/UserSessionServiceImpl.java b/src/main/java/de/thm/arsnova/services/UserSessionServiceImpl.java
index eabca0c3..e1322349 100644
--- a/src/main/java/de/thm/arsnova/services/UserSessionServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/services/UserSessionServiceImpl.java
@@ -17,8 +17,8 @@
  */
 package de.thm.arsnova.services;
 
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Session;
-import de.thm.arsnova.entities.User;
 import org.springframework.context.annotation.Scope;
 import org.springframework.context.annotation.ScopedProxyMode;
 import org.springframework.stereotype.Component;
@@ -34,19 +34,19 @@ import java.util.UUID;
 public class UserSessionServiceImpl implements UserSessionService, Serializable {
 	private static final long serialVersionUID = 1L;
 
-	private User user;
+	private UserAuthentication user;
 	private Session session;
 	private UUID socketId;
 	private Role role;
 
 	@Override
-	public void setUser(final User u) {
+	public void setUser(final UserAuthentication u) {
 		user = u;
 		user.setRole(role);
 	}
 
 	@Override
-	public User getUser() {
+	public UserAuthentication getUser() {
 		return user;
 	}
 
diff --git a/src/main/java/de/thm/arsnova/services/score/QuestionBasedScoreCalculator.java b/src/main/java/de/thm/arsnova/services/score/QuestionBasedScoreCalculator.java
index 2e28d96b..8e0a4161 100644
--- a/src/main/java/de/thm/arsnova/services/score/QuestionBasedScoreCalculator.java
+++ b/src/main/java/de/thm/arsnova/services/score/QuestionBasedScoreCalculator.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.services.score;
 
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.transport.ScoreStatistics;
 import de.thm.arsnova.persistance.SessionStatisticsRepository;
 
@@ -71,7 +71,7 @@ public class QuestionBasedScoreCalculator extends VariantScoreCalculator {
 	}
 
 	@Override
-	protected ScoreStatistics createMyProgress(User user) {
+	protected ScoreStatistics createMyProgress(UserAuthentication user) {
 		final int numerator = numQuestionsCorrectForUser(user);
 		final int denominator = courseScore.getQuestionCount();
 		ScoreStatistics lpv = new ScoreStatistics();
@@ -84,7 +84,7 @@ public class QuestionBasedScoreCalculator extends VariantScoreCalculator {
 		return lpv;
 	}
 
-	private int numQuestionsCorrectForUser(User user) {
+	private int numQuestionsCorrectForUser(UserAuthentication user) {
 		int numQuestionsCorrect = 0;
 		for (QuestionScore questionScore : courseScore) {
 			numQuestionsCorrect += countCorrectAnswersForUser(user, questionScore);
@@ -92,7 +92,7 @@ public class QuestionBasedScoreCalculator extends VariantScoreCalculator {
 		return numQuestionsCorrect;
 	}
 
-	private int countCorrectAnswersForUser(User user, QuestionScore questionScore) {
+	private int countCorrectAnswersForUser(UserAuthentication user, QuestionScore questionScore) {
 		int numQuestionsCorrect = 0;
 		int requiredScore = questionScore.getMaximum();
 		for (UserScore userScore : questionScore) {
diff --git a/src/main/java/de/thm/arsnova/services/score/QuestionScore.java b/src/main/java/de/thm/arsnova/services/score/QuestionScore.java
index 88ecf31b..7480287e 100644
--- a/src/main/java/de/thm/arsnova/services/score/QuestionScore.java
+++ b/src/main/java/de/thm/arsnova/services/score/QuestionScore.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.services.score;
 
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 
 import java.util.ArrayList;
 import java.util.Iterator;
@@ -74,7 +74,7 @@ public class QuestionScore implements Iterable<UserScore> {
 		return totalScore;
 	}
 
-	public int getTotalUserScore(User user) {
+	public int getTotalUserScore(UserAuthentication user) {
 		int totalScore = 0;
 		for (UserScore score : userScores) {
 			if (score.isUser(user)) {
diff --git a/src/main/java/de/thm/arsnova/services/score/Score.java b/src/main/java/de/thm/arsnova/services/score/Score.java
index f7fdcb69..da4377bd 100644
--- a/src/main/java/de/thm/arsnova/services/score/Score.java
+++ b/src/main/java/de/thm/arsnova/services/score/Score.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.services.score;
 
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 
 import java.util.HashMap;
 import java.util.HashSet;
@@ -90,7 +90,7 @@ public class Score implements Iterable<QuestionScore> {
 		return score;
 	}
 
-	public double getTotalUserScore(User user) {
+	public double getTotalUserScore(UserAuthentication user) {
 		int score = 0;
 		for (QuestionScore questionScore : this) {
 			score += questionScore.getTotalUserScore(user);
diff --git a/src/main/java/de/thm/arsnova/services/score/ScoreBasedScoreCalculator.java b/src/main/java/de/thm/arsnova/services/score/ScoreBasedScoreCalculator.java
index 309c9bef..a444d3ec 100644
--- a/src/main/java/de/thm/arsnova/services/score/ScoreBasedScoreCalculator.java
+++ b/src/main/java/de/thm/arsnova/services/score/ScoreBasedScoreCalculator.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.services.score;
 
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.transport.ScoreStatistics;
 import de.thm.arsnova.persistance.SessionStatisticsRepository;
 
@@ -54,7 +54,7 @@ public class ScoreBasedScoreCalculator extends VariantScoreCalculator {
 	}
 
 	@Override
-	protected ScoreStatistics createMyProgress(User user) {
+	protected ScoreStatistics createMyProgress(UserAuthentication user) {
 		ScoreStatistics lpv = new ScoreStatistics();
 		lpv.setCourseProgress(coursePercentage());
 		lpv.setNumQuestions(courseScore.getQuestionCount());
@@ -65,7 +65,7 @@ public class ScoreBasedScoreCalculator extends VariantScoreCalculator {
 		return lpv;
 	}
 
-	private int myPercentage(User user) {
+	private int myPercentage(UserAuthentication user) {
 		final int courseMaximumValue = courseScore.getMaximumScore();
 		final double userTotalValue = courseScore.getTotalUserScore(user);
 		if (courseMaximumValue == 0) {
diff --git a/src/main/java/de/thm/arsnova/services/score/ScoreCalculator.java b/src/main/java/de/thm/arsnova/services/score/ScoreCalculator.java
index 6c39b62b..15760aba 100644
--- a/src/main/java/de/thm/arsnova/services/score/ScoreCalculator.java
+++ b/src/main/java/de/thm/arsnova/services/score/ScoreCalculator.java
@@ -18,7 +18,7 @@
 package de.thm.arsnova.services.score;
 
 import de.thm.arsnova.entities.migration.v2.Session;
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.transport.ScoreStatistics;
 
 /**
@@ -28,5 +28,5 @@ public interface ScoreCalculator {
 
 	ScoreStatistics getCourseProgress(Session session);
 
-	ScoreStatistics getMyProgress(Session session, User user);
+	ScoreStatistics getMyProgress(Session session, UserAuthentication user);
 }
diff --git a/src/main/java/de/thm/arsnova/services/score/UserScore.java b/src/main/java/de/thm/arsnova/services/score/UserScore.java
index 9a31de8e..d355bdce 100644
--- a/src/main/java/de/thm/arsnova/services/score/UserScore.java
+++ b/src/main/java/de/thm/arsnova/services/score/UserScore.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.services.score;
 
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 
 /**
  * The learning progress answer score of a particular user.
@@ -41,7 +41,7 @@ public class UserScore {
 		return score;
 	}
 
-	public boolean isUser(User user) {
+	public boolean isUser(UserAuthentication user) {
 		return user.getUsername().equals(username);
 	}
 
diff --git a/src/main/java/de/thm/arsnova/services/score/VariantScoreCalculator.java b/src/main/java/de/thm/arsnova/services/score/VariantScoreCalculator.java
index d32c6c72..79b2e846 100644
--- a/src/main/java/de/thm/arsnova/services/score/VariantScoreCalculator.java
+++ b/src/main/java/de/thm/arsnova/services/score/VariantScoreCalculator.java
@@ -18,7 +18,7 @@
 package de.thm.arsnova.services.score;
 
 import de.thm.arsnova.entities.migration.v2.Session;
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.transport.ScoreStatistics;
 import de.thm.arsnova.persistance.SessionStatisticsRepository;
 import org.springframework.cache.annotation.Cacheable;
@@ -61,7 +61,7 @@ abstract class VariantScoreCalculator implements ScoreCalculator {
 	protected abstract ScoreStatistics createCourseProgress();
 
 	@Override
-	public ScoreStatistics getMyProgress(Session session, User user) {
+	public ScoreStatistics getMyProgress(Session session, UserAuthentication user) {
 		this.refreshProgress(session);
 		this.filterVariant();
 		return this.createMyProgress(user);
@@ -73,6 +73,6 @@ abstract class VariantScoreCalculator implements ScoreCalculator {
 		}
 	}
 
-	protected abstract ScoreStatistics createMyProgress(User user);
+	protected abstract ScoreStatistics createMyProgress(UserAuthentication user);
 
 }
diff --git a/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java b/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java
index a4f840e1..3c7d40c2 100644
--- a/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java
+++ b/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java
@@ -28,9 +28,9 @@ 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.entities.UserAuthentication;
 import de.thm.arsnova.entities.migration.v2.Comment;
 import de.thm.arsnova.entities.ScoreOptions;
-import de.thm.arsnova.entities.User;
 import de.thm.arsnova.entities.migration.v2.SessionFeature;
 import de.thm.arsnova.events.*;
 import de.thm.arsnova.exceptions.NoContentException;
@@ -143,7 +143,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 			@Override
 			@Timed(name = "setFeedbackEvent.onData")
 			public void onData(final SocketIOClient client, final Feedback data, final AckRequest ackSender) {
-				final User u = userService.getUser2SocketId(client.getSessionId());
+				final UserAuthentication u = userService.getUser2SocketId(client.getSessionId());
 				if (u == null) {
 					logger.info("Client {} tried to send feedback but is not mapped to a user", client.getSessionId());
 
@@ -167,7 +167,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 			@Override
 			@Timed(name = "setSessionEvent.onData")
 			public void onData(final SocketIOClient client, final Session session, final AckRequest ackSender) {
-				final User u = userService.getUser2SocketId(client.getSessionId());
+				final UserAuthentication u = userService.getUser2SocketId(client.getSessionId());
 				if (null == u) {
 					logger.info("Client {} requested to join session but is not mapped to a user", client.getSessionId());
 
@@ -201,7 +201,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 					SocketIOClient client,
 					Comment comment,
 					AckRequest ackRequest) {
-				final User user = userService.getUser2SocketId(client.getSessionId());
+				final UserAuthentication user = userService.getUser2SocketId(client.getSessionId());
 				try {
 					commentService.getAndMarkReadInternal(comment.getId(), user);
 				} catch (NotFoundException | UnauthorizedException e) {
@@ -213,7 +213,7 @@ 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 User user = userService.getUser2SocketId(client.getSessionId());
+				final UserAuthentication user = userService.getUser2SocketId(client.getSessionId());
 				try {
 					contentService.getFreetextAnswerAndMarkRead(answerId, user);
 				} catch (NotFoundException | UnauthorizedException e) {
@@ -229,7 +229,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 			@Override
 			@Timed(name = "setLearningProgressOptionsEvent.onData")
 			public void onData(SocketIOClient client, ScoreOptions scoreOptions, AckRequest ack) {
-				final User user = userService.getUser2SocketId(client.getSessionId());
+				final UserAuthentication user = userService.getUser2SocketId(client.getSessionId());
 				final String sessionKey = userService.getSessionByUsername(user.getUsername());
 				final de.thm.arsnova.entities.migration.v2.Session session = sessionService.getInternal(sessionKey, user);
 				if (session.isCreator(user)) {
@@ -335,7 +335,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		this.useSSL = useSSL;
 	}
 
-	public void reportDeletedFeedback(final User user, final Set<de.thm.arsnova.entities.migration.v2.Session> arsSessions) {
+	public void reportDeletedFeedback(final UserAuthentication user, final Set<de.thm.arsnova.entities.migration.v2.Session> arsSessions) {
 		final List<String> keywords = new ArrayList<>();
 		for (final de.thm.arsnova.entities.migration.v2.Session session : arsSessions) {
 			keywords.add(session.getKeyword());
@@ -343,11 +343,11 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		this.sendToUser(user, "feedbackReset", keywords);
 	}
 
-	private List<UUID> findConnectionIdForUser(final User user) {
+	private List<UUID> findConnectionIdForUser(final UserAuthentication user) {
 		final List<UUID> result = new ArrayList<>();
-		for (final Entry<UUID, User> e : userService.socketId2User()) {
+		for (final Entry<UUID, UserAuthentication> e : userService.socketId2User()) {
 			final UUID someUsersConnectionId = e.getKey();
-			final User someUser = e.getValue();
+			final UserAuthentication someUser = e.getValue();
 			if (someUser.equals(user)) {
 				result.add(someUsersConnectionId);
 			}
@@ -355,7 +355,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		return result;
 	}
 
-	private void sendToUser(final User user, final String event, Object data) {
+	private void sendToUser(final UserAuthentication user, final String event, Object data) {
 		final List<UUID> connectionIds = findConnectionIdForUser(user);
 		if (connectionIds.isEmpty()) {
 			return;
@@ -371,7 +371,7 @@ 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 reportSessionDataToClient(final String sessionKey, final User user, final SocketIOClient client) {
+	public void reportSessionDataToClient(final String sessionKey, final UserAuthentication user, final SocketIOClient client) {
 		final de.thm.arsnova.entities.migration.v2.Session session = sessionService.getInternal(sessionKey, user);
 		final SessionFeature features = sessionService.getFeatures(sessionKey);
 
@@ -409,7 +409,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		}
 	}
 
-	public void reportFeedbackForUserInSession(final de.thm.arsnova.entities.migration.v2.Session session, final User user) {
+	public void reportFeedbackForUserInSession(final de.thm.arsnova.entities.migration.v2.Session session, final UserAuthentication user) {
 		final de.thm.arsnova.entities.Feedback fb = feedbackService.getBySessionKey(session.getKeyword());
 		Long averageFeedback;
 		try {
@@ -475,10 +475,10 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		 * all connected clients and if send feedback, if user is in current
 		 * session
 		 */
-		final Set<User> users = userService.getUsersBySessionKey(sessionKey);
+		final Set<UserAuthentication> users = userService.getUsersBySessionKey(sessionKey);
 
 		for (final SocketIOClient c : server.getAllClients()) {
-			final User u = userService.getUser2SocketId(c.getSessionId());
+			final UserAuthentication u = userService.getUser2SocketId(c.getSessionId());
 			if (u != null && users.contains(u)) {
 				c.sendEvent(eventName, data);
 			}
diff --git a/src/test/java/de/thm/arsnova/entities/TestUser.java b/src/test/java/de/thm/arsnova/entities/TestUser.java
index e92b37a2..959f1f16 100644
--- a/src/test/java/de/thm/arsnova/entities/TestUser.java
+++ b/src/test/java/de/thm/arsnova/entities/TestUser.java
@@ -19,7 +19,7 @@ package de.thm.arsnova.entities;
 
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 
-public class TestUser extends User {
+public class TestUser extends UserAuthentication {
 	private static final long serialVersionUID = 1L;
 
 	public TestUser(String username) {
diff --git a/src/test/java/de/thm/arsnova/services/StubUserService.java b/src/test/java/de/thm/arsnova/services/StubUserService.java
index 278f02b3..471d6fc9 100644
--- a/src/test/java/de/thm/arsnova/services/StubUserService.java
+++ b/src/test/java/de/thm/arsnova/services/StubUserService.java
@@ -17,14 +17,14 @@
  */
 package de.thm.arsnova.services;
 
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.persistance.UserRepository;
 import org.springframework.mail.javamail.JavaMailSender;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 
 public class StubUserService extends UserServiceImpl {
 
-	private User stubUser = null;
+	private UserAuthentication stubUser = null;
 
 	public StubUserService(UserRepository repository, JavaMailSender mailSender) {
 		super(repository, mailSender);
@@ -36,18 +36,18 @@ public class StubUserService extends UserServiceImpl {
 
 	public void setUserAuthenticated(boolean isAuthenticated, String username) {
 		if (isAuthenticated) {
-			stubUser = new User(new UsernamePasswordAuthenticationToken(username, "testpassword"));
+			stubUser = new UserAuthentication(new UsernamePasswordAuthenticationToken(username, "testpassword"));
 			return;
 		}
 		stubUser = null;
 	}
 
 	public void useAnonymousUser() {
-		stubUser = new User(new UsernamePasswordAuthenticationToken("anonymous", ""));
+		stubUser = new UserAuthentication(new UsernamePasswordAuthenticationToken("anonymous", ""));
 	}
 
 	@Override
-	public User getCurrentUser() {
+	public UserAuthentication getCurrentUser() {
 		return stubUser;
 	}
 
diff --git a/src/test/java/de/thm/arsnova/services/UserServiceTest.java b/src/test/java/de/thm/arsnova/services/UserServiceTest.java
index 9b1f4376..ba5b1e75 100644
--- a/src/test/java/de/thm/arsnova/services/UserServiceTest.java
+++ b/src/test/java/de/thm/arsnova/services/UserServiceTest.java
@@ -21,11 +21,10 @@ 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.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 import org.jasig.cas.client.authentication.AttributePrincipalImpl;
 import org.junit.Test;
 import org.junit.runner.RunWith;
-import org.pac4j.oauth.profile.JsonHelper;
 import org.pac4j.oauth.profile.google2.Google2Email;
 import org.pac4j.oauth.profile.google2.Google2Profile;
 import org.pac4j.oauth.profile.google2.Google2ProfileDefinition;
@@ -57,13 +56,13 @@ import static org.junit.Assert.assertEquals;
 @ActiveProfiles("test")
 public class UserServiceTest {
 
-	private static final ConcurrentHashMap<UUID, User> socketid2user = new ConcurrentHashMap<>();
+	private static final ConcurrentHashMap<UUID, UserAuthentication> socketid2user = new ConcurrentHashMap<>();
 	private static final ConcurrentHashMap<String, String> user2session = new ConcurrentHashMap<>();
 
 	@Test
 	public void testSocket2UserPersistence() throws IOException, ClassNotFoundException {
-		socketid2user.put(UUID.randomUUID(), new User(new UsernamePasswordAuthenticationToken("ptsr00", UUID.randomUUID())));
-		socketid2user.put(UUID.randomUUID(), new User(new AttributePrincipalImpl("ptstr0")));
+		socketid2user.put(UUID.randomUUID(), new UserAuthentication(new UsernamePasswordAuthenticationToken("ptsr00", UUID.randomUUID())));
+		socketid2user.put(UUID.randomUUID(), new UserAuthentication(new AttributePrincipalImpl("ptstr0")));
 
 		Google2Email email = new Google2Email();
 		email.setEmail("mail@host.com");
@@ -73,17 +72,17 @@ public class UserServiceTest {
 		profile.addAttribute(Google2ProfileDefinition.DISPLAY_NAME, "ptsr00");
 		profile.addAttribute(Google2ProfileDefinition.EMAILS, emails);
 
-		socketid2user.put(UUID.randomUUID(), new User(profile));
+		socketid2user.put(UUID.randomUUID(), new UserAuthentication(profile));
 		List<GrantedAuthority> authorities = new ArrayList<>();
 		authorities.add(new SimpleGrantedAuthority("ROLE_GUEST"));
-		socketid2user.put(UUID.randomUUID(), new User(new AnonymousAuthenticationToken("ptsr00", UUID.randomUUID(), authorities)));
+		socketid2user.put(UUID.randomUUID(), new UserAuthentication(new AnonymousAuthenticationToken("ptsr00", UUID.randomUUID(), authorities)));
 
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
 		ObjectOutputStream objOut = new ObjectOutputStream(out);
 		objOut.writeObject(socketid2user);
 		objOut.close();
 		ObjectInputStream objIn = new ObjectInputStream(new ByteArrayInputStream(out.toByteArray()));
-		Map<UUID, User> actual = (Map<UUID, User>) objIn.readObject();
+		Map<UUID, UserAuthentication> actual = (Map<UUID, UserAuthentication>) objIn.readObject();
 		assertEquals(actual, socketid2user);
 	}
 
diff --git a/src/test/java/de/thm/arsnova/services/score/QuestionBasedScoreCalculatorTest.java b/src/test/java/de/thm/arsnova/services/score/QuestionBasedScoreCalculatorTest.java
index d46874fc..9e77a20b 100644
--- a/src/test/java/de/thm/arsnova/services/score/QuestionBasedScoreCalculatorTest.java
+++ b/src/test/java/de/thm/arsnova/services/score/QuestionBasedScoreCalculatorTest.java
@@ -18,12 +18,9 @@
 package de.thm.arsnova.services.score;
 
 import de.thm.arsnova.entities.TestUser;
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.transport.ScoreStatistics;
 import de.thm.arsnova.persistance.SessionStatisticsRepository;
-import de.thm.arsnova.services.score.QuestionBasedScoreCalculator;
-import de.thm.arsnova.services.score.Score;
-import de.thm.arsnova.services.score.VariantScoreCalculator;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -45,7 +42,7 @@ public class QuestionBasedScoreCalculatorTest {
 		return questionId;
 	}
 
-	private void addAnswer(String questionId, User user, int points) {
+	private void addAnswer(String questionId, UserAuthentication user, int points) {
 		final int piRound = 1;
 		courseScore.addAnswer(questionId, piRound, user.getUsername(), points);
 	}
@@ -65,7 +62,7 @@ public class QuestionBasedScoreCalculatorTest {
 	public void shouldIgnoreQuestionsWithoutCorrectAnswers() {
 		final int questionMaxValue = 0;
 		final int userScore = 0;
-		User user = new TestUser("username");
+		UserAuthentication user = new TestUser("username");
 		String questionId = this.addQuestion("lecture", questionMaxValue);
 		this.addAnswer(questionId, user, userScore);
 
@@ -80,7 +77,7 @@ public class QuestionBasedScoreCalculatorTest {
 
 	@Test
 	public void shouldIgnoreQuestionsWithoutCorrectAnswersInQuestionCount() {
-		User user = new TestUser("username");
+		UserAuthentication user = new TestUser("username");
 		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);
@@ -123,8 +120,8 @@ public class QuestionBasedScoreCalculatorTest {
 		String q1 = this.addQuestion("lecture", 10);
 		String q2 = this.addQuestion("lecture", 10);
 		// two users
-		User u1 = new TestUser("user1");
-		User u2 = new TestUser("user2");
+		UserAuthentication u1 = new TestUser("user1");
+		UserAuthentication u2 = new TestUser("user2");
 		// four answers, last one is wrong
 		this.addAnswer(q1, u1, 10);
 		this.addAnswer(q1, u2, 10);
@@ -159,8 +156,8 @@ public class QuestionBasedScoreCalculatorTest {
 	public void shouldFilterBasedOnQuestionVariant() {
 		String q1 = this.addQuestion("lecture", 100);
 		String q2 = this.addQuestion("preparation", 100);
-		User u1 = new TestUser("user1");
-		User u2 = new TestUser("user2");
+		UserAuthentication u1 = new TestUser("user1");
+		UserAuthentication u2 = new TestUser("user2");
 		// first question is answered correctly, second one is not
 		this.addAnswer(q1, u1, 100);
 		this.addAnswer(q1, u2, 100);
@@ -182,8 +179,8 @@ public class QuestionBasedScoreCalculatorTest {
 
 	@Test
 	public void shouldConsiderAnswersOfSamePiRound() {
-		User u1 = new TestUser("user1");
-		User u2 = new TestUser("user2");
+		UserAuthentication u1 = new TestUser("user1");
+		UserAuthentication u2 = new TestUser("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
@@ -209,9 +206,9 @@ public class QuestionBasedScoreCalculatorTest {
 		String q1 = this.addQuestion("lecture", 10);
 		String q2 = this.addQuestion("lecture", 10);
 		// three users
-		User u1 = new TestUser("user1");
-		User u2 = new TestUser("user2");
-		User u3 = new TestUser("user3");
+		UserAuthentication u1 = new TestUser("user1");
+		UserAuthentication u2 = new TestUser("user2");
+		UserAuthentication u3 = new TestUser("user3");
 		// six answers
 		this.addAnswer(q1, u1, 10);
 		this.addAnswer(q2, u1, -100);
diff --git a/src/test/java/de/thm/arsnova/services/score/ScoreBasedScoreCalculatorTest.java b/src/test/java/de/thm/arsnova/services/score/ScoreBasedScoreCalculatorTest.java
index 0909300b..673a79ea 100644
--- a/src/test/java/de/thm/arsnova/services/score/ScoreBasedScoreCalculatorTest.java
+++ b/src/test/java/de/thm/arsnova/services/score/ScoreBasedScoreCalculatorTest.java
@@ -18,12 +18,9 @@
 package de.thm.arsnova.services.score;
 
 import de.thm.arsnova.entities.TestUser;
-import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.transport.ScoreStatistics;
 import de.thm.arsnova.persistance.SessionStatisticsRepository;
-import de.thm.arsnova.services.score.Score;
-import de.thm.arsnova.services.score.ScoreBasedScoreCalculator;
-import de.thm.arsnova.services.score.VariantScoreCalculator;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -45,7 +42,7 @@ public class ScoreBasedScoreCalculatorTest {
 		return questionId;
 	}
 
-	private void addAnswer(String questionId, User user, int points) {
+	private void addAnswer(String questionId, UserAuthentication user, int points) {
 		final int piRound = 1;
 		courseScore.addAnswer(questionId, piRound, user.getUsername(), points);
 	}
@@ -62,8 +59,8 @@ public class ScoreBasedScoreCalculatorTest {
 	public void shouldFilterBasedOnQuestionVariant() {
 		String q1 = this.addQuestion("lecture", 100);
 		String q2 = this.addQuestion("preparation", 100);
-		User u1 = new TestUser("user1");
-		User u2 = new TestUser("user2");
+		UserAuthentication u1 = new TestUser("user1");
+		UserAuthentication u2 = new TestUser("user2");
 		// first question is answered correctly, second one is not
 		this.addAnswer(q1, u1, 100);
 		this.addAnswer(q1, u2, 100);
@@ -89,8 +86,8 @@ public class ScoreBasedScoreCalculatorTest {
 		String q1 = this.addQuestion("lecture", 100);
 		String q2 = this.addQuestion("lecture", 100);
 		String q3 = this.addQuestion("lecture", 100);
-		User u1 = new TestUser("user1");
-		User u2 = new TestUser("user2");
+		UserAuthentication u1 = new TestUser("user1");
+		UserAuthentication u2 = new TestUser("user2");
 		// Both users achieve 200 points
 		this.addAnswer(q1, u1, 100);
 		this.addAnswer(q1, u2, 100);
@@ -108,8 +105,8 @@ public class ScoreBasedScoreCalculatorTest {
 
 	@Test
 	public void shouldConsiderAnswersOfSamePiRound() {
-		User u1 = new TestUser("user1");
-		User u2 = new TestUser("user2");
+		UserAuthentication u1 = new TestUser("user1");
+		UserAuthentication u2 = new TestUser("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
@@ -135,9 +132,9 @@ public class ScoreBasedScoreCalculatorTest {
 		String q1 = this.addQuestion("lecture", 10);
 		String q2 = this.addQuestion("lecture", 10);
 		// three users
-		User u1 = new TestUser("user1");
-		User u2 = new TestUser("user2");
-		User u3 = new TestUser("user3");
+		UserAuthentication u1 = new TestUser("user1");
+		UserAuthentication u2 = new TestUser("user2");
+		UserAuthentication u3 = new TestUser("user3");
 		// six answers
 		this.addAnswer(q1, u1, 10);
 		this.addAnswer(q2, u1, 0);
-- 
GitLab