From 85cedefb6c5f3cc502775e243153401f65d4d0b9 Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <code@dgerhardt.net>
Date: Tue, 19 Sep 2017 14:47:14 +0200
Subject: [PATCH] Add additional entities and entity properties for API v3

Introduced content groups which replace question variants and support
sorting.
---
 .../java/de/thm/arsnova/entities/Answer.java  |  45 +++
 .../arsnova/entities/AnswerStatistics.java    |  95 ++++++
 .../java/de/thm/arsnova/entities/Comment.java |  20 +-
 .../java/de/thm/arsnova/entities/Content.java | 113 ++++++-
 .../de/thm/arsnova/entities/Feedback.java     |   2 +-
 .../de/thm/arsnova/entities/LogEntry.java     |  18 +-
 .../thm/arsnova/entities/MigrationState.java  |  84 +++++
 .../java/de/thm/arsnova/entities/Motd.java    |   8 +-
 .../java/de/thm/arsnova/entities/Room.java    | 290 ++++++++++++++++++
 .../thm/arsnova/entities/RoomStatistics.java  |  19 +-
 .../de/thm/arsnova/entities/ScoreOptions.java |   6 +-
 .../arsnova/entities/ServiceDescription.java  |  18 +-
 .../de/thm/arsnova/entities/Statistics.java   |  10 +-
 .../de/thm/arsnova/entities/TextAnswer.java   |  28 +-
 .../arsnova/entities/UserAuthentication.java  |  31 +-
 .../de/thm/arsnova/entities/UserProfile.java  |  67 ++--
 .../entities/migration/FromV2Migrator.java    |  17 +-
 .../entities/migration/ToV2Migrator.java      |   4 +-
 18 files changed, 783 insertions(+), 92 deletions(-)
 create mode 100644 src/main/java/de/thm/arsnova/entities/AnswerStatistics.java
 create mode 100644 src/main/java/de/thm/arsnova/entities/MigrationState.java

diff --git a/src/main/java/de/thm/arsnova/entities/Answer.java b/src/main/java/de/thm/arsnova/entities/Answer.java
index fc2fd9acb..f564ff3cb 100644
--- a/src/main/java/de/thm/arsnova/entities/Answer.java
+++ b/src/main/java/de/thm/arsnova/entities/Answer.java
@@ -3,10 +3,16 @@ package de.thm.arsnova.entities;
 import com.fasterxml.jackson.annotation.JsonView;
 import de.thm.arsnova.entities.serialization.View;
 
