From 1779f3734a4c117fee306a7f069d2d34d753c367 Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <code@dgerhardt.net>
Date: Mon, 25 Sep 2017 17:45:04 +0200
Subject: [PATCH] Add timestamps to entities

Additionally moved previously missed v2 entities to the v2 package.
---
 .../arsnova/controller/MotdController.java    |   2 +-
 .../java/de/thm/arsnova/entities/Answer.java  |  27 +++
 .../java/de/thm/arsnova/entities/Comment.java |  26 +++
 .../java/de/thm/arsnova/entities/Content.java |  26 +++
 .../java/de/thm/arsnova/entities/Entity.java  |  25 +--
 .../de/thm/arsnova/entities/LogEntry.java     |  45 +++--
 .../thm/arsnova/entities/MigrationState.java  |  26 +++
 .../java/de/thm/arsnova/entities/Motd.java    | 154 ++++++----------
 .../java/de/thm/arsnova/entities/Room.java    |  27 +++
 .../de/thm/arsnova/entities/TextAnswer.java   |  11 +-
 .../de/thm/arsnova/entities/UserProfile.java  |  37 ++--
 .../entities/migration/FromV2Migrator.java    |   4 +-
 .../entities/migration/ToV2Migrator.java      |   4 +-
 .../arsnova/entities/migration/v2/Answer.java |   1 -
 .../entities/migration/v2/Comment.java        |   1 -
 .../entities/migration/v2/Content.java        |   1 -
 .../arsnova/entities/migration/v2/DbUser.java |   1 -
 .../arsnova/entities/migration/v2/Entity.java |  36 ++++
 .../entities/migration/v2/LogEntry.java       | 113 ++++++++++++
 .../entities/migration/v2/LoggedIn.java       |   1 -
 .../arsnova/entities/migration/v2/Motd.java   | 169 ++++++++++++++++++
 .../entities/migration/v2/MotdList.java       |   1 -
 .../arsnova/entities/migration/v2/Room.java   |   1 -
 .../CouchDbTypeFieldConverter.java            |   6 +-
 .../transport/ImportExportSession.java        |   2 +-
 .../persistance/LogEntryRepository.java       |   2 +-
 .../arsnova/persistance/MotdRepository.java   |   2 +-
 .../couchdb/CouchDbLogEntryRepository.java    |   2 +-
 .../couchdb/CouchDbMotdRepository.java        |   2 +-
 .../services/DefaultEntityServiceImpl.java    |   7 +
 .../de/thm/arsnova/services/MotdService.java  |   2 +-
 .../thm/arsnova/services/MotdServiceImpl.java |   2 +-
 32 files changed, 585 insertions(+), 181 deletions(-)
 create mode 100644 src/main/java/de/thm/arsnova/entities/migration/v2/Entity.java
 create mode 100644 src/main/java/de/thm/arsnova/entities/migration/v2/LogEntry.java
 create mode 100644 src/main/java/de/thm/arsnova/entities/migration/v2/Motd.java

diff --git a/src/main/java/de/thm/arsnova/controller/MotdController.java b/src/main/java/de/thm/arsnova/controller/MotdController.java
index 95cbc6fa8..f55be007a 100644
--- a/src/main/java/de/thm/arsnova/controller/MotdController.java
+++ b/src/main/java/de/thm/arsnova/controller/MotdController.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.controller;
 
-import de.thm.arsnova.entities.Motd;
+import de.thm.arsnova.entities.migration.v2.Motd;
 import de.thm.arsnova.entities.migration.v2.MotdList;
 import de.thm.arsnova.services.MotdService;
 import io.swagger.annotations.Api;