+import java.util.Map;
+
 public abstract class Answer implements Entity {
 	private String id;
 	private String rev;
 	private String contentId;
+	private String roomId;
+	private String creatorId;
+	private int round;
+	private Map<String, Map<String, ?>> extensions;
 
 	@Override
 	@JsonView({View.Persistence.class, View.Public.class})
@@ -41,4 +47,43 @@ public abstract class Answer implements Entity {
 	public void setContentId(final String contentId) {
 		this.contentId = contentId;
 	}
+
+	@JsonView(View.Persistence.class)
+	public String getRoomId() {
+		return roomId;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setRoomId(String roomId) {
+		this.roomId = roomId;
+	}
+
+	@JsonView(View.Persistence.class)
+	public String getCreatorId() {
+		return creatorId;
+	}
+
+	public void setCreatorId(final String creatorId) {
+		this.creatorId = creatorId;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getRound() {
+		return round;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setRound(final int round) {
+		this.round = round;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public Map<String, Map<String, ?>> getExtensions() {
+		return extensions;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setExtensions(Map<String, Map<String, ?>> extensions) {
+		this.extensions = extensions;
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/entities/AnswerStatistics.java b/src/main/java/de/thm/arsnova/entities/AnswerStatistics.java
new file mode 100644
index 000000000..17bfd208d
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/entities/AnswerStatistics.java
@@ -0,0 +1,95 @@
+package de.thm.arsnova.entities;
+
+import com.fasterxml.jackson.annotation.JsonView;
+import de.thm.arsnova.entities.serialization.View;
+
+import java.util.List;
+
+public class AnswerStatistics {
+	public class RoundStatistics {
+		public class Combination {
+			private int[] selectedChoiceIndexes;
+			private int count;
+		}
+
+		private int round;
+		private int[] independentCounts;
+		private List<Combination> combinatedCounts;
+		private int abstentionCount;
+
+		@JsonView(View.Public.class)
+		public int getRound() {
+			return round;
+		}
+
+		public void setRound(int round) {
+			this.round = round;
+		}
+
+		@JsonView(View.Public.class)
+		public int[] getIndependentCounts() {
+			return independentCounts;
+		}
+
+		public void setIndependentCounts(final int[] independentCounts) {
+			this.independentCounts = independentCounts;
+		}
+
+		@JsonView(View.Public.class)
+		public List<Combination> getCombinatedCounts() {
+			return combinatedCounts;
+		}
+
+		public void setCombinatedCounts(List<Combination> combinatedCounts) {
+			this.combinatedCounts = combinatedCounts;
+		}
+
+		@JsonView(View.Public.class)
+		public int getAbstentionCount() {
+			return abstentionCount;
+		}
+
+		public void setAbstentionCount(int abstentionCount) {
+			this.abstentionCount = abstentionCount;
+		}
+	}
+
+	public class RoundTransition {
+		private int roundA;
+		private int roundB;
+		private int[] selectedChoiceIndexesA;
+		private int[] selectedChoiceIndexesB;
+		private int count;
+	}
+
+	private String contentId;
+	private List<RoundStatistics> roundStatistics;
+	private List<RoundTransition> roundTransitions;
+
+	@JsonView(View.Public.class)
+	public String getContentId() {
+		return contentId;
+	}
+
+	public void setContentId(final String contentId) {
+		this.contentId = contentId;
+	}
+
+	@JsonView(View.Public.class)
+	public List<RoundStatistics> getRoundStatistics() {
+		return roundStatistics;
+	}
+
+	public void setRoundStatistics(List<RoundStatistics> roundStatistics) {
+		this.roundStatistics = roundStatistics;
+	}
+
+	@JsonView(View.Public.class)
+	public List<RoundTransition> getRoundTransitions() {
+		return roundTransitions;
+	}
+
+	public void setRoundTransitions(List<RoundTransition> roundTransitions) {
+		this.roundTransitions = roundTransitions;
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/entities/Comment.java b/src/main/java/de/thm/arsnova/entities/Comment.java
index 4d692bce7..976691b03 100644
--- a/src/main/java/de/thm/arsnova/entities/Comment.java
+++ b/src/main/java/de/thm/arsnova/entities/Comment.java
@@ -3,6 +3,9 @@ package de.thm.arsnova.entities;
 import com.fasterxml.jackson.annotation.JsonView;
 import de.thm.arsnova.entities.serialization.View;
 
+import java.util.Date;
+import java.util.Map;
+
 public class Comment implements Entity {
 	private String id;
 	private String rev;
@@ -10,8 +13,9 @@ public class Comment implements Entity {
 	private String creatorId;
 	private String subject;
 	private String body;
-	private long timestamp;
+	private Date timestamp;
 	private boolean read;
+	private Map<String, Map<String, ?>> extensions;
 
 	@Override
 	@JsonView({View.Persistence.class, View.Public.class})
@@ -78,12 +82,12 @@ public class Comment implements Entity {
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public long getTimestamp() {
+	public Date getTimestamp() {
 		return timestamp;
 	}
 
 	@JsonView(View.Persistence.class)
-	public void setTimestamp(final long timestamp) {
+	public void setTimestamp(final Date timestamp) {
 		this.timestamp = timestamp;
 	}
 
@@ -96,4 +100,14 @@ public class Comment implements Entity {
 	public void setRead(final boolean read) {
 		this.read = read;
 	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public Map<String, Map<String, ?>> getExtensions() {
+		return extensions;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setExtensions(Map<String, Map<String, ?>> extensions) {
+		this.extensions = extensions;
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/entities/Content.java b/src/main/java/de/thm/arsnova/entities/Content.java
index 9996784d4..c75c5d4ae 100644
--- a/src/main/java/de/thm/arsnova/entities/Content.java
+++ b/src/main/java/de/thm/arsnova/entities/Content.java
@@ -3,7 +3,79 @@ package de.thm.arsnova.entities;
 import com.fasterxml.jackson.annotation.JsonView;
 import de.thm.arsnova.entities.serialization.View;
 
+import java.util.Date;
+import java.util.Map;
+
 public class Content implements Entity {
+	public class State {
+		private int round = 1;
+		private Date roundEndTimestamp;
+		private boolean visible = true;
+		private boolean solutionVisible = false;
+		private boolean responsesEnabled = true;
+		private boolean responsesVisible = false;
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public int getRound() {
+			return round;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setRound(final int round) {
+			this.round = round;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public Date getRoundEndTimestamp() {
+			return roundEndTimestamp;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setRoundEndTimestamp(Date roundEndTimestamp) {
+			this.roundEndTimestamp = roundEndTimestamp;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public boolean isVisible() {
+			return visible;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public boolean isSolutionVisible() {
+			return solutionVisible;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setSolutionVisible(final boolean solutionVisible) {
+			this.solutionVisible = solutionVisible;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setVisible(final boolean visible) {
+			this.visible = visible;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public boolean areResponsesEnabled() {
+			return responsesEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setResponsesEnabled(final boolean responsesEnabled) {
+			this.responsesEnabled = responsesEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public boolean areResponsesVisible() {
+			return responsesVisible;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setResponsesVisible(final boolean responsesVisible) {
+			this.responsesVisible = responsesVisible;
+		}
+	}
+
 	private String id;
 	private String rev;
 	private String roomId;
@@ -11,6 +83,9 @@ public class Content implements Entity {
 	private String body;
 	private String format;
 	private String group;
+	private State state;
+	private Date timestamp;
+	private Map<String, Map<String, ?>> extensions;
 
 	@Override
 	@JsonView({View.Persistence.class, View.Public.class})
@@ -76,13 +151,47 @@ public class Content implements Entity {
 		this.format = format;
 	}
 
-	@JsonView({View.Persistence.class, View.Public.class})
+	@JsonView(View.Public.class)
 	public String getGroup() {
 		return group;
 	}
 
-	@JsonView({View.Persistence.class, View.Public.class})
+	@JsonView(View.Public.class)
 	public void setGroup(final String group) {
 		this.group = group;
 	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public State getState() {
+		return state;
+	}
+
+	public void resetState() {
+		this.state = new State();
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setState(final State state) {
+		this.state = state;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public Date getTimestamp() {
+		return timestamp;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setTimestamp(Date timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public Map<String, Map<String, ?>> getExtensions() {
+		return extensions;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setExtensions(Map<String, Map<String, ?>> extensions) {
+		this.extensions = extensions;
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/entities/Feedback.java b/src/main/java/de/thm/arsnova/entities/Feedback.java
index b46616432..235260cd1 100644
--- a/src/main/java/de/thm/arsnova/entities/Feedback.java
+++ b/src/main/java/de/thm/arsnova/entities/Feedback.java
@@ -51,7 +51,7 @@ public class Feedback {
 	}
 
 	@Override
-	public boolean equals(Object obj) {
+	public boolean equals(final Object obj) {
 		if (obj == null) {
 			return false;
 		}
diff --git a/src/main/java/de/thm/arsnova/entities/LogEntry.java b/src/main/java/de/thm/arsnova/entities/LogEntry.java
index eabb1fcea..21a0fb808 100644
--- a/src/main/java/de/thm/arsnova/entities/LogEntry.java
+++ b/src/main/java/de/thm/arsnova/entities/LogEntry.java
@@ -57,13 +57,13 @@ public class LogEntry implements Entity {
 	}
 
 	@JsonView(View.Persistence.class)
-	public void setRevision(final String rev) {
-		this.rev = rev;
+	public String getRevision() {
+		return rev;
 	}
 
 	@JsonView(View.Persistence.class)
-	public String getRevision() {
-		return rev;
+	public void setRevision(final String rev) {
+		this.rev = rev;
 	}
 
 	@JsonView(View.Persistence.class)
@@ -72,7 +72,7 @@ public class LogEntry implements Entity {
 	}
 
 	@JsonView(View.Persistence.class)
-	public void setTimestamp(long timestamp) {
+	public void setTimestamp(final long timestamp) {
 		this.timestamp = timestamp;
 	}
 
@@ -82,7 +82,7 @@ public class LogEntry implements Entity {
 	}
 
 	@JsonView(View.Persistence.class)
-	public void setEvent(String event) {
+	public void setEvent(final String event) {
 		this.event = event;
 	}
 
@@ -92,12 +92,12 @@ public class LogEntry implements Entity {
 	}
 
 	@JsonView(View.Persistence.class)
-	public void setLevel(int level) {
+	public void setLevel(final int level) {
 		this.level = level;
 	}
 
 	@JsonView(View.Persistence.class)
-	public void setLevel(LogLevel level) {
+	public void setLevel(final LogLevel level) {
 		this.level = level.ordinal();
 	}
 
@@ -107,7 +107,7 @@ public class LogEntry implements Entity {
 	}
 
 	@JsonView(View.Persistence.class)
-	public void setPayload(Map<String, Object> payload) {
+	public void setPayload(final Map<String, Object> payload) {
 		this.payload = payload;
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/entities/MigrationState.java b/src/main/java/de/thm/arsnova/entities/MigrationState.java
new file mode 100644
index 000000000..56762825f
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/entities/MigrationState.java
@@ -0,0 +1,84 @@
+package de.thm.arsnova.entities;
+
+import com.fasterxml.jackson.annotation.JsonView;
+import de.thm.arsnova.entities.serialization.View;
+
+import java.util.Date;
+import java.util.List;
+
+public class MigrationState implements Entity {
+	public class Migration {
+		private String id;
+		private Date start;
+
+		public Migration(String id, Date start) {
+			this.id = id;
+			this.start = start;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public String getId() {
+			return id;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public Date getStart() {
+			return start;
+		}
+	}
+
+	private String id = "MigrationState";
+	private String rev;
+	private Migration active;
+	private List<String> completed;
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public String getId() {
+		return id;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setId(final String id) {
+		if (!id.equals(this.id)) {
+			throw new IllegalArgumentException("ID of this entity must not be changed.");
+		};
+	}
+
+	@Override
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getRevision() {
+		return rev;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setRevision(final String rev) {
+		this.rev = rev;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public Migration getActive() {
+		return active;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setActive(final Migration active) {
+		this.active = active;
+	}
+
+	public void setActive(final String id, final Date start) {
+		this.setActive(new Migration(id, start));
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public List<String> getCompleted() {
+		return completed;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setCompleted(final List<String> completed) {
+		this.completed = completed;
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/entities/Motd.java b/src/main/java/de/thm/arsnova/entities/Motd.java
index 7f19e477e..6dd90bffc 100644
--- a/src/main/java/de/thm/arsnova/entities/Motd.java
+++ b/src/main/java/de/thm/arsnova/entities/Motd.java
@@ -103,7 +103,7 @@ public class Motd implements Entity {
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setAudience(String a) {
+	public void setAudience(final String a) {
 		audience = a;
 	}
 
@@ -113,7 +113,7 @@ public class Motd implements Entity {
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setSessionId(String sessionId) {
+	public void setSessionId(final String sessionId) {
 		this.sessionId = sessionId;
 	}
 
@@ -124,7 +124,7 @@ public class Motd implements Entity {
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setSessionkey(String a) {
+	public void setSessionkey(final String a) {
 		sessionkey = a;
 	}
 
@@ -159,7 +159,7 @@ public class Motd implements Entity {
 	}
 
 	@Override
-	public boolean equals(Object obj) {
+	public boolean equals(final Object obj) {
 		if (obj == null || !obj.getClass().equals(this.getClass())) {
 			return false;
 		}
diff --git a/src/main/java/de/thm/arsnova/entities/Room.java b/src/main/java/de/thm/arsnova/entities/Room.java
index b782afb6b..32d71fee8 100644
--- a/src/main/java/de/thm/arsnova/entities/Room.java
+++ b/src/main/java/de/thm/arsnova/entities/Room.java
@@ -3,14 +3,244 @@ package de.thm.arsnova.entities;
 import com.fasterxml.jackson.annotation.JsonView;
 import de.thm.arsnova.entities.serialization.View;
 
+import java.util.List;
+import java.util.Map;
+
 public class Room implements Entity {
+	public class ContentGroup {
+		private List<String> contentIds;
+		private boolean autoSort;
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public List<String> getContentIds() {
+			return contentIds;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setContentIds(final List<String> contentIds) {
+			this.contentIds = contentIds;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public boolean isAutoSort() {
+			return autoSort;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setAutoSort(final boolean autoSort) {
+			this.autoSort = autoSort;
+		}
+	}
+
+	public class Settings {
+		private boolean questionsEnabled = true;
+		private boolean slidesEnabled = true;
+		private boolean commentsEnabled = true;
+		private boolean flashcardsEnabled = true;
+		private boolean livevoteEnabled = true;
+		private boolean scoreEnabled = true;
+		private boolean multipleRoundsEnabled = true;
+		private boolean timerEnabled = true;
+		private boolean feedbackLocked = false;
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public boolean isQuestionsEnabled() {
+			return questionsEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setQuestionsEnabled(final boolean questionsEnabled) {
+			this.questionsEnabled = questionsEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public boolean isSlidesEnabled() {
+			return slidesEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setSlidesEnabled(final boolean slidesEnabled) {
+			this.slidesEnabled = slidesEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public boolean isCommentsEnabled() {
+			return commentsEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setCommentsEnabled(final boolean commentsEnabled) {
+			this.commentsEnabled = commentsEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public boolean isFlashcardsEnabled() {
+			return flashcardsEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setFlashcardsEnabled(final boolean flashcardsEnabled) {
+			this.flashcardsEnabled = flashcardsEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public boolean isLivevoteEnabled() {
+			return livevoteEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setLivevoteEnabled(boolean livevoteEnabled) {
+			this.livevoteEnabled = livevoteEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public boolean isScoreEnabled() {
+			return scoreEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setScoreEnabled(final boolean scoreEnabled) {
+			this.scoreEnabled = scoreEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public boolean isMultipleRoundsEnabled() {
+			return multipleRoundsEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setMultipleRoundsEnabled(final boolean multipleRoundsEnabled) {
+			this.multipleRoundsEnabled = multipleRoundsEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public boolean isTimerEnabled() {
+			return timerEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setTimerEnabled(final boolean timerEnabled) {
+			this.timerEnabled = timerEnabled;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public boolean isFeedbackLocked() {
+			return feedbackLocked;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setFeedbackLocked(final boolean feedbackLocked) {
+			this.feedbackLocked = feedbackLocked;
+		}
+	}
+
+	public class Author {
+		private String name;
+		private String mail;
+		private String organizationName;
+		private String organizationLogo;
+		private String organizationUnit;
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public String getName() {
+			return name;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setName(final String name) {
+			this.name = name;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public String getMail() {
+			return mail;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setMail(final String mail) {
+			this.mail = mail;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public String getOrganizationName() {
+			return organizationName;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setOrganizationName(final String organizationName) {
+			this.organizationName = organizationName;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public String getOrganizationLogo() {
+			return organizationLogo;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setOrganizationLogo(final String organizationLogo) {
+			this.organizationLogo = organizationLogo;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public String getOrganizationUnit() {
+			return organizationUnit;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setOrganizationUnit(final String organizationUnit) {
+			this.organizationUnit = organizationUnit;
+		}
+	}
+
+	public class PoolProperties {
+		private String category;
+		private String level;
+		private String license;
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public String getCategory() {
+			return category;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setCategory(final String category) {
+			this.category = category;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public String getLevel() {
+			return level;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setLevel(final String level) {
+			this.level = level;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public String getLicense() {
+			return license;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setLicense(final String license) {
+			this.license = license;
+		}
+	}
+
 	private String id;
 	private String rev;
 	private String shortId;
 	private String ownerId;
 	private String name;
 	private String abbreviation;
+	private String description;
 	private boolean closed;
+	private Map<String, ContentGroup> contentGroups;
+	private Settings settings;
+	private Author author;
+	private PoolProperties poolProperties;
+	private Map<String, Map<String, ?>> extensions;
 	private RoomStatistics statistics;
 
 	@Override
@@ -77,6 +307,16 @@ public class Room implements Entity {
 		this.abbreviation = abbreviation;
 	}
 
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getDescription() {
+		return description;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setDescription(final String description) {
+		this.description = description;
+	}
+
 	@JsonView({View.Persistence.class, View.Public.class})
 	public boolean isClosed() {
 		return closed;
@@ -87,6 +327,56 @@ public class Room implements Entity {
 		this.closed = closed;
 	}
 
+	@JsonView({View.Persistence.class, View.Public.class})
+	public Map<String, ContentGroup> getContentGroups() {
+		return contentGroups;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setContentGroups(final Map<String, ContentGroup> contentGroups) {
+		this.contentGroups = contentGroups;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public Settings getSettings() {
+		return settings;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setSettings(Settings settings) {
+		this.settings = settings;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public Author getAuthor() {
+		return author;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setAuthor(final Author author) {
+		this.author = author;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public PoolProperties getPoolProperties() {
+		return poolProperties;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setPoolProperties(final PoolProperties poolProperties) {
+		this.poolProperties = poolProperties;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public Map<String, Map<String, ?>> getExtensions() {
+		return extensions;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setExtensions(final Map<String, Map<String, ?>> extensions) {
+		this.extensions = extensions;
+	}
+
 	@JsonView(View.Public.class)
 	public RoomStatistics getStatistics() {
 		return statistics;
diff --git a/src/main/java/de/thm/arsnova/entities/RoomStatistics.java b/src/main/java/de/thm/arsnova/entities/RoomStatistics.java
index fdba8fb2b..ba07a03d7 100644
--- a/src/main/java/de/thm/arsnova/entities/RoomStatistics.java
+++ b/src/main/java/de/thm/arsnova/entities/RoomStatistics.java
@@ -5,13 +5,20 @@ import de.thm.arsnova.entities.serialization.View;
 
 public class RoomStatistics {
 	private int contentCount = 0;
+	private int unansweredContentCount = 0;
 	private int answerCount = 0;
 	private int unreadAnswerCount = 0;
 	private int commentCount = 0;
 	private int unreadCommentCount = 0;
 
-	public RoomStatistics() {
+	@JsonView(View.Public.class)
+	public int getUnansweredContentCount() {
+		return unansweredContentCount;
+	}
 
+	@JsonView(View.Public.class)
+	public void setUnansweredContentCount(final int unansweredContentCount) {
+		this.unansweredContentCount = unansweredContentCount;
 	}
 
 	@JsonView(View.Public.class)
@@ -19,7 +26,7 @@ public class RoomStatistics {
 		return contentCount;
 	}
 
-	public void setContentCount(int contentCount) {
+	public void setContentCount(final int contentCount) {
 		this.contentCount = contentCount;
 	}
 
@@ -28,7 +35,7 @@ public class RoomStatistics {
 		return answerCount;
 	}
 
-	public void setAnswerCount(int answerCount) {
+	public void setAnswerCount(final int answerCount) {
 		this.answerCount = answerCount;
 	}
 
@@ -37,7 +44,7 @@ public class RoomStatistics {
 		return unreadAnswerCount;
 	}
 
-	public void setUnreadAnswerCount(int unreadAnswerCount) {
+	public void setUnreadAnswerCount(final int unreadAnswerCount) {
 		this.unreadAnswerCount = unreadAnswerCount;
 	}
 
@@ -46,7 +53,7 @@ public class RoomStatistics {
 		return commentCount;
 	}
 
-	public void setCommentCount(int commentCount) {
+	public void setCommentCount(final int commentCount) {
 		this.commentCount = commentCount;
 	}
 
@@ -55,7 +62,7 @@ public class RoomStatistics {
 		return unreadCommentCount;
 	}
 
-	public void setUnreadCommentCount(int unreadCommentCount) {
+	public void setUnreadCommentCount(final int unreadCommentCount) {
 		this.unreadCommentCount = unreadCommentCount;
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/entities/ScoreOptions.java b/src/main/java/de/thm/arsnova/entities/ScoreOptions.java
index 4b032b102..e5559970d 100644
--- a/src/main/java/de/thm/arsnova/entities/ScoreOptions.java
+++ b/src/main/java/de/thm/arsnova/entities/ScoreOptions.java
@@ -34,7 +34,7 @@ public class ScoreOptions implements Serializable {
 
 	private String questionVariant = "";
 
-	public ScoreOptions(ScoreOptions scoreOptions) {
+	public ScoreOptions(final ScoreOptions scoreOptions) {
 		this();
 		this.type = scoreOptions.getType();
 		this.questionVariant = scoreOptions.getQuestionVariant();
@@ -49,7 +49,7 @@ public class ScoreOptions implements Serializable {
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setType(String type) {
+	public void setType(final String type) {
 		this.type = type;
 	}
 
@@ -60,7 +60,7 @@ public class ScoreOptions implements Serializable {
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setQuestionVariant(String questionVariant) {
+	public void setQuestionVariant(final String questionVariant) {
 		this.questionVariant = questionVariant;
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/entities/ServiceDescription.java b/src/main/java/de/thm/arsnova/entities/ServiceDescription.java
index 33c159958..c6546a724 100644
--- a/src/main/java/de/thm/arsnova/entities/ServiceDescription.java
+++ b/src/main/java/de/thm/arsnova/entities/ServiceDescription.java
@@ -31,20 +31,20 @@ public class ServiceDescription {
 	private int order = 0;
 	private String[] allowedRoles;
 
-	public ServiceDescription(String id, String name, String dialogUrl) {
+	public ServiceDescription(final String id, final String name, final String dialogUrl) {
 		this.id = id;
 		this.name = name;
 		this.dialogUrl = dialogUrl;
 	}
 
-	public ServiceDescription(String id, String name, String dialogUrl, String[] allowedRoles) {
+	public ServiceDescription(final String id, final String name, final String dialogUrl, final String[] allowedRoles) {
 		this.id = id;
 		this.name = name;
 		this.dialogUrl = dialogUrl;
 		this.allowedRoles = allowedRoles;
 	}
 
-	public ServiceDescription(String id, String name, String dialogUrl, String[] allowedRoles, String image) {
+	public ServiceDescription(final String id, final String name, final String dialogUrl, final String[] allowedRoles, final String image) {
 		this.id = id;
 		this.name = name;
 		this.dialogUrl = dialogUrl;
@@ -59,7 +59,7 @@ public class ServiceDescription {
 		return id;
 	}
 
-	public void setId(String id) {
+	public void setId(final String id) {
 		this.id = id;
 	}
 
@@ -68,7 +68,7 @@ public class ServiceDescription {
 		return name;
 	}
 
-	public void setName(String name) {
+	public void setName(final String name) {
 		this.name = name;
 	}
 
@@ -77,7 +77,7 @@ public class ServiceDescription {
 		return dialogUrl;
 	}
 
-	public void setDialogUrl(String dialogUrl) {
+	public void setDialogUrl(final String dialogUrl) {
 		this.dialogUrl = dialogUrl;
 	}
 
@@ -86,7 +86,7 @@ public class ServiceDescription {
 		return image;
 	}
 
-	public void setImage(String image) {
+	public void setImage(final String image) {
 		this.image = image;
 	}
 
@@ -95,7 +95,7 @@ public class ServiceDescription {
 		return order;
 	}
 
-	public void setOrder(int order) {
+	public void setOrder(final int order) {
 		this.order = order;
 	}
 
@@ -104,7 +104,7 @@ public class ServiceDescription {
 		return allowedRoles;
 	}
 
-	public void setAllowedRoles(String[] roles) {
+	public void setAllowedRoles(final String[] roles) {
 		this.allowedRoles = roles;
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/entities/Statistics.java b/src/main/java/de/thm/arsnova/entities/Statistics.java
index ae3eda70d..a4a031cf1 100644
--- a/src/main/java/de/thm/arsnova/entities/Statistics.java
+++ b/src/main/java/de/thm/arsnova/entities/Statistics.java
@@ -129,7 +129,7 @@ public class Statistics {
 		return interposedQuestions;
 	}
 
-	public void setInterposedQuestions(int interposedQuestions) {
+	public void setInterposedQuestions(final int interposedQuestions) {
 		this.interposedQuestions = interposedQuestions;
 	}
 
@@ -139,7 +139,7 @@ public class Statistics {
 		return flashcards;
 	}
 
-	public void setFlashcards(int flashcards) {
+	public void setFlashcards(final int flashcards) {
 		this.flashcards = flashcards;
 	}
 
@@ -149,7 +149,7 @@ public class Statistics {
 		return creators;
 	}
 
-	public void setCreators(int creators) {
+	public void setCreators(final int creators) {
 		this.creators = creators;
 	}
 
@@ -159,7 +159,7 @@ public class Statistics {
 		return conceptQuestions;
 	}
 
-	public void setConceptQuestions(int conceptQuestions) {
+	public void setConceptQuestions(final int conceptQuestions) {
 		this.conceptQuestions = conceptQuestions;
 	}
 
@@ -169,7 +169,7 @@ public class Statistics {
 		return activeStudents;
 	}
 
-	public void setActiveStudents(int activeStudents) {
+	public void setActiveStudents(final int activeStudents) {
 		this.activeStudents = activeStudents;
 	}
 
diff --git a/src/main/java/de/thm/arsnova/entities/TextAnswer.java b/src/main/java/de/thm/arsnova/entities/TextAnswer.java
index 1ca7a828c..881f3e16c 100644
--- a/src/main/java/de/thm/arsnova/entities/TextAnswer.java
+++ b/src/main/java/de/thm/arsnova/entities/TextAnswer.java
@@ -3,9 +3,13 @@ package de.thm.arsnova.entities;
 import com.fasterxml.jackson.annotation.JsonView;
 import de.thm.arsnova.entities.serialization.View;
 
+import java.util.Date;
+
 public class TextAnswer extends Answer {
 	private String subject;
 	private String body;
+	private boolean read;
+	private Date timestamp;
 
 	@JsonView({View.Persistence.class, View.Public.class})
 	public String getSubject() {
@@ -13,7 +17,7 @@ public class TextAnswer extends Answer {
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setSubject(String subject) {
+	public void setSubject(final String subject) {
 		this.subject = subject;
 	}
 
@@ -23,7 +27,27 @@ public class TextAnswer extends Answer {
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setBody(String body) {
+	public void setBody(final String body) {
 		this.body = body;
 	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public boolean isRead() {
+		return read;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setRead(boolean read) {
+		this.read = read;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public Date getTimestamp() {
+		return timestamp;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setTimestamp(final Date timestamp) {
+		this.timestamp = timestamp;
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/entities/UserAuthentication.java b/src/main/java/de/thm/arsnova/entities/UserAuthentication.java
index f9ad955b2..b47de4585 100644
--- a/src/main/java/de/thm/arsnova/entities/UserAuthentication.java
+++ b/src/main/java/de/thm/arsnova/entities/UserAuthentication.java
@@ -43,47 +43,56 @@ public class UserAuthentication implements Serializable {
 	public static final String GUEST = "guest";
 
 	private static final long serialVersionUID = 1L;
+	private String id;
 	private String username;
 	private String type;
 	private UserRoomService.Role role;
 	private boolean isAdmin;
 
-	public UserAuthentication(Google2Profile profile) {
+	public UserAuthentication(final Google2Profile profile) {
 		setUsername(profile.getEmail());
 		setType(UserAuthentication.GOOGLE);
 	}
 
-	public UserAuthentication(TwitterProfile profile) {
+	public UserAuthentication(final TwitterProfile profile) {
 		setUsername(profile.getUsername());
 		setType(UserAuthentication.TWITTER);
 	}
 
-	public UserAuthentication(FacebookProfile profile) {
+	public UserAuthentication(final FacebookProfile profile) {
 		setUsername(profile.getProfileUrl().toString());
 		setType(UserAuthentication.FACEBOOK);
 	}
 
-	public UserAuthentication(AttributePrincipal principal) {
+	public UserAuthentication(final AttributePrincipal principal) {
 		setUsername(principal.getName());
 		setType(UserAuthentication.THM);
 	}
 
-	public UserAuthentication(AnonymousAuthenticationToken token) {
+	public UserAuthentication(final AnonymousAuthenticationToken token) {
 		setUsername(UserAuthentication.ANONYMOUS);
 		setType(UserAuthentication.ANONYMOUS);
 	}
 
-	public UserAuthentication(UsernamePasswordAuthenticationToken token) {
+	public UserAuthentication(final UsernamePasswordAuthenticationToken token) {
 		setUsername(token.getName());
 		setType(LDAP);
 	}
 
+	public String getId() {
+		return id;
+	}
+
+	public void setId(final String id) {
+		this.id = id;
+	}
+
 	@JsonView(View.Public.class)
 	public String getUsername() {
 		return username;
 	}
 
-	public void setUsername(String username) {
+	public void setUsername(final String username) {
 		this.username = username;
 	}
 
@@ -92,7 +101,7 @@ public class UserAuthentication implements Serializable {
 		return type;
 	}
 
-	public void setType(String type) {
+	public void setType(final String type) {
 		this.type = type;
 	}
 
@@ -100,7 +109,7 @@ public class UserAuthentication implements Serializable {
 		return role;
 	}
 
-	public void setRole(UserRoomService.Role role) {
+	public void setRole(final UserRoomService.Role role) {
 		this.role = role;
 	}
 
@@ -108,7 +117,7 @@ public class UserAuthentication implements Serializable {
 		return this.role == role;
 	}
 
-	public void setAdmin(boolean a) {
+	public void setAdmin(final boolean a) {
 		this.isAdmin = a;
 	}
 
@@ -134,7 +143,7 @@ public class UserAuthentication implements Serializable {
 	}
 
 	@Override
-	public boolean equals(Object obj) {
+	public boolean equals(final Object obj) {
 		if (obj == null || !obj.getClass().equals(this.getClass())) {
 			return false;
 		}
diff --git a/src/main/java/de/thm/arsnova/entities/UserProfile.java b/src/main/java/de/thm/arsnova/entities/UserProfile.java
index dd932fc38..515422b48 100644
--- a/src/main/java/de/thm/arsnova/entities/UserProfile.java
+++ b/src/main/java/de/thm/arsnova/entities/UserProfile.java
@@ -4,8 +4,10 @@ import com.fasterxml.jackson.annotation.JsonView;
 import de.thm.arsnova.entities.serialization.View;
 
 import java.util.ArrayList;
+import java.util.Date;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Map;
 import java.util.Set;
 
 public class UserProfile implements Entity {
@@ -13,7 +15,7 @@ public class UserProfile implements Entity {
 		private String password;
 		private String activationKey;
 		private String passwordResetKey;
-		private long passwordResetTime;
+		private Date passwordResetTime;
 
 		@JsonView(View.Persistence.class)
 		public String getPassword() {
@@ -21,7 +23,7 @@ public class UserProfile implements Entity {
 		}
 
 		@JsonView(View.Persistence.class)
-		public void setPassword(String password) {
+		public void setPassword(final String password) {
 			this.password = password;
 		}
 
@@ -31,7 +33,7 @@ public class UserProfile implements Entity {
 		}
 
 		@JsonView(View.Persistence.class)
-		public void setActivationKey(String activationKey) {
+		public void setActivationKey(final String activationKey) {
 			this.activationKey = activationKey;
 		}
 
@@ -41,30 +43,30 @@ public class UserProfile implements Entity {
 		}
 
 		@JsonView(View.Persistence.class)
-		public void setPasswordResetKey(String passwordResetKey) {
+		public void setPasswordResetKey(final String passwordResetKey) {
 			this.passwordResetKey = passwordResetKey;
 		}
 
 		@JsonView(View.Persistence.class)
-		public long getPasswordResetTime() {
+		public Date getPasswordResetTime() {
 			return passwordResetTime;
 		}
 
 		@JsonView(View.Persistence.class)
-		public void setPasswordResetTime(long passwordResetTime) {
+		public void setPasswordResetTime(final Date passwordResetTime) {
 			this.passwordResetTime = passwordResetTime;
 		}
 	}
 
 	public class RoomHistoryEntry {
 		private String roomId;
-		private long lastVisit;
+		private Date lastVisit;
 
 		public RoomHistoryEntry() {
 
 		}
 
-		public RoomHistoryEntry(String roomId, long lastVisit) {
+		public RoomHistoryEntry(String roomId, Date lastVisit) {
 			this.roomId = roomId;
 			this.lastVisit = lastVisit;
 		}
@@ -77,11 +79,11 @@ public class UserProfile implements Entity {
 			this.roomId = roomId;
 		}
 
-		public long getLastVisit() {
+		public Date getLastVisit() {
 			return lastVisit;
 		}
 
-		public void setLastVisit(long lastVisit) {
+		public void setLastVisit(Date lastVisit) {
 			this.lastVisit = lastVisit;
 		}
 	}
@@ -90,11 +92,12 @@ public class UserProfile implements Entity {
 	private String rev;
 	private String authProvider;
 	private String loginId;
-	private long creation;
-	private long lastLogin;
+	private Date creationTimestamp;
+	private Date lastLoginTimestamp;
 	private Account account;
 	private List<RoomHistoryEntry> roomHistory = new ArrayList<>();
 	private Set<String> acknowledgedMotds = new HashSet<>();
+	private Map<String, Map<String, ?>> extensions;
 
 	@Override
 	@JsonView({View.Persistence.class, View.Public.class})
@@ -104,7 +107,7 @@ public class UserProfile implements Entity {
 
 	@Override
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setId(String id) {
+	public void setId(final String id) {
 		this.id = id;
 	}
 
@@ -116,7 +119,7 @@ public class UserProfile implements Entity {
 
 	@Override
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setRevision(String rev) {
+	public void setRevision(final String rev) {
 		this.rev = rev;
 	}
 
@@ -126,7 +129,7 @@ public class UserProfile implements Entity {
 	}
 
 	@JsonView(View.Persistence.class)
-	public void setAuthProvider(String authProvider) {
+	public void setAuthProvider(final String authProvider) {
 		this.authProvider = authProvider;
 	}
 
@@ -136,28 +139,28 @@ public class UserProfile implements Entity {
 	}
 
 	@JsonView(View.Persistence.class)
-	public void setLoginId(String loginId) {
+	public void setLoginId(final String loginId) {
 		this.loginId = loginId;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public long getCreation() {
-		return creation;
+	public Date getCreationTimestamp() {
+		return creationTimestamp;
 	}
 
 	@JsonView(View.Persistence.class)
-	public void setCreation(long creation) {
-		this.creation = creation;
+	public void setCreationTimestamp(final Date creationTimestamp) {
+		this.creationTimestamp = creationTimestamp;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public long getLastLogin() {
-		return lastLogin;
+	public Date getLastLoginTimestamp() {
+		return lastLoginTimestamp;
 	}
 
 	@JsonView(View.Persistence.class)
-	public void setLastLogin(long lastLogin) {
-		this.lastLogin = lastLogin;
+	public void setLastLoginTimestamp(final Date lastLoginTimestamp) {
+		this.lastLoginTimestamp = lastLoginTimestamp;
 	}
 
 	@JsonView(View.Persistence.class)
@@ -166,7 +169,7 @@ public class UserProfile implements Entity {
 	}
 
 	@JsonView(View.Persistence.class)
-	public void setAccount(Account account) {
+	public void setAccount(final Account account) {
 		this.account = account;
 	}
 
@@ -176,7 +179,7 @@ public class UserProfile implements Entity {
 	}
 
 	@JsonView(View.Persistence.class)
-	public void setRoomHistory(List<RoomHistoryEntry> roomHistory) {
+	public void setRoomHistory(final List<RoomHistoryEntry> roomHistory) {
 		this.roomHistory = roomHistory;
 	}
 
@@ -186,7 +189,17 @@ public class UserProfile implements Entity {
 	}
 
 	@JsonView(View.Persistence.class)
-	public void setAcknowledgedMotds(Set<String> acknowledgedMotds) {
+	public void setAcknowledgedMotds(final Set<String> acknowledgedMotds) {
 		this.acknowledgedMotds = acknowledgedMotds;
 	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public Map<String, Map<String, ?>> getExtensions() {
+		return extensions;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setExtensions(Map<String, Map<String, ?>> extensions) {
+		this.extensions = extensions;
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/entities/migration/FromV2Migrator.java b/src/main/java/de/thm/arsnova/entities/migration/FromV2Migrator.java
index caa7e6565..4b9614c8b 100644
--- a/src/main/java/de/thm/arsnova/entities/migration/FromV2Migrator.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/FromV2Migrator.java
@@ -33,6 +33,7 @@ import de.thm.arsnova.entities.migration.v2.Room;
 
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Date;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -65,13 +66,13 @@ public class FromV2Migrator {
 			account.setPassword(dbUser.getPassword());
 			account.setActivationKey(dbUser.getActivationKey());
 			account.setPasswordResetKey(dbUser.getPasswordResetKey());
-			account.setPasswordResetTime(dbUser.getPasswordResetTime());
+			account.setPasswordResetTime(new Date(dbUser.getPasswordResetTime()));
 		}
 		if (loggedIn != null) {
 			profile.setLoginId(loggedIn.getUser());
-			profile.setLastLogin(loggedIn.getTimestamp());
+			profile.setLastLoginTimestamp(new Date(loggedIn.getTimestamp()));
 			List<UserProfile.RoomHistoryEntry> sessionHistory = loggedIn.getVisitedSessions().stream()
-					.map(entry -> profile.new RoomHistoryEntry(entry.getId(), 0))
+					.map(entry -> profile.new RoomHistoryEntry(entry.getId(), new Date(0)))
 					.collect(Collectors.toList());
 			profile.setRoomHistory(sessionHistory);
 		}
@@ -82,8 +83,8 @@ public class FromV2Migrator {
 		return profile;
 	}
 
-	public de.thm.arsnova.entities.Room migrate(final Room from, final DbUser owner) {
-		if (!owner.getUsername().equals(from.getCreator())) {
+	public de.thm.arsnova.entities.Room migrate(final Room from, final UserProfile owner) {
+		if (!owner.getLoginId().equals(from.getCreator())) {
 			throw new IllegalArgumentException("Username of owner object does not match session creator.");
 		}
 		final de.thm.arsnova.entities.Room to = new de.thm.arsnova.entities.Room();
@@ -167,8 +168,8 @@ public class FromV2Migrator {
 		return to;
 	}
 
-	public de.thm.arsnova.entities.Comment migrate(final Comment from, final DbUser creator) {
-		if (!creator.getUsername().equals(from.getCreator())) {
+	public de.thm.arsnova.entities.Comment migrate(final Comment from, final UserProfile creator) {
+		if (!creator.getLoginId().equals(from.getCreator())) {
 			throw new IllegalArgumentException("Username of creator object does not match comment creator.");
 		}
 		final de.thm.arsnova.entities.Comment to = new de.thm.arsnova.entities.Comment();
@@ -177,7 +178,7 @@ public class FromV2Migrator {
 		to.setCreatorId(creator.getId());
 		to.setSubject(from.getSubject());
 		to.setBody(from.getText());
-		to.setTimestamp(from.getTimestamp());
+		to.setTimestamp(new Date(from.getTimestamp()));
 		to.setRead(from.isRead());
 
 		return to;
diff --git a/src/main/java/de/thm/arsnova/entities/migration/ToV2Migrator.java b/src/main/java/de/thm/arsnova/entities/migration/ToV2Migrator.java
index 0175a5d71..da4911236 100644
--- a/src/main/java/de/thm/arsnova/entities/migration/ToV2Migrator.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/ToV2Migrator.java
@@ -48,7 +48,7 @@ public class ToV2Migrator {
 		final LoggedIn to = new LoggedIn();
 		copyCommonProperties(from, to);
 		to.setUser(from.getLoginId());
-		to.setTimestamp(from.getLastLogin());
+		to.setTimestamp(from.getLastLoginTimestamp().getTime());
 		to.setVisitedSessions(from.getRoomHistory().stream()
 				.map(entry -> new VisitedRoom())
 				.collect(Collectors.toList()));
@@ -136,7 +136,7 @@ public class ToV2Migrator {
 		to.setCreator(creator.getLoginId());
 		to.setSubject(from.getSubject());
 		to.setText(from.getBody());
-		to.setTimestamp(from.getTimestamp());
+		to.setTimestamp(from.getTimestamp().getTime());
 		to.setRead(from.isRead());
 
 		return to;
-- 
GitLab