diff --git a/src/main/java/de/thm/arsnova/entities/Answer.java b/src/main/java/de/thm/arsnova/entities/Answer.java
index f564ff3cb..e96a298d2 100644
--- a/src/main/java/de/thm/arsnova/entities/Answer.java
+++ b/src/main/java/de/thm/arsnova/entities/Answer.java
@@ -3,11 +3,14 @@ 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 abstract class Answer implements Entity {
 	private String id;
 	private String rev;
+	private Date creationTimestamp;
+	private Date updateTimestamp;
 	private String contentId;
 	private String roomId;
 	private String creatorId;
@@ -38,6 +41,30 @@ public abstract class Answer implements Entity {
 		this.rev = rev;
 	}
 
+	@Override
+	@JsonView(View.Persistence.class)
+	public Date getCreationTimestamp() {
+		return creationTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setCreationTimestamp(final Date creationTimestamp) {
+		this.creationTimestamp = creationTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public Date getUpdateTimestamp() {
+		return updateTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setUpdateTimestamp(final Date updateTimestamp) {
+		this.updateTimestamp = updateTimestamp;
+	}
+
 	@JsonView({View.Persistence.class, View.Public.class})
 	public String getContentId() {
 		return contentId;
diff --git a/src/main/java/de/thm/arsnova/entities/Comment.java b/src/main/java/de/thm/arsnova/entities/Comment.java
index 976691b03..414a3969a 100644
--- a/src/main/java/de/thm/arsnova/entities/Comment.java
+++ b/src/main/java/de/thm/arsnova/entities/Comment.java
@@ -9,6 +9,8 @@ import java.util.Map;
 public class Comment implements Entity {
 	private String id;
 	private String rev;
+	private Date creationTimestamp;
+	private Date updateTimestamp;
 	private String sessionId;
 	private String creatorId;
 	private String subject;
@@ -41,6 +43,30 @@ public class Comment implements Entity {
 		this.rev = rev;
 	}
 
+	@Override
+	@JsonView(View.Persistence.class)
+	public Date getCreationTimestamp() {
+		return creationTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setCreationTimestamp(final Date creationTimestamp) {
+		this.creationTimestamp = creationTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public Date getUpdateTimestamp() {
+		return updateTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setUpdateTimestamp(final Date updateTimestamp) {
+		this.updateTimestamp = updateTimestamp;
+	}
+
 	@JsonView({View.Persistence.class, View.Public.class})
 	public String getSessionId() {
 		return sessionId;
diff --git a/src/main/java/de/thm/arsnova/entities/Content.java b/src/main/java/de/thm/arsnova/entities/Content.java
index c75c5d4ae..84e60922f 100644
--- a/src/main/java/de/thm/arsnova/entities/Content.java
+++ b/src/main/java/de/thm/arsnova/entities/Content.java
@@ -78,6 +78,8 @@ public class Content implements Entity {
 
 	private String id;
 	private String rev;
+	private Date creationTimestamp;
+	private Date updateTimestamp;
 	private String roomId;
 	private String subject;
 	private String body;
@@ -111,6 +113,30 @@ public class Content implements Entity {
 		this.rev = rev;
 	}
 
+	@Override
+	@JsonView(View.Persistence.class)
+	public Date getCreationTimestamp() {
+		return creationTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setCreationTimestamp(final Date creationTimestamp) {
+		this.creationTimestamp = creationTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public Date getUpdateTimestamp() {
+		return updateTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setUpdateTimestamp(final Date updateTimestamp) {
+		this.updateTimestamp = updateTimestamp;
+	}
+
 	@JsonView({View.Persistence.class, View.Public.class})
 	public String getRoomId() {
 		return roomId;
diff --git a/src/main/java/de/thm/arsnova/entities/Entity.java b/src/main/java/de/thm/arsnova/entities/Entity.java
index 97b346ba4..0d0c4538b 100644
--- a/src/main/java/de/thm/arsnova/entities/Entity.java
+++ b/src/main/java/de/thm/arsnova/entities/Entity.java
@@ -1,25 +1,10 @@
-/*
- * This file is part of ARSnova Backend.
- * Copyright (C) 2012-2018 The ARSnova Team and Contributors
- *
- * ARSnova Backend is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * ARSnova Backend is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
 package de.thm.arsnova.entities;
 
 import com.fasterxml.jackson.annotation.JsonView;
 import de.thm.arsnova.entities.serialization.View;
 
+import java.util.Date;
+
 public interface Entity {
 	String getId();
 	void setId(String id);
@@ -27,6 +12,12 @@ public interface Entity {
 	String getRevision();
 	void setRevision(String rev);
 
+	Date getCreationTimestamp();
+	void setCreationTimestamp(Date creationTimestamp);
+
+	Date getUpdateTimestamp();
+	void setUpdateTimestamp(Date updateTimestamp);
+
 	@JsonView(View.Persistence.class)
 	default Class<? extends Entity> getType() {
 		return getClass();
diff --git a/src/main/java/de/thm/arsnova/entities/LogEntry.java b/src/main/java/de/thm/arsnova/entities/LogEntry.java
index 21a0fb808..96e07cc4f 100644
--- a/src/main/java/de/thm/arsnova/entities/LogEntry.java
+++ b/src/main/java/de/thm/arsnova/entities/LogEntry.java
@@ -1,26 +1,10 @@
-/*
- * This file is part of ARSnova Backend.
- * Copyright (C) 2012-2018 The ARSnova Team and Contributors
- *
- * ARSnova Backend is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * ARSnova Backend is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
 package de.thm.arsnova.entities;
 
 import com.fasterxml.jackson.annotation.JsonProperty;
 import com.fasterxml.jackson.annotation.JsonView;
 import de.thm.arsnova.entities.serialization.View;
 
+import java.util.Date;
 import java.util.Map;
 
 public class LogEntry implements Entity {
@@ -35,7 +19,8 @@ public class LogEntry implements Entity {
 
 	private String id;
 	private String rev;
-	private long timestamp = System.currentTimeMillis();
+	private Date creationTimestamp;
+	private Date updateTimestamp;
 	private String event;
 	private int level;
 	private Map<String, Object> payload;
@@ -66,14 +51,28 @@ public class LogEntry implements Entity {
 		this.rev = rev;
 	}
 
+	@Override
 	@JsonView(View.Persistence.class)
-	public long getTimestamp() {
-		return timestamp;
+	public Date getCreationTimestamp() {
+		return creationTimestamp;
 	}
 
+	@Override
 	@JsonView(View.Persistence.class)
-	public void setTimestamp(final long timestamp) {
-		this.timestamp = timestamp;
+	public void setCreationTimestamp(final Date creationTimestamp) {
+		this.creationTimestamp = creationTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public Date getUpdateTimestamp() {
+		return updateTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setUpdateTimestamp(final Date updateTimestamp) {
+		this.updateTimestamp = updateTimestamp;
 	}
 
 	@JsonView(View.Persistence.class)
@@ -97,7 +96,7 @@ public class LogEntry implements Entity {
 	}
 
 	@JsonView(View.Persistence.class)
-	public void setLevel(final LogLevel level) {
+	public void setLevel(final de.thm.arsnova.entities.migration.v2.LogEntry.LogLevel level) {
 		this.level = level.ordinal();
 	}
 
diff --git a/src/main/java/de/thm/arsnova/entities/MigrationState.java b/src/main/java/de/thm/arsnova/entities/MigrationState.java
index 56762825f..3d1d27b0c 100644
--- a/src/main/java/de/thm/arsnova/entities/MigrationState.java
+++ b/src/main/java/de/thm/arsnova/entities/MigrationState.java
@@ -29,6 +29,8 @@ public class MigrationState implements Entity {
 
 	private String id = "MigrationState";
 	private String rev;
+	private Date creationTimestamp;
+	private Date updateTimestamp;
 	private Migration active;
 	private List<String> completed;
 
@@ -58,6 +60,30 @@ public class MigrationState implements Entity {
 		this.rev = rev;
 	}
 
+	@Override
+	@JsonView(View.Persistence.class)
+	public Date getCreationTimestamp() {
+		return creationTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setCreationTimestamp(final Date creationTimestamp) {
+		this.creationTimestamp = creationTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public Date getUpdateTimestamp() {
+		return updateTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setUpdateTimestamp(final Date updateTimestamp) {
+		this.updateTimestamp = updateTimestamp;
+	}
+
 	@JsonView({View.Persistence.class, View.Public.class})
 	public Migration getActive() {
 		return active;
diff --git a/src/main/java/de/thm/arsnova/entities/Motd.java b/src/main/java/de/thm/arsnova/entities/Motd.java
index 6dd90bffc..2c6bbfa12 100644
--- a/src/main/java/de/thm/arsnova/entities/Motd.java
+++ b/src/main/java/de/thm/arsnova/entities/Motd.java
@@ -1,169 +1,123 @@
-/*
- * This file is part of ARSnova Backend.
- * Copyright (C) 2012-2018 The ARSnova Team and Contributors
- *
- * ARSnova Backend is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * ARSnova Backend is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
 package de.thm.arsnova.entities;
 
 import com.fasterxml.jackson.annotation.JsonView;
 import de.thm.arsnova.entities.serialization.View;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
 
 import java.util.Date;
 
-/**
- * This class represents a message of the day.
- */
-@ApiModel(value = "motd", description = "the message of the day entity")
 public class Motd implements Entity {
-
-	private String motdkey; //ID
+	private String id;
+	private String rev;
+	private Date creationTimestamp;
+	private Date updateTimestamp;
+	private String sessionId;
 	private Date startdate;
 	private Date enddate;
 	private String title;
-	private String text;
+	private String body;
 	private String audience;
-	private String sessionId;
-	private String sessionkey;
-	private String id;
-	private String rev;
 
-	@ApiModelProperty(required = true, value = "the identification string")
 	@JsonView({View.Persistence.class, View.Public.class})
-	public String getMotdkey() {
-		return motdkey;
+	public String getId() {
+		return id;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setMotdkey(final String key) {
-		motdkey = key;
+	public void setId(final String id) {
+		this.id = id;
 	}
 
-	@ApiModelProperty(required = true, value = "startdate for showing this message (timestamp format)")
 	@JsonView({View.Persistence.class, View.Public.class})
-	public Date getStartdate() {
-		return startdate;
+	public void setRevision(final String rev) {
+		this.rev = rev;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setStartdate(final Date timestamp) {
-		startdate = timestamp;
+	public String getRevision() {
+		return rev;
 	}
 
-	@ApiModelProperty(required = true, value = "enddate for showing this message (timestamp format)")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public Date getEnddate() {
-		return enddate;
+	@Override
+	@JsonView(View.Persistence.class)
+	public Date getCreationTimestamp() {
+		return creationTimestamp;
 	}
 
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setEnddate(final Date timestamp) {
-		enddate = timestamp;
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setCreationTimestamp(final Date creationTimestamp) {
+		this.creationTimestamp = creationTimestamp;
 	}
 
-	@ApiModelProperty(required = true, value = "tite of the message")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public String getTitle() {
-		return title;
+	@Override
+	@JsonView(View.Persistence.class)
+	public Date getUpdateTimestamp() {
+		return updateTimestamp;
 	}
 
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setTitle(final String ttitle) {
-		title = ttitle;
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setUpdateTimestamp(final Date updateTimestamp) {
+		this.updateTimestamp = updateTimestamp;
 	}
 
-	@ApiModelProperty(required = true, value = "text of the message")
 	@JsonView({View.Persistence.class, View.Public.class})
-	public String getText() {
-		return text;
+	public String getSessionId() {
+		return sessionId;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setText(final String ttext) {
-		text = ttext;
+	public void setSessionId(final String sessionId) {
+		this.sessionId = sessionId;
 	}
 
-	@ApiModelProperty(required = true, value = "defines the target audience for this motd (one of the following: 'student', 'tutor', 'loggedIn', 'all')")
 	@JsonView({View.Persistence.class, View.Public.class})
-	public String getAudience() {
-		return audience;
+	public Date getStartdate() {
+		return startdate;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setAudience(final String a) {
-		audience = a;
+	public void setStartdate(final Date timestamp) {
+		startdate = timestamp;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public String getSessionId() {
-		return sessionId;
+	public Date getEnddate() {
+		return enddate;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setSessionId(final String sessionId) {
-		this.sessionId = sessionId;
+	public void setEnddate(final Date timestamp) {
+		enddate = timestamp;
 	}
 
-	@ApiModelProperty(required = true, value = "when audience equals session, the sessionkey referes to the session the messages belong to")
 	@JsonView({View.Persistence.class, View.Public.class})
-	public String getSessionkey() {
-		return sessionkey;
+	public String getTitle() {
+		return title;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setSessionkey(final String a) {
-		sessionkey = a;
+	public void setTitle(final String ttitle) {
+		title = ttitle;
 	}
 
-	@ApiModelProperty(required = true, value = "the couchDB ID")
 	@JsonView({View.Persistence.class, View.Public.class})
-	public String getId() {
-		return id;
+	public String getBody() {
+		return body;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setId(final String id) {
-		this.id = id;
+	public void setBody(final String ttext) {
+		body = ttext;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setRevision(final String rev) {
-		this.rev = rev;
+	public String getAudience() {
+		return audience;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public String getRevision() {
-		return rev;
-	}
-
-	@Override
-	public int hashCode() {
-		// See http://stackoverflow.com/a/113600
-		final int prim = 37;
-
-		int result = 42;
-		return prim * result + this.motdkey.hashCode();
-	}
-
-	@Override
-	public boolean equals(final Object obj) {
-		if (obj == null || !obj.getClass().equals(this.getClass())) {
-			return false;
-		}
-		Motd other = (Motd) obj;
-		return this.getMotdkey().equals(other.getMotdkey());
+	public void setAudience(final String a) {
+		audience = a;
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/entities/Room.java b/src/main/java/de/thm/arsnova/entities/Room.java
index 32d71fee8..a1ab2a672 100644
--- a/src/main/java/de/thm/arsnova/entities/Room.java
+++ b/src/main/java/de/thm/arsnova/entities/Room.java
@@ -3,6 +3,7 @@ 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;
 import java.util.Map;
 
@@ -230,6 +231,8 @@ public class Room implements Entity {
 
 	private String id;
 	private String rev;
+	private Date creationTimestamp;
+	private Date updateTimestamp;
 	private String shortId;
 	private String ownerId;
 	private String name;
@@ -267,6 +270,30 @@ public class Room implements Entity {
 		this.rev = rev;
 	}
 
+	@Override
+	@JsonView(View.Persistence.class)
+	public Date getCreationTimestamp() {
+		return creationTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setCreationTimestamp(final Date creationTimestamp) {
+		this.creationTimestamp = creationTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public Date getUpdateTimestamp() {
+		return updateTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setUpdateTimestamp(final Date updateTimestamp) {
+		this.updateTimestamp = updateTimestamp;
+	}
+
 	@JsonView({View.Persistence.class, View.Public.class})
 	public String getShortId() {
 		return shortId;
diff --git a/src/main/java/de/thm/arsnova/entities/TextAnswer.java b/src/main/java/de/thm/arsnova/entities/TextAnswer.java
index 881f3e16c..8e36c127e 100644
--- a/src/main/java/de/thm/arsnova/entities/TextAnswer.java
+++ b/src/main/java/de/thm/arsnova/entities/TextAnswer.java
@@ -9,7 +9,6 @@ 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() {
@@ -41,13 +40,9 @@ public class TextAnswer extends Answer {
 		this.read = read;
 	}
 
+	@Override
 	@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;
+	public Date getCreationTimestamp() {
+		return getCreationTimestamp();
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/entities/UserProfile.java b/src/main/java/de/thm/arsnova/entities/UserProfile.java
index 515422b48..30e09650a 100644
--- a/src/main/java/de/thm/arsnova/entities/UserProfile.java
+++ b/src/main/java/de/thm/arsnova/entities/UserProfile.java
@@ -90,9 +90,10 @@ public class UserProfile implements Entity {
 
 	private String id;
 	private String rev;
+	private Date creationTimestamp;
+	private Date updateTimestamp;
 	private String authProvider;
 	private String loginId;
-	private Date creationTimestamp;
 	private Date lastLoginTimestamp;
 	private Account account;
 	private List<RoomHistoryEntry> roomHistory = new ArrayList<>();
@@ -123,6 +124,30 @@ public class UserProfile implements Entity {
 		this.rev = rev;
 	}
 
+	@Override
+	@JsonView(View.Persistence.class)
+	public Date getCreationTimestamp() {
+		return creationTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setCreationTimestamp(final Date creationTimestamp) {
+		this.creationTimestamp = creationTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public Date getUpdateTimestamp() {
+		return updateTimestamp;
+	}
+
+	@Override
+	@JsonView(View.Persistence.class)
+	public void setUpdateTimestamp(final Date updateTimestamp) {
+		this.updateTimestamp = updateTimestamp;
+	}
+
 	@JsonView({View.Persistence.class, View.Public.class})
 	public String getAuthProvider() {
 		return authProvider;
@@ -143,16 +168,6 @@ public class UserProfile implements Entity {
 		this.loginId = loginId;
 	}
 
-	@JsonView({View.Persistence.class, View.Public.class})
-	public Date getCreationTimestamp() {
-		return creationTimestamp;
-	}
-
-	@JsonView(View.Persistence.class)
-	public void setCreationTimestamp(final Date creationTimestamp) {
-		this.creationTimestamp = creationTimestamp;
-	}
-
 	@JsonView({View.Persistence.class, View.Public.class})
 	public Date getLastLoginTimestamp() {
 		return lastLoginTimestamp;
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 4b9614c8b..463cfa98c 100644
--- a/src/main/java/de/thm/arsnova/entities/migration/FromV2Migrator.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/FromV2Migrator.java
@@ -19,7 +19,6 @@ package de.thm.arsnova.entities.migration;
 
 import de.thm.arsnova.entities.ChoiceAnswer;
 import de.thm.arsnova.entities.ChoiceQuestionContent;
-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;
@@ -27,6 +26,7 @@ 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.Entity;
 import de.thm.arsnova.entities.migration.v2.LoggedIn;
 import de.thm.arsnova.entities.migration.v2.MotdList;
 import de.thm.arsnova.entities.migration.v2.Room;
@@ -43,7 +43,7 @@ import java.util.stream.Collectors;
  * @author Daniel Gerhardt
  */
 public class FromV2Migrator {
-	private void copyCommonProperties(final Entity from, final Entity to) {
+	private void copyCommonProperties(final Entity from, final de.thm.arsnova.entities.Entity to) {
 		to.setId(from.getId());
 		to.setRevision(from.getRevision());
 	}
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 da4911236..90924ebba 100644
--- a/src/main/java/de/thm/arsnova/entities/migration/ToV2Migrator.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/ToV2Migrator.java
@@ -18,7 +18,7 @@
 package de.thm.arsnova.entities.migration;
 
 import de.thm.arsnova.entities.ChoiceQuestionContent;
-import de.thm.arsnova.entities.Entity;
+import de.thm.arsnova.entities.migration.v2.Entity;
 import de.thm.arsnova.entities.UserProfile;
 import de.thm.arsnova.entities.migration.v2.Answer;
 import de.thm.arsnova.entities.migration.v2.AnswerOption;
@@ -39,7 +39,7 @@ import java.util.stream.Collectors;
  * @author Daniel Gerhardt
  */
 public class ToV2Migrator {
-	private void copyCommonProperties(final Entity from, final Entity to) {
+	private void copyCommonProperties(final de.thm.arsnova.entities.Entity from, final Entity to) {
 		to.setId(from.getId());
 		to.setRevision(from.getRevision());
 	}
diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/Answer.java b/src/main/java/de/thm/arsnova/entities/migration/v2/Answer.java
index 7c13d76bd..44bbab419 100644
--- a/src/main/java/de/thm/arsnova/entities/migration/v2/Answer.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Answer.java
@@ -19,7 +19,6 @@ package de.thm.arsnova.entities.migration.v2;
 
 import com.fasterxml.jackson.annotation.JsonIgnore;
 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/Comment.java b/src/main/java/de/thm/arsnova/entities/migration/v2/Comment.java
index 9dd6196ee..224a8adaa 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
@@ -18,7 +18,6 @@
 package de.thm.arsnova.entities.migration.v2;
 
 import com.fasterxml.jackson.annotation.JsonView;
-import de.thm.arsnova.entities.Entity;
 import de.thm.arsnova.entities.UserAuthentication;
 import de.thm.arsnova.entities.serialization.View;
 import io.swagger.annotations.ApiModel;
diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/Content.java b/src/main/java/de/thm/arsnova/entities/migration/v2/Content.java
index e372c05e7..30f1ce7a4 100644
--- a/src/main/java/de/thm/arsnova/entities/migration/v2/Content.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Content.java
@@ -18,7 +18,6 @@
 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/DbUser.java b/src/main/java/de/thm/arsnova/entities/migration/v2/DbUser.java
index 539c80c7a..610be70a6 100644
--- a/src/main/java/de/thm/arsnova/entities/migration/v2/DbUser.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/DbUser.java
@@ -18,7 +18,6 @@
 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/migration/v2/Entity.java b/src/main/java/de/thm/arsnova/entities/migration/v2/Entity.java
new file mode 100644
index 000000000..6eda9e8ba
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Entity.java
@@ -0,0 +1,36 @@
+/*
+ * This file is part of ARSnova Backend.
+ * Copyright (C) 2012-2017 The ARSnova Team
+ *
+ * ARSnova Backend is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * ARSnova Backend is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.thm.arsnova.entities.migration.v2;
+
+import com.fasterxml.jackson.annotation.JsonView;
+import de.thm.arsnova.entities.serialization.View;
+
+import java.util.Date;
+
+public interface Entity {
+	String getId();
+	void setId(String id);
+
+	String getRevision();
+	void setRevision(String rev);
+
+	@JsonView(View.Persistence.class)
+	default Class<? extends Entity> getType() {
+		return getClass();
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/LogEntry.java b/src/main/java/de/thm/arsnova/entities/migration/v2/LogEntry.java
new file mode 100644
index 000000000..a4c8b35ab
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/LogEntry.java
@@ -0,0 +1,113 @@
+/*
+ * This file is part of ARSnova Backend.
+ * Copyright (C) 2012-2017 The ARSnova Team
+ *
+ * ARSnova Backend is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * ARSnova Backend is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.thm.arsnova.entities.migration.v2;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonView;
+import de.thm.arsnova.entities.serialization.View;
+
+import java.util.Map;
+
+public class LogEntry implements Entity {
+	public enum LogLevel {
+		TRACE,
+		DEBUG,
+		INFO,
+		WARN,
+		ERROR,
+		FATAL
+	}
+
+	private String id;
+	private String rev;
+	private long timestamp = System.currentTimeMillis();
+	private String event;
+	private int level;
+	private Map<String, Object> payload;
+
+	public LogEntry(@JsonProperty String event, @JsonProperty int level, @JsonProperty Map<String, Object> payload) {
+		this.event = event;
+		this.level = level;
+		this.payload = payload;
+	}
+
+	@JsonView(View.Persistence.class)
+	public String getId() {
+		return id;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setId(final String id) {
+		this.id = id;
+	}
+
+	@JsonView(View.Persistence.class)
+	public String getRevision() {
+		return rev;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setRevision(final String rev) {
+		this.rev = rev;
+	}
+
+	@JsonView(View.Persistence.class)
+	public long getTimestamp() {
+		return timestamp;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setTimestamp(final long timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	@JsonView(View.Persistence.class)
+	public String getEvent() {
+		return event;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setEvent(final String event) {
+		this.event = event;
+	}
+
+	@JsonView(View.Persistence.class)
+	public int getLevel() {
+		return level;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setLevel(final int level) {
+		this.level = level;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setLevel(final LogLevel level) {
+		this.level = level.ordinal();
+	}
+
+	@JsonView(View.Persistence.class)
+	public Map<String, Object> getPayload() {
+		return payload;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setPayload(final Map<String, Object> payload) {
+		this.payload = payload;
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/LoggedIn.java b/src/main/java/de/thm/arsnova/entities/migration/v2/LoggedIn.java
index 2a346db7c..c70e7354b 100644
--- a/src/main/java/de/thm/arsnova/entities/migration/v2/LoggedIn.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/LoggedIn.java
@@ -18,7 +18,6 @@
 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 java.util.ArrayList;
diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/Motd.java b/src/main/java/de/thm/arsnova/entities/migration/v2/Motd.java
new file mode 100644
index 000000000..176f12c2a
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Motd.java
@@ -0,0 +1,169 @@
+/*
+ * This file is part of ARSnova Backend.
+ * Copyright (C) 2012-2017 The ARSnova Team
+ *
+ * ARSnova Backend is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * ARSnova Backend is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.thm.arsnova.entities.migration.v2;
+
+import com.fasterxml.jackson.annotation.JsonView;
+import de.thm.arsnova.entities.serialization.View;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+
+/**
+ * This class represents a message of the day.
+ */
+@ApiModel(value = "motd", description = "the message of the day entity")
+public class Motd implements Entity {
+
+	private String motdkey; //ID
+	private Date startdate;
+	private Date enddate;
+	private String title;
+	private String text;
+	private String audience;
+	private String sessionId;
+	private String sessionkey;
+	private String id;
+	private String rev;
+
+	@ApiModelProperty(required = true, value = "the identification string")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getMotdkey() {
+		return motdkey;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setMotdkey(final String key) {
+		motdkey = key;
+	}
+
+	@ApiModelProperty(required = true, value = "startdate for showing this message (timestamp format)")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public Date getStartdate() {
+		return startdate;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setStartdate(final Date timestamp) {
+		startdate = timestamp;
+	}
+
+	@ApiModelProperty(required = true, value = "enddate for showing this message (timestamp format)")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public Date getEnddate() {
+		return enddate;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setEnddate(final Date timestamp) {
+		enddate = timestamp;
+	}
+
+	@ApiModelProperty(required = true, value = "tite of the message")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getTitle() {
+		return title;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setTitle(final String ttitle) {
+		title = ttitle;
+	}
+
+	@ApiModelProperty(required = true, value = "text of the message")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getText() {
+		return text;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setText(final String ttext) {
+		text = ttext;
+	}
+
+	@ApiModelProperty(required = true, value = "defines the target audience for this motd (one of the following: 'student', 'tutor', 'loggedIn', 'all')")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getAudience() {
+		return audience;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setAudience(final String a) {
+		audience = a;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getSessionId() {
+		return sessionId;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setSessionId(final String sessionId) {
+		this.sessionId = sessionId;
+	}
+
+	@ApiModelProperty(required = true, value = "when audience equals session, the sessionkey referes to the session the messages belong to")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getSessionkey() {
+		return sessionkey;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setSessionkey(final String a) {
+		sessionkey = a;
+	}
+
+	@ApiModelProperty(required = true, value = "the couchDB ID")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getId() {
+		return id;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setId(final String id) {
+		this.id = id;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setRevision(final String rev) {
+		this.rev = rev;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getRevision() {
+		return rev;
+	}
+
+	@Override
+	public int hashCode() {
+		// See http://stackoverflow.com/a/113600
+		final int prim = 37;
+
+		int result = 42;
+		return prim * result + this.motdkey.hashCode();
+	}
+
+	@Override
+	public boolean equals(final Object obj) {
+		if (obj == null || !obj.getClass().equals(this.getClass())) {
+			return false;
+		}
+		Motd other = (Motd) obj;
+		return this.getMotdkey().equals(other.getMotdkey());
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/entities/migration/v2/MotdList.java b/src/main/java/de/thm/arsnova/entities/migration/v2/MotdList.java
index 357e0308a..c817113c5 100644
--- a/src/main/java/de/thm/arsnova/entities/migration/v2/MotdList.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/MotdList.java
@@ -18,7 +18,6 @@
 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/Room.java b/src/main/java/de/thm/arsnova/entities/migration/v2/Room.java
index 205c409cd..82aa5dbed 100644
--- a/src/main/java/de/thm/arsnova/entities/migration/v2/Room.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Room.java
@@ -19,7 +19,6 @@ package de.thm.arsnova.entities.migration.v2;
 
 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.UserAuthentication;
 import de.thm.arsnova.entities.serialization.View;
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 e0d489539..e261d15a1 100644
--- a/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java
+++ b/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java
@@ -23,9 +23,9 @@ 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.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.Entity;
+import de.thm.arsnova.entities.migration.v2.LogEntry;
+import de.thm.arsnova.entities.migration.v2.Motd;
 import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.migration.v2.MotdList;
 import de.thm.arsnova.entities.migration.v2.Room;
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 6bc382efc..4f1e8a4bd 100644
--- a/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java
+++ b/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java
@@ -21,7 +21,7 @@ import com.fasterxml.jackson.annotation.JsonView;
 import de.thm.arsnova.entities.migration.v2.Answer;
 import de.thm.arsnova.entities.migration.v2.Comment;
 import de.thm.arsnova.entities.migration.v2.Content;
-import de.thm.arsnova.entities.Motd;
+import de.thm.arsnova.entities.migration.v2.Motd;
 import de.thm.arsnova.entities.migration.v2.Room;
 import de.thm.arsnova.entities.migration.v2.RoomFeature;
 import de.thm.arsnova.entities.migration.v2.RoomInfo;
diff --git a/src/main/java/de/thm/arsnova/persistance/LogEntryRepository.java b/src/main/java/de/thm/arsnova/persistance/LogEntryRepository.java
index 1515e340c..f6e059a90 100644
--- a/src/main/java/de/thm/arsnova/persistance/LogEntryRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/LogEntryRepository.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.persistance;
 
-import de.thm.arsnova.entities.LogEntry;
+import de.thm.arsnova.entities.migration.v2.LogEntry;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/src/main/java/de/thm/arsnova/persistance/MotdRepository.java b/src/main/java/de/thm/arsnova/persistance/MotdRepository.java
index f403ccb27..e8c8a752e 100644
--- a/src/main/java/de/thm/arsnova/persistance/MotdRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/MotdRepository.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.persistance;
 
-import de.thm.arsnova.entities.Motd;
+import de.thm.arsnova.entities.migration.v2.Motd;
 import org.springframework.data.repository.CrudRepository;
 
 import java.util.List;
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbLogEntryRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbLogEntryRepository.java
index 33abf56ec..c25d5b7b0 100644
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbLogEntryRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbLogEntryRepository.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.persistance.couchdb;
 
-import de.thm.arsnova.entities.LogEntry;
+import de.thm.arsnova.entities.migration.v2.LogEntry;
 import de.thm.arsnova.persistance.LogEntryRepository;
 import org.ektorp.CouchDbConnector;
 import org.ektorp.support.CouchDbRepositorySupport;
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbMotdRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbMotdRepository.java
index d7c5317b9..e0e2650af 100644
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbMotdRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbMotdRepository.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.persistance.couchdb;
 
-import de.thm.arsnova.entities.Motd;
+import de.thm.arsnova.entities.migration.v2.Motd;
 import de.thm.arsnova.persistance.MotdRepository;
 import org.ektorp.CouchDbConnector;
 import org.slf4j.Logger;
diff --git a/src/main/java/de/thm/arsnova/services/DefaultEntityServiceImpl.java b/src/main/java/de/thm/arsnova/services/DefaultEntityServiceImpl.java
index c65f2f09f..69222b3f0 100644
--- a/src/main/java/de/thm/arsnova/services/DefaultEntityServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/services/DefaultEntityServiceImpl.java
@@ -28,6 +28,7 @@ import org.springframework.security.access.prepost.PreFilter;
 
 import java.io.IOException;
 import java.util.Collection;
+import java.util.Date;
 import java.util.Map;
 import java.util.function.Function;
 
@@ -61,6 +62,8 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 		if (entity.getId() != null || entity.getRevision() != null) {
 			throw new IllegalArgumentException("Entity is not new.");
 		}
+		entity.setCreationTimestamp(new Date());
+
 		return repository.save(entity);
 	}
 
@@ -68,6 +71,8 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 	@PreAuthorize("hasPermission(#oldEntity, 'update')")
 	public T update(final T oldEntity, final T newEntity) {
 		newEntity.setId(oldEntity.getId());
+		newEntity.setUpdateTimestamp(new Date());
+
 		return repository.save(newEntity);
 	}
 
@@ -84,6 +89,7 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 		ObjectReader reader = objectMapper.readerForUpdating(obj).withView(View.Public.class);
 		JsonNode tree = objectMapper.valueToTree(changes);
 		reader.readValue(tree);
+		entity.setUpdateTimestamp(new Date());
 
 		return repository.save(entity);
 	}
@@ -102,6 +108,7 @@ public class DefaultEntityServiceImpl<T extends Entity> implements EntityService
 			Object obj = propertyGetter.apply(entity);
 			ObjectReader reader = objectMapper.readerForUpdating(obj).withView(View.Public.class);
 			reader.readValue(tree);
+			entity.setUpdateTimestamp(new Date());
 		}
 
 		return repository.save(entities);
diff --git a/src/main/java/de/thm/arsnova/services/MotdService.java b/src/main/java/de/thm/arsnova/services/MotdService.java
index c0d262c4f..101332699 100644
--- a/src/main/java/de/thm/arsnova/services/MotdService.java
+++ b/src/main/java/de/thm/arsnova/services/MotdService.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.services;
 
-import de.thm.arsnova.entities.Motd;
+import de.thm.arsnova.entities.migration.v2.Motd;
 import de.thm.arsnova.entities.migration.v2.MotdList;
 
 import java.util.Date;
diff --git a/src/main/java/de/thm/arsnova/services/MotdServiceImpl.java b/src/main/java/de/thm/arsnova/services/MotdServiceImpl.java
index 34abcf4b0..c1f826901 100644
--- a/src/main/java/de/thm/arsnova/services/MotdServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/services/MotdServiceImpl.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.services;
 
-import de.thm.arsnova.entities.Motd;
+import de.thm.arsnova.entities.migration.v2.Motd;
 import de.thm.arsnova.entities.migration.v2.MotdList;
 import de.thm.arsnova.entities.migration.v2.Room;
 import de.thm.arsnova.entities.UserAuthentication;
-- 
GitLab