From 284a41c4de4585eae4be7782e0754cc7657d54bb Mon Sep 17 00:00:00 2001
From: Daniel Gerhardt <code@dgerhardt.net>
Date: Tue, 29 Aug 2017 14:10:04 +0200
Subject: [PATCH] Refactor API/entities for contents and answers

---
 .../arsnova/controller/ContentController.java |   4 +-
 .../java/de/thm/arsnova/entities/Answer.java  | 343 +------
 .../de/thm/arsnova/entities/ChoiceAnswer.java |  21 +
 .../entities/ChoiceQuestionContent.java       |  69 ++
 .../java/de/thm/arsnova/entities/Content.java | 850 +----------------
 .../de/thm/arsnova/entities/TextAnswer.java   |  29 +
 .../entities/migration/V2Migrator.java        |  79 ++
 .../arsnova/entities/migration/v2/Answer.java | 362 +++++++
 .../v2/AnswerOption.java}                     |   6 +-
 .../entities/migration/v2/Content.java        | 883 ++++++++++++++++++
 .../CouchDbTypeFieldConverter.java            |   4 +-
 .../transport/AnswerQueueElement.java         |   4 +-
 .../transport/ImportExportSession.java        |   4 +-
 .../thm/arsnova/events/DeleteAnswerEvent.java |   2 +-
 .../arsnova/events/DeleteQuestionEvent.java   |   2 +-
 .../thm/arsnova/events/LockQuestionEvent.java |   2 +-
 .../arsnova/events/LockQuestionsEvent.java    |   2 +-
 .../de/thm/arsnova/events/LockVoteEvent.java  |   2 +-
 .../de/thm/arsnova/events/LockVotesEvent.java |   2 +-
 .../de/thm/arsnova/events/NewAnswerEvent.java |   4 +-
 .../thm/arsnova/events/NewQuestionEvent.java  |   2 +-
 .../arsnova/events/PiRoundCancelEvent.java    |   2 +-
 .../events/PiRoundDelayedStartEvent.java      |   2 +-
 .../thm/arsnova/events/PiRoundEndEvent.java   |   2 +-
 .../thm/arsnova/events/PiRoundResetEvent.java |   2 +-
 .../arsnova/events/UnlockQuestionEvent.java   |   2 +-
 .../arsnova/events/UnlockQuestionsEvent.java  |   2 +-
 .../thm/arsnova/events/UnlockVoteEvent.java   |   2 +-
 .../thm/arsnova/events/UnlockVotesEvent.java  |   2 +-
 .../arsnova/persistance/AnswerRepository.java |   2 +-
 .../persistance/ContentRepository.java        |   2 +-
 .../couchdb/CouchDbAnswerRepository.java      |   3 +-
 .../couchdb/CouchDbContentRepository.java     |   2 +-
 .../ApplicationPermissionEvaluator.java       |   2 +-
 .../thm/arsnova/services/ContentService.java  |   4 +-
 .../arsnova/services/ContentServiceImpl.java  |   4 +-
 .../java/de/thm/arsnova/util/ImageUtils.java  |   2 +-
 .../websocket/ArsnovaSocketioServerImpl.java  |  14 +-
 .../arsnova/websocket/message/Content.java    |   2 +-
 .../de/thm/arsnova/entities/ContentTest.java  |  33 +-
 40 files changed, 1547 insertions(+), 1215 deletions(-)
 create mode 100644 src/main/java/de/thm/arsnova/entities/ChoiceAnswer.java
 create mode 100644 src/main/java/de/thm/arsnova/entities/ChoiceQuestionContent.java
 create mode 100644 src/main/java/de/thm/arsnova/entities/TextAnswer.java
 create mode 100644 src/main/java/de/thm/arsnova/entities/migration/v2/Answer.java
 rename src/main/java/de/thm/arsnova/entities/{PossibleAnswer.java => migration/v2/AnswerOption.java} (92%)
 create mode 100644 src/main/java/de/thm/arsnova/entities/migration/v2/Content.java

diff --git a/src/main/java/de/thm/arsnova/controller/ContentController.java b/src/main/java/de/thm/arsnova/controller/ContentController.java
index e2858bf40..848797f3d 100644
--- a/src/main/java/de/thm/arsnova/controller/ContentController.java
+++ b/src/main/java/de/thm/arsnova/controller/ContentController.java
@@ -18,8 +18,8 @@
 package de.thm.arsnova.controller;
 
 import de.thm.arsnova.util.PaginationListDecorator;
-import de.thm.arsnova.entities.Answer;
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Answer;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.exceptions.BadRequestException;
 import de.thm.arsnova.exceptions.ForbiddenException;
 import de.thm.arsnova.exceptions.NoContentException;
diff --git a/src/main/java/de/thm/arsnova/entities/Answer.java b/src/main/java/de/thm/arsnova/entities/Answer.java
index 50c9a795c..fc2fd9acb 100644
--- a/src/main/java/de/thm/arsnova/entities/Answer.java
+++ b/src/main/java/de/thm/arsnova/entities/Answer.java
@@ -1,363 +1,44 @@
-/*
- * 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.JsonIgnore;
 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.io.Serializable;
-
-/**
- * Both a regular (single choice, evaluation, etc.) as well as a freetext answer.
- *
- * This class has additional fields to transport generated answer statistics.
- */
-@ApiModel(value = "Answer", description = "the answer entity")
-public class Answer implements Entity {
+public abstract class Answer implements Entity {
 	private String id;
 	private String rev;
-	private String type;
-	private String sessionId;
-	private String questionId;
-	private String answerText;
-	private String answerTextRaw;
-	private String answerSubject;
-	private boolean successfulFreeTextAnswer;
-	private String questionVariant;
-	private int questionValue;
-	private int piRound;
-	private String user;
-	private long timestamp;
-	private boolean read;
-	private int answerCount = 1;
-	private boolean abstention;
-	private int abstentionCount;
-	@JsonIgnore
-	private String answerImage;
-	private String answerThumbnailImage;
-
-	public Answer() {
-		this.type = "skill_question_answer";
-	}
+	private String contentId;
 
-	@ApiModelProperty(required = true, value = "the couchDB ID")
+	@Override
 	@JsonView({View.Persistence.class, View.Public.class})
 	public String getId() {
 		return id;
 	}
 
+	@Override
 	@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;
-	}
-
+	@Override
 	@JsonView({View.Persistence.class, View.Public.class})
 	public String getRevision() {
 		return rev;
 	}
 
-	@ApiModelProperty(required = true, value = "ID of the session, the answer is assigned to")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final String getSessionId() {
-		return sessionId;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setSessionId(final String sessionId) {
-		this.sessionId = sessionId;
-	}
-
-	@ApiModelProperty(required = true, value = "used to display question id")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final String getQuestionId() {
-		return questionId;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setQuestionId(final String questionId) {
-		this.questionId = questionId;
-	}
-
-	@ApiModelProperty(required = true, value = "the answer text")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final String getAnswerText() {
-		return answerText;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setAnswerText(final String answerText) {
-		this.answerText = answerText;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final String getAnswerTextRaw() {
-		return this.answerTextRaw;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setAnswerTextRaw(final String answerTextRaw) {
-		this.answerTextRaw = answerTextRaw;
-	}
-
-	@ApiModelProperty(required = true, value = "the answer subject")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final String getAnswerSubject() {
-		return answerSubject;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setAnswerSubject(final String answerSubject) {
-		this.answerSubject = answerSubject;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final boolean isSuccessfulFreeTextAnswer() {
-		return this.successfulFreeTextAnswer;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setSuccessfulFreeTextAnswer(final boolean successfulFreeTextAnswer) {
-		this.successfulFreeTextAnswer = successfulFreeTextAnswer;
-	}
-
-	@ApiModelProperty(required = true, value = "the peer instruction round nr.")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public int getPiRound() {
-		return piRound;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setPiRound(int piRound) {
-		this.piRound = piRound;
-	}
-
-	@ApiModelProperty(required = true, value = "the user")
-	@JsonView(View.Persistence.class)
-	public final String getUser() {
-		return user;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setUser(final String user) {
-		this.user = user;
-	}
-
-	@ApiModelProperty(required = true, value = "the answer image")
-	@JsonView(View.Persistence.class)
-	public String getAnswerImage() {
-		return answerImage;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setAnswerImage(String answerImage) {
-		this.answerImage = answerImage;
-	}
-
-	@ApiModelProperty(required = true, value = "the answer thumbnail")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public String getAnswerThumbnailImage() {
-		return answerThumbnailImage;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setAnswerThumbnailImage(String answerThumbnailImage) {
-		this.answerThumbnailImage = answerThumbnailImage;
-	}
-
-	@ApiModelProperty(required = true, value = "the creation date timestamp")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public long getTimestamp() {
-		return timestamp;
-	}
-
-	@JsonView(View.Persistence.class)
-	public void setTimestamp(long timestamp) {
-		this.timestamp = timestamp;
-	}
-
-	@ApiModelProperty(required = true, value = "displays whether the answer is read")
-	@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;
-	}
-
-	@ApiModelProperty(required = true, value = "the number of answers given. used for statistics")
-	@JsonView(View.Public.class)
-	public final int getAnswerCount() {
-		return answerCount;
-	}
-
-	public final void setAnswerCount(final int answerCount) {
-		this.answerCount = answerCount;
-	}
-
-	@ApiModelProperty(required = true, value = "the abstention")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public boolean isAbstention() {
-		return abstention;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setAbstention(boolean abstention) {
-		this.abstention = abstention;
-	}
-
-	@ApiModelProperty(required = true, value = "the number of abstentions given. used for statistics")
-	@JsonView(View.Public.class)
-	public int getAbstentionCount() {
-		return abstentionCount;
-	}
-
-	public void setAbstentionCount(int abstentionCount) {
-		this.abstentionCount = abstentionCount;
-	}
-
-	@ApiModelProperty(required = true, value = "either lecture or preparation")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public String getQuestionVariant() {
-		return questionVariant;
-	}
-
+	@Override
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setQuestionVariant(String questionVariant) {
-		this.questionVariant = questionVariant;
+	public void setRevision(final String rev) {
+		this.rev = rev;
 	}
 
-	@ApiModelProperty(required = true, value = "used to display question value")
 	@JsonView({View.Persistence.class, View.Public.class})
-	public int getQuestionValue() {
-		return questionValue;
+	public String getContentId() {
+		return contentId;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setQuestionValue(int questionValue) {
-		this.questionValue = questionValue;
-	}
-
-	@Override
-	public final String toString() {
-		return "Answer type:'" + type + "'"
-				+ ", session: " + sessionId
-				+ ", question: " + questionId
-				+ ", subject: " + answerSubject
-				+ ", answerCount: " + answerCount
-				+ ", answer: " + answerText
-				+ ", user: " + user;
-	}
-
-	@Override
-	public int hashCode() {
-		// auto generated!
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((id == null) ? 0 : id.hashCode());
-		result = prime * result + ((rev == null) ? 0 : rev.hashCode());
-		result = prime * result + ((answerSubject == null) ? 0 : answerSubject.hashCode());
-		result = prime * result + ((answerText == null) ? 0 : answerText.hashCode());
-		result = prime * result + piRound;
-		result = prime * result + ((questionId == null) ? 0 : questionId.hashCode());
-		result = prime * result + ((sessionId == null) ? 0 : sessionId.hashCode());
-		result = prime * result + (int) (timestamp ^ (timestamp >>> 32));
-		result = prime * result + ((user == null) ? 0 : user.hashCode());
-		return result;
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		// auto generated!
-		if (this == obj) {
-			return true;
-		}
-		if (obj == null) {
-			return false;
-		}
-		if (getClass() != obj.getClass()) {
-			return false;
-		}
-		Answer other = (Answer) obj;
-		if (id == null) {
-			if (other.id != null) {
-				return false;
-			}
-		} else if (!id.equals(other.id)) {
-			return false;
-		}
-		if (rev == null) {
-			if (other.rev != null) {
-				return false;
-			}
-		} else if (!rev.equals(other.rev)) {
-			return false;
-		}
-		if (answerSubject == null) {
-			if (other.answerSubject != null) {
-				return false;
-			}
-		} else if (!answerSubject.equals(other.answerSubject)) {
-			return false;
-		}
-		if (answerText == null) {
-			if (other.answerText != null) {
-				return false;
-			}
-		} else if (!answerText.equals(other.answerText)) {
-			return false;
-		}
-		if (piRound != other.piRound) {
-			return false;
-		}
-		if (questionId == null) {
-			if (other.questionId != null) {
-				return false;
-			}
-		} else if (!questionId.equals(other.questionId)) {
-			return false;
-		}
-		if (sessionId == null) {
-			if (other.sessionId != null) {
-				return false;
-			}
-		} else if (!sessionId.equals(other.sessionId)) {
-			return false;
-		}
-		if (timestamp != other.timestamp) {
-			return false;
-		}
-		if (user == null) {
-			if (other.user != null) {
-				return false;
-			}
-		} else if (!user.equals(other.user)) {
-			return false;
-		}
-		return true;
+	public void setContentId(final String contentId) {
+		this.contentId = contentId;
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/entities/ChoiceAnswer.java b/src/main/java/de/thm/arsnova/entities/ChoiceAnswer.java
new file mode 100644
index 000000000..1bb6f31b2
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/entities/ChoiceAnswer.java
@@ -0,0 +1,21 @@
+package de.thm.arsnova.entities;
+
+import com.fasterxml.jackson.annotation.JsonView;
+import de.thm.arsnova.entities.migration.v2.AnswerOption;
+import de.thm.arsnova.entities.serialization.View;
+
+import java.util.List;
+
+public class ChoiceAnswer extends Answer {
+	private List<Integer> selectedChoiceIndexes;
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public List<Integer> getSelectedChoiceIndexes() {
+		return selectedChoiceIndexes;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setSelectedChoiceIndexes(final List<Integer> selectedChoiceIndexes) {
+		this.selectedChoiceIndexes = selectedChoiceIndexes;
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/entities/ChoiceQuestionContent.java b/src/main/java/de/thm/arsnova/entities/ChoiceQuestionContent.java
new file mode 100644
index 000000000..ff660b1e6
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/entities/ChoiceQuestionContent.java
@@ -0,0 +1,69 @@
+package de.thm.arsnova.entities;
+
+import com.fasterxml.jackson.annotation.JsonView;
+import de.thm.arsnova.entities.serialization.View;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class ChoiceQuestionContent extends Content {
+	public class AnswerOption {
+		private String label;
+		private int points;
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public String getLabel() {
+			return label;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setLabel(String label) {
+			this.label = label;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public int getPoints() {
+			return points;
+		}
+
+		@JsonView({View.Persistence.class, View.Public.class})
+		public void setPoints(int points) {
+			this.points = points;
+		}
+	}
+
+	private List<AnswerOption> options = new ArrayList<>();
+	private List<Integer> correctOptionIndexes = new ArrayList<>();
+	private boolean multiple;
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public List<AnswerOption> getOptions() {
+		return options;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setOptions(final List<AnswerOption> options) {
+		this.options = options;
+	}
+
+	/* TODO: A new JsonView is needed here. */
+	@JsonView(View.Persistence.class)
+	public List<Integer> getCorrectOptionIndexes() {
+		return correctOptionIndexes;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setCorrectOptionIndexes(final List<Integer> correctOptionIndexes) {
+		this.correctOptionIndexes = correctOptionIndexes;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public boolean isMultiple() {
+		return multiple;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setMultiple(final boolean multiple) {
+		this.multiple = multiple;
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/entities/Content.java b/src/main/java/de/thm/arsnova/entities/Content.java
index 1bcb79434..ccd5d839c 100644
--- a/src/main/java/de/thm/arsnova/entities/Content.java
+++ b/src/main/java/de/thm/arsnova/entities/Content.java
@@ -1,882 +1,88 @@
-/*
- * 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;
-import java.util.List;
-
-/**
- * A question the teacher is asking.
- */
-@ApiModel(value = "content", description = "the content entity")
 public class Content implements Entity {
 	private String id;
 	private String rev;
-	private String questionType;
-	private String questionVariant;
-	private String subject;
-	private String text;
-	private boolean active;
-	private String releasedFor;
-	private List<PossibleAnswer> possibleAnswers;
-	private boolean noCorrect;
-	// TODO: We currently need both sessionId and sessionKeyword, but sessionKeyword will not be persisted.
 	private String sessionId;
-	// This property is needed because the client does not have the session ID, only the keyword.
-	private String sessionKeyword;
-	private long timestamp;
-	private int number;
-	private int duration;
-	private int piRound;
-	private long piRoundEndTime = 0;
-	private long piRoundStartTime = 0;
-	private boolean piRoundFinished = false;
-	private boolean piRoundActive = false;
-	private boolean votingDisabled;
-	private boolean showStatistic; // sic
-	private boolean showAnswer;
-	private boolean abstention;
-	private boolean ignoreCaseSensitive;
-	private boolean ignoreWhitespaces;
-	private boolean ignorePunctuation;
-	private boolean fixedAnswer;
-	private boolean strictMode;
-	private int rating;
-	private String correctAnswer;
-
-	private String image;
-	private String fcImage;
-	private int gridSize;
-	private int offsetX;
-	private int offsetY;
-	private int zoomLvl;
-	private int gridOffsetX;
-	private int gridOffsetY;
-	private int gridZoomLvl;
-	private int gridSizeX;
-	private int gridSizeY;
-	private boolean gridIsHidden;
-	private int imgRotation;
-	private boolean toggleFieldsLeft;
-	private int numClickableFields;
-	private int thresholdCorrectAnswers;
-	private boolean cvIsColored;
-	private String gridLineColor;
-	private int numberOfDots;
-	private String gridType;
-	private String scaleFactor;
-	private String gridScaleFactor;
-	private boolean imageQuestion;
-	private boolean textAnswerEnabled;
-	private String hint;
-	private String solution;
+	private String subject;
+	private String body;
+	private String format;
+	private String group;
 
-	@ApiModelProperty(required = true, value = "the couchDB ID")
+	@Override
 	@JsonView({View.Persistence.class, View.Public.class})
 	public String getId() {
 		return id;
 	}
 
+	@Override
 	@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;
-	}
-
+	@Override
 	@JsonView({View.Persistence.class, View.Public.class})
 	public String getRevision() {
 		return rev;
 	}
 
-	@ApiModelProperty(required = true, value = "the question type")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final String getQuestionType() {
-		return questionType;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setQuestionType(final String questionType) {
-		this.questionType = questionType;
-	}
-
-	@ApiModelProperty(required = true, value = "either lecture or preparation")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final String getQuestionVariant() {
-		return questionVariant;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setQuestionVariant(final String questionVariant) {
-		this.questionVariant = questionVariant;
-	}
-
-	@ApiModelProperty(required = true, value = "used to display subject")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final String getSubject() {
-		return subject;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setSubject(final String subject) {
-		this.subject = subject;
-	}
-
-	@ApiModelProperty(required = true, value = "the text")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final String getText() {
-		return text;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setText(final String text) {
-		this.text = text;
-	}
-
-	@ApiModelProperty(required = true, value = "true for active question")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final boolean isActive() {
-		return active;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setActive(final boolean active) {
-		this.active = active;
-	}
-
-	@ApiModelProperty(required = true, value = "deprecated - previously used to limitate the audience")
-	public final String getReleasedFor() {
-		return releasedFor;
-	}
-
-	public final void setReleasedFor(final String releasedFor) {
-		this.releasedFor = releasedFor;
-	}
-
-	@ApiModelProperty(required = true, value = "list of possible answers")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final List<PossibleAnswer> getPossibleAnswers() {
-		return possibleAnswers;
-	}
-
+	@Override
 	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setPossibleAnswers(final List<PossibleAnswer> possibleAnswers) {
-		this.possibleAnswers = possibleAnswers;
-	}
-
-	@ApiModelProperty(required = true, value = "if true, no answer is marked correct")
-	public final boolean isNoCorrect() {
-		return noCorrect;
-	}
-
-	public final void setNoCorrect(final boolean noCorrect) {
-		this.noCorrect = noCorrect;
+	public void setRevision(final String rev) {
+		this.rev = rev;
 	}
 
-	@ApiModelProperty(required = true, value = "couchDB ID of the session, the question is assigned to")
 	@JsonView({View.Persistence.class, View.Public.class})
-	public final String getSessionId() {
+	public String getSessionId() {
 		return sessionId;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setSessionId(final String sessionId) {
+	public void setSessionId(final String sessionId) {
 		this.sessionId = sessionId;
 	}
 
-	@ApiModelProperty(required = true, value = "couchDB ID of the session, the question is assigned to")
-	public final String getSession() {
-		return sessionId;
-	}
-
-	public final void setSession(final String session) {
-		sessionId = session;
-	}
-
-	@ApiModelProperty(required = true, value = "the session keyword, the question is assigned to")
-	public final String getSessionKeyword() {
-		return sessionKeyword;
-	}
-
-	public final void setSessionKeyword(final String keyword) {
-		sessionKeyword = keyword;
-	}
-
-	@ApiModelProperty(required = true, value = "creation date timestamp")
-	@JsonView(View.Persistence.class)
-	public final long getTimestamp() {
-		return timestamp;
-	}
-
-	@JsonView(View.Persistence.class)
-	public final void setTimestamp(final long timestamp) {
-		this.timestamp = timestamp;
-	}
-
-	@ApiModelProperty(required = true, value = "used to display number")
-	public final int getNumber() {
-		return number;
-	}
-
-	public final void setNumber(final int number) {
-		this.number = number;
-	}
-
-	@ApiModelProperty(required = true, value = "used to display duration")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final int getDuration() {
-		return duration;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setDuration(final int duration) {
-		this.duration = duration;
-	}
-
-	@ApiModelProperty(required = true, value = "true for image question")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final boolean isImageQuestion() {
-		return imageQuestion;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setImageQuestion(boolean imageQuestion) {
-		this.imageQuestion = imageQuestion;
-	}
-
-	@ApiModelProperty(required = true, value = "the peer instruction round no.")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public int getPiRound() {
-		return piRound;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setPiRound(final int piRound) {
-		this.piRound = piRound;
-	}
-
-	@ApiModelProperty(required = true, value = "the peer instruction round end timestamp")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public long getPiRoundEndTime() {
-		return piRoundEndTime;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setPiRoundEndTime(long piRoundEndTime) {
-		this.piRoundEndTime = piRoundEndTime;
-	}
-
-	@ApiModelProperty(required = true, value = "the peer instruction round start timestamp")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public long getPiRoundStartTime() {
-		return piRoundStartTime;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setPiRoundStartTime(long piRoundStartTime) {
-		this.piRoundStartTime = piRoundStartTime;
-	}
-
-	@ApiModelProperty(required = true, value = "true for active peer instruction round")
-	public boolean isPiRoundActive() {
-		return piRoundActive;
-	}
-
-	public void setPiRoundActive(boolean piRoundActive) {
-		this.piRoundActive = piRoundActive;
-	}
-
-	@ApiModelProperty(required = true, value = "true for finished peer instruction round")
-	public boolean isPiRoundFinished() {
-		return piRoundFinished;
-	}
-
-	public void setPiRoundFinished(boolean piRoundFinished) {
-		this.piRoundFinished = piRoundFinished;
-	}
-
-	@ApiModelProperty(required = true, value = "used to display showStatistic")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public boolean isShowStatistic() {
-		return showStatistic;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setShowStatistic(final boolean showStatistic) {
-		this.showStatistic = showStatistic;
-	}
-
-	@ApiModelProperty(required = true, value = "used to display cvIsColored")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public boolean getCvIsColored() {
-		return cvIsColored;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setCvIsColored(boolean cvIsColored) {
-		this.cvIsColored = cvIsColored;
-	}
-
-	@ApiModelProperty(required = true, value = "used to display showAnswer")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public boolean isShowAnswer() {
-		return showAnswer;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setShowAnswer(final boolean showAnswer) {
-		this.showAnswer = showAnswer;
-	}
-
-	@ApiModelProperty(required = true, value = "used to display abstention")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public boolean isAbstention() {
-		return abstention;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setAbstention(final boolean abstention) {
-		this.abstention = abstention;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public boolean isIgnoreCaseSensitive() {
-		return ignoreCaseSensitive;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setIgnoreCaseSensitive(final boolean ignoreCaseSensitive) {
-		this.ignoreCaseSensitive = ignoreCaseSensitive;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public boolean isIgnoreWhitespaces() {
-		return ignoreWhitespaces;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setIgnoreWhitespaces(final boolean ignoreWhitespaces) {
-		this.ignoreWhitespaces = ignoreWhitespaces;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public boolean isIgnorePunctuation() {
-		return ignorePunctuation;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setIgnorePunctuation(final boolean ignorePunctuation) {
-		this.ignorePunctuation = ignorePunctuation;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public boolean isFixedAnswer() {
-		return this.fixedAnswer;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setFixedAnswer(final boolean fixedAnswer) {
-		this.fixedAnswer = fixedAnswer;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public boolean isStrictMode() {
-		return this.strictMode;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setStrictMode(final boolean strictMode) {
-		this.strictMode = strictMode;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final int getRating() {
-		return this.rating;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setRating(final int rating) {
-		this.rating = rating;
-	}
-
 	@JsonView({View.Persistence.class, View.Public.class})
-	public final String getCorrectAnswer() {
-		return correctAnswer;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public final void setCorrectAnswer(final String correctAnswer) {
-		this.correctAnswer = correctAnswer;
-	}
-
-	@ApiModelProperty(required = true, value = "the image")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public String getImage() {
-		return image;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setImage(final String image) {
-		this.image = image;
-	}
-
-	@ApiModelProperty(required = true, value = "the fcImage")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public String getFcImage() {
-		return fcImage;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setFcImage(final String fcImage) {
-		this.fcImage = fcImage;
-	}
-
-	@ApiModelProperty(required = true, value = "the grid size")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public int getGridSize() {
-		return gridSize;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setGridSize(final int gridSize) {
-		this.gridSize = gridSize;
-	}
-
-	@ApiModelProperty(required = true, value = "the image X offset")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public int getOffsetX() {
-		return offsetX;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setOffsetX(final int offsetX) {
-		this.offsetX = offsetX;
-	}
-
-	@ApiModelProperty(required = true, value = "the image Y offset")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public int getOffsetY() {
-		return offsetY;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setOffsetY(final int offsetY) {
-		this.offsetY = offsetY;
-	}
-
-	@ApiModelProperty(required = true, value = "the image zoom level")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public int getZoomLvl() {
-		return zoomLvl;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setZoomLvl(final int zoomLvl) {
-		this.zoomLvl = zoomLvl;
-	}
-
-	@ApiModelProperty(required = true, value = "the grid X offset")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public int getGridOffsetX() {
-		return gridOffsetX;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setGridOffsetX(int gridOffsetX) {
-		this.gridOffsetX = gridOffsetX;
-	}
-
-	@ApiModelProperty(required = true, value = "the grid Y offset")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public int getGridOffsetY() {
-		return gridOffsetY;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setGridOffsetY(int gridOffsetY) {
-		this.gridOffsetY = gridOffsetY;
-	}
-
-	@ApiModelProperty(required = true, value = "the grid zoom lvl")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public int getGridZoomLvl() {
-		return gridZoomLvl;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setGridZoomLvl(int gridZoomLvl) {
-		this.gridZoomLvl = gridZoomLvl;
-	}
-
-	@ApiModelProperty(required = true, value = "the grid X size")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public int getGridSizeX() {
-		return gridSizeX;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setGridSizeX(int gridSizeX) {
-		this.gridSizeX = gridSizeX;
-	}
-
-	@ApiModelProperty(required = true, value = "the grid Y size")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public int getGridSizeY() {
-		return gridSizeY;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setGridSizeY(int gridSizeY) {
-		this.gridSizeY = gridSizeY;
-	}
-
-	@ApiModelProperty(required = true, value = "true for hidden grid")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public boolean getGridIsHidden() {
-		return gridIsHidden;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setGridIsHidden(boolean gridIsHidden) {
-		this.gridIsHidden = gridIsHidden;
-	}
-
-	@ApiModelProperty(required = true, value = "the image rotation")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public int getImgRotation() {
-		return imgRotation;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setImgRotation(int imgRotation) {
-		this.imgRotation = imgRotation;
-	}
-
-	@ApiModelProperty(required = true, value = "the toggled left fields")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public boolean getToggleFieldsLeft() {
-		return toggleFieldsLeft;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setToggleFieldsLeft(boolean toggleFieldsLeft) {
-		this.toggleFieldsLeft = toggleFieldsLeft;
-	}
-
-	@ApiModelProperty(required = true, value = "the number of clickable fields")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public int getNumClickableFields() {
-		return numClickableFields;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setNumClickableFields(int numClickableFields) {
-		this.numClickableFields = numClickableFields;
-	}
-
-	@ApiModelProperty(required = true, value = "the threshold of correct answers")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public int getThresholdCorrectAnswers() {
-		return thresholdCorrectAnswers;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setThresholdCorrectAnswers(int thresholdCorrectAnswers) {
-		this.thresholdCorrectAnswers = thresholdCorrectAnswers;
-	}
-
-	@ApiModelProperty(required = true, value = "the grid line color")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public String getGridLineColor() {
-		return gridLineColor;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setGridLineColor(String gridLineColor) {
-		this.gridLineColor = gridLineColor;
-	}
-
-	@ApiModelProperty(required = true, value = "the number of dots")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public int getNumberOfDots() {
-		return numberOfDots;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setNumberOfDots(int numberOfDots) {
-		this.numberOfDots = numberOfDots;
-	}
-
-	@ApiModelProperty(required = true, value = "the grid type")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public String getGridType() {
-		return gridType;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setGridType(String gridType) {
-		this.gridType = gridType;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setScaleFactor(String scaleFactor) {
-		this.scaleFactor = scaleFactor;
-	}
-
-	@ApiModelProperty(required = true, value = "the image scale factor")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public String getScaleFactor() {
-		return this.scaleFactor;
-	}
-
-	@JsonView({View.Persistence.class, View.Public.class})
-	public void setGridScaleFactor(String scaleFactor) {
-		this.gridScaleFactor = scaleFactor;
-	}
-
-	@ApiModelProperty(required = true, value = "the grid scale factor")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public String getGridScaleFactor() {
-		return this.gridScaleFactor;
-	}
-
-	@ApiModelProperty(required = true, value = "true for a question that can be answered via text")
-	@JsonView({View.Persistence.class, View.Public.class})
-	public boolean isTextAnswerEnabled() {
-		return this.textAnswerEnabled;
+	public String getSubject() {
+		return subject;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setTextAnswerEnabled(boolean textAnswerEnabled) {
-		this.textAnswerEnabled = textAnswerEnabled;
+	public void setSubject(final String subject) {
+		this.subject = subject;
 	}
 
-	@ApiModelProperty(required = true, value = "true for disabled voting")
 	@JsonView({View.Persistence.class, View.Public.class})
-	public boolean isVotingDisabled() {
-		return votingDisabled;
+	public String getBody() {
+		return body;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setVotingDisabled(boolean votingDisabled) {
-		this.votingDisabled = votingDisabled;
+	public void setBody(final String body) {
+		this.body = body;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public String getHint() {
-		return hint;
+	public String getFormat() {
+		return format;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setHint(String hint) {
-		this.hint = hint;
+	public void setFormat(final String format) {
+		this.format = format;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public String getSolution() {
-		return solution;
+	public String getGroup() {
+		return group;
 	}
 
 	@JsonView({View.Persistence.class, View.Public.class})
-	public void setSolution(String solution) {
-		this.solution = solution;
-	}
-
-	@Override
-	public final String toString() {
-		return "Content type '" + questionType + "': " + subject + ";\n" + text + possibleAnswers;
-	}
-
-	@Override
-	public int hashCode() {
-		// auto generated!
-		final int prime = 31;
-		int result = 1;
-		result = prime * result + ((id == null) ? 0 : id.hashCode());
-		return result;
-	}
-
-	@Override
-	public boolean equals(Object obj) {
-		// auto generated!
-		if (this == obj) {
-			return true;
-		}
-		if (obj == null) {
-			return false;
-		}
-		if (getClass() != obj.getClass()) {
-			return false;
-		}
-		Content other = (Content) obj;
-		if (id == null) {
-			if (other.id != null) {
-				return false;
-			}
-		} else if (!id.equals(other.id)) {
-			return false;
-		}
-		return true;
-	}
-
-	public int calculateValue(Answer answer) {
-		if (answer.isAbstention()) {
-			return 0;
-		} else if ("mc".equals(this.questionType)) {
-			return calculateMultipleChoiceValue(answer);
-		} else if ("grid".equals(this.questionType)) {
-			return calculateGridValue(answer);
-		} else {
-			return calculateRegularValue(answer);
-		}
-	}
-
-	public String checkCaseSensitive(String answerText) {
-		if (this.isIgnoreCaseSensitive()) {
-			this.setCorrectAnswer(this.getCorrectAnswer().toLowerCase());
-			return answerText.toLowerCase();
-		}
-		return answerText;
-	}
-	public String checkWhitespaces(String answerText) {
-		if (this.isIgnoreWhitespaces()) {
-			this.setCorrectAnswer(this.getCorrectAnswer().replaceAll("[\\s]", ""));
-			return answerText.replaceAll("[\\s]", "");
-		}
-		return answerText;
-	}
-	public String checkPunctuation(String answerText) {
-		if (this.isIgnorePunctuation()) {
-			this.setCorrectAnswer(this.getCorrectAnswer().replaceAll("\\p{Punct}", ""));
-			return answerText.replaceAll("\\p{Punct}", "");
-		}
-		return answerText;
-	}
-
-	public void checkTextStrictOptions(Answer answer) {
-		answer.setAnswerTextRaw(this.checkCaseSensitive(answer.getAnswerTextRaw()));
-		answer.setAnswerTextRaw(this.checkPunctuation(answer.getAnswerTextRaw()));
-		answer.setAnswerTextRaw(this.checkWhitespaces(answer.getAnswerTextRaw()));
-	}
-
-	public int evaluateCorrectAnswerFixedText(String answerTextRaw) {
-		if (answerTextRaw != null) {
-			if (answerTextRaw.equals(this.getCorrectAnswer())) {
-				return this.getRating();
-			}
-		}
-		return 0;
-	}
-
-	public boolean isSuccessfulFreeTextAnswer(String answerTextRaw) {
-		return answerTextRaw != null && answerTextRaw.equals(this.getCorrectAnswer());
-	}
-
-	public void updateRoundStartVariables(Date start, Date end) {
-		if (this.getPiRound() == 1 && this.isPiRoundFinished()) {
-			this.setPiRound(2);
-		}
-
-		this.setActive(true);
-		this.setShowAnswer(false);
-		this.setPiRoundActive(true);
-		this.setShowStatistic(false);
-		this.setVotingDisabled(false);
-		this.setPiRoundFinished(false);
-		this.setPiRoundStartTime(start.getTime());
-		this.setPiRoundEndTime(end.getTime());
-	}
-
-	public void updateRoundManagementState() {
-		final long time = new Date().getTime();
-
-		if (time > this.getPiRoundEndTime() && this.isPiRoundActive()) {
-			this.setPiRoundEndTime(0);
-			this.setPiRoundStartTime(0);
-			this.setPiRoundActive(false);
-			this.setPiRoundFinished(true);
-		}
-	}
-
-	public void resetRoundManagementState() {
-		this.setPiRoundEndTime(0);
-		this.setPiRoundStartTime(0);
-		this.setVotingDisabled(true);
-		this.setPiRoundActive(false);
-		this.setPiRoundFinished(false);
-		this.setShowStatistic(false);
-		this.setShowAnswer(false);
-	}
-
-	public void resetQuestionState() {
-		this.setPiRoundEndTime(0);
-		this.setPiRoundStartTime(0);
-		this.setPiRoundActive(false);
-		this.setPiRoundFinished(false);
-		this.setVotingDisabled(false);
-
-		if ("freetext".equals(this.getQuestionType())) {
-			this.setPiRound(0);
-		} else {
-			this.setPiRound(1);
-		}
-	}
-
-	private int calculateRegularValue(Answer answer) {
-		String answerText = answer.getAnswerText();
-		for (PossibleAnswer p : this.possibleAnswers) {
-			if (answerText.equals(p.getText())) {
-				return p.getValue();
-			}
-		}
-		return 0;
-	}
-
-	private int calculateGridValue(Answer answer) {
-		int value = 0;
-		String[] answers = answer.getAnswerText().split(",");
-		for (String a : answers) {
-			for (PossibleAnswer p : this.possibleAnswers) {
-				if (a.equals(p.getText())) {
-					value += p.getValue();
-				}
-			}
-		}
-		return value;
-	}
-
-	private int calculateMultipleChoiceValue(Answer answer) {
-		int value = 0;
-		String[] answers = answer.getAnswerText().split(",");
-		for (int i = 0; i < this.possibleAnswers.size() && i < answers.length; i++) {
-			if ("1".equals(answers[i])) {
-				PossibleAnswer p = this.possibleAnswers.get(i);
-				value += p.getValue();
-			}
-		}
-		return value;
+	public void setGroup(final String group) {
+		this.group = group;
 	}
 }
diff --git a/src/main/java/de/thm/arsnova/entities/TextAnswer.java b/src/main/java/de/thm/arsnova/entities/TextAnswer.java
new file mode 100644
index 000000000..1ca7a828c
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/entities/TextAnswer.java
@@ -0,0 +1,29 @@
+package de.thm.arsnova.entities;
+
+import com.fasterxml.jackson.annotation.JsonView;
+import de.thm.arsnova.entities.serialization.View;
+
+public class TextAnswer extends Answer {
+	private String subject;
+	private String body;
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getSubject() {
+		return subject;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setSubject(String subject) {
+		this.subject = subject;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getBody() {
+		return body;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setBody(String body) {
+		this.body = body;
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/entities/migration/V2Migrator.java b/src/main/java/de/thm/arsnova/entities/migration/V2Migrator.java
index 6c007027c..83a84eee5 100644
--- a/src/main/java/de/thm/arsnova/entities/migration/V2Migrator.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/V2Migrator.java
@@ -1,10 +1,89 @@
 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.migration.v2.Answer;
+import de.thm.arsnova.entities.migration.v2.AnswerOption;
+import de.thm.arsnova.entities.migration.v2.Content;
+
+import java.util.ArrayList;
+import java.util.List;
 
 public class V2Migrator {
 	private void copyCommonProperties(final Entity from, final Entity to) {
 		to.setId(from.getId());
 		to.setRevision(from.getRevision());
 	}
+
+	public de.thm.arsnova.entities.Content migrate(final Content from) {
+		de.thm.arsnova.entities.Content to;
+		switch (from.getQuestionType()) {
+			case "abcd":
+			case "mc":
+				ChoiceQuestionContent choiceQuestionContent = new ChoiceQuestionContent();
+				to = choiceQuestionContent;
+				for (int i = 0; i < from.getPossibleAnswers().size(); i++) {
+					de.thm.arsnova.entities.migration.v2.AnswerOption choice = from.getPossibleAnswers().get(i);
+					if (choice.isCorrect()) {
+						choiceQuestionContent.getCorrectOptionIndexes().add(i);
+					}
+				}
+
+				break;
+			case "text":
+				to = new de.thm.arsnova.entities.Content();
+				break;
+			default:
+				throw new IllegalArgumentException("Unsupported content format.");
+		}
+		copyCommonProperties(from, to);
+		to.setSessionId(from.getSessionId());
+		to.setSubject(from.getSubject());
+		to.setBody(from.getText());
+		to.setFormat(from.getQuestionType());
+		to.setGroup(from.getQuestionVariant());
+
+		return to;
+	}
+
+	public de.thm.arsnova.entities.Answer migrate(final Answer from, final Content content) {
+		switch (content.getQuestionType()) {
+			case "abcd":
+			case "mc":
+				return migrate(from, content.getPossibleAnswers());
+			case "text":
+				return migrate(from);
+			default:
+				throw new IllegalArgumentException("Unsupported content format.");
+		}
+	}
+
+	public ChoiceAnswer migrate(final Answer from, final List<AnswerOption> options) {
+		final ChoiceAnswer to = new ChoiceAnswer();
+		copyCommonProperties(from, to);
+		to.setContentId(from.getQuestionId());
+		List<Integer> selectedChoiceIndexes = new ArrayList<>();
+		to.setSelectedChoiceIndexes(selectedChoiceIndexes);
+
+		for (int i = 0; i < options.size(); i++) {
+			AnswerOption choice = options.get(i);
+			if (choice.getText().equals(from.getAnswerText())) {
+				selectedChoiceIndexes.add(i);
+			}
+		}
+
+		return to;
+	}
+
+	public TextAnswer migrate(final Answer from) {
+		final TextAnswer to = new TextAnswer();
+		copyCommonProperties(from, to);
+		to.setContentId(from.getQuestionId());
+		to.setSubject(from.getAnswerSubject());
+		to.setBody(from.getAnswerText());
+
+		return to;
+	}
 }
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
new file mode 100644
index 000000000..7c13d76bd
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Answer.java
@@ -0,0 +1,362 @@
+/*
+ * 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.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;
+
+/**
+ * Both a regular (single choice, evaluation, etc.) as well as a freetext answer.
+ *
+ * This class has additional fields to transport generated answer statistics.
+ */
+@ApiModel(value = "Answer", description = "the answer entity")
+public class Answer implements Entity {
+	private String id;
+	private String rev;
+	private String type;
+	private String sessionId;
+	private String questionId;
+	private String answerText;
+	private String answerTextRaw;
+	private String answerSubject;
+	private boolean successfulFreeTextAnswer;
+	private String questionVariant;
+	private int questionValue;
+	private int piRound;
+	private String user;
+	private long timestamp;
+	private boolean read;
+	private int answerCount = 1;
+	private boolean abstention;
+	private int abstentionCount;
+	@JsonIgnore
+	private String answerImage;
+	private String answerThumbnailImage;
+
+	public Answer() {
+		this.type = "skill_question_answer";
+	}
+
+	@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;
+	}
+
+	@ApiModelProperty(required = true, value = "ID of the session, the answer is assigned to")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final String getSessionId() {
+		return sessionId;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setSessionId(final String sessionId) {
+		this.sessionId = sessionId;
+	}
+
+	@ApiModelProperty(required = true, value = "used to display question id")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final String getQuestionId() {
+		return questionId;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setQuestionId(final String questionId) {
+		this.questionId = questionId;
+	}
+
+	@ApiModelProperty(required = true, value = "the answer text")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final String getAnswerText() {
+		return answerText;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setAnswerText(final String answerText) {
+		this.answerText = answerText;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final String getAnswerTextRaw() {
+		return this.answerTextRaw;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setAnswerTextRaw(final String answerTextRaw) {
+		this.answerTextRaw = answerTextRaw;
+	}
+
+	@ApiModelProperty(required = true, value = "the answer subject")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final String getAnswerSubject() {
+		return answerSubject;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setAnswerSubject(final String answerSubject) {
+		this.answerSubject = answerSubject;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final boolean isSuccessfulFreeTextAnswer() {
+		return this.successfulFreeTextAnswer;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setSuccessfulFreeTextAnswer(final boolean successfulFreeTextAnswer) {
+		this.successfulFreeTextAnswer = successfulFreeTextAnswer;
+	}
+
+	@ApiModelProperty(required = true, value = "the peer instruction round nr.")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getPiRound() {
+		return piRound;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setPiRound(int piRound) {
+		this.piRound = piRound;
+	}
+
+	@ApiModelProperty(required = true, value = "the user")
+	@JsonView(View.Persistence.class)
+	public final String getUser() {
+		return user;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setUser(final String user) {
+		this.user = user;
+	}
+
+	@ApiModelProperty(required = true, value = "the answer image")
+	@JsonView(View.Persistence.class)
+	public String getAnswerImage() {
+		return answerImage;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setAnswerImage(String answerImage) {
+		this.answerImage = answerImage;
+	}
+
+	@ApiModelProperty(required = true, value = "the answer thumbnail")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getAnswerThumbnailImage() {
+		return answerThumbnailImage;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setAnswerThumbnailImage(String answerThumbnailImage) {
+		this.answerThumbnailImage = answerThumbnailImage;
+	}
+
+	@ApiModelProperty(required = true, value = "the creation date timestamp")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public long getTimestamp() {
+		return timestamp;
+	}
+
+	@JsonView(View.Persistence.class)
+	public void setTimestamp(long timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	@ApiModelProperty(required = true, value = "displays whether the answer is read")
+	@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;
+	}
+
+	@ApiModelProperty(required = true, value = "the number of answers given. used for statistics")
+	@JsonView(View.Public.class)
+	public final int getAnswerCount() {
+		return answerCount;
+	}
+
+	public final void setAnswerCount(final int answerCount) {
+		this.answerCount = answerCount;
+	}
+
+	@ApiModelProperty(required = true, value = "the abstention")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public boolean isAbstention() {
+		return abstention;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setAbstention(boolean abstention) {
+		this.abstention = abstention;
+	}
+
+	@ApiModelProperty(required = true, value = "the number of abstentions given. used for statistics")
+	@JsonView(View.Public.class)
+	public int getAbstentionCount() {
+		return abstentionCount;
+	}
+
+	public void setAbstentionCount(int abstentionCount) {
+		this.abstentionCount = abstentionCount;
+	}
+
+	@ApiModelProperty(required = true, value = "either lecture or preparation")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getQuestionVariant() {
+		return questionVariant;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setQuestionVariant(String questionVariant) {
+		this.questionVariant = questionVariant;
+	}
+
+	@ApiModelProperty(required = true, value = "used to display question value")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getQuestionValue() {
+		return questionValue;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setQuestionValue(int questionValue) {
+		this.questionValue = questionValue;
+	}
+
+	@Override
+	public final String toString() {
+		return "Answer type:'" + type + "'"
+				+ ", session: " + sessionId
+				+ ", question: " + questionId
+				+ ", subject: " + answerSubject
+				+ ", answerCount: " + answerCount
+				+ ", answer: " + answerText
+				+ ", user: " + user;
+	}
+
+	@Override
+	public int hashCode() {
+		// auto generated!
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((id == null) ? 0 : id.hashCode());
+		result = prime * result + ((rev == null) ? 0 : rev.hashCode());
+		result = prime * result + ((answerSubject == null) ? 0 : answerSubject.hashCode());
+		result = prime * result + ((answerText == null) ? 0 : answerText.hashCode());
+		result = prime * result + piRound;
+		result = prime * result + ((questionId == null) ? 0 : questionId.hashCode());
+		result = prime * result + ((sessionId == null) ? 0 : sessionId.hashCode());
+		result = prime * result + (int) (timestamp ^ (timestamp >>> 32));
+		result = prime * result + ((user == null) ? 0 : user.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		// auto generated!
+		if (this == obj) {
+			return true;
+		}
+		if (obj == null) {
+			return false;
+		}
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+		Answer other = (Answer) obj;
+		if (id == null) {
+			if (other.id != null) {
+				return false;
+			}
+		} else if (!id.equals(other.id)) {
+			return false;
+		}
+		if (rev == null) {
+			if (other.rev != null) {
+				return false;
+			}
+		} else if (!rev.equals(other.rev)) {
+			return false;
+		}
+		if (answerSubject == null) {
+			if (other.answerSubject != null) {
+				return false;
+			}
+		} else if (!answerSubject.equals(other.answerSubject)) {
+			return false;
+		}
+		if (answerText == null) {
+			if (other.answerText != null) {
+				return false;
+			}
+		} else if (!answerText.equals(other.answerText)) {
+			return false;
+		}
+		if (piRound != other.piRound) {
+			return false;
+		}
+		if (questionId == null) {
+			if (other.questionId != null) {
+				return false;
+			}
+		} else if (!questionId.equals(other.questionId)) {
+			return false;
+		}
+		if (sessionId == null) {
+			if (other.sessionId != null) {
+				return false;
+			}
+		} else if (!sessionId.equals(other.sessionId)) {
+			return false;
+		}
+		if (timestamp != other.timestamp) {
+			return false;
+		}
+		if (user == null) {
+			if (other.user != null) {
+				return false;
+			}
+		} else if (!user.equals(other.user)) {
+			return false;
+		}
+		return true;
+	}
+}
diff --git a/src/main/java/de/thm/arsnova/entities/PossibleAnswer.java b/src/main/java/de/thm/arsnova/entities/migration/v2/AnswerOption.java
similarity index 92%
rename from src/main/java/de/thm/arsnova/entities/PossibleAnswer.java
rename to src/main/java/de/thm/arsnova/entities/migration/v2/AnswerOption.java
index 84e83b2d4..5bd8b152b 100644
--- a/src/main/java/de/thm/arsnova/entities/PossibleAnswer.java
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/AnswerOption.java
@@ -15,7 +15,7 @@
  * You should have received a copy of the GNU General Public License
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
-package de.thm.arsnova.entities;
+package de.thm.arsnova.entities.migration.v2;
 
 import com.fasterxml.jackson.annotation.JsonView;
 import de.thm.arsnova.entities.serialization.View;
@@ -28,7 +28,7 @@ import java.io.Serializable;
  * This class represents an answer option of a question.
  */
 @ApiModel(value = "session/answer", description = "the possible answer entity")
-public class PossibleAnswer implements Serializable {
+public class AnswerOption implements Serializable {
 
 	private String id;
 	private String text;
@@ -79,6 +79,6 @@ public class PossibleAnswer implements Serializable {
 
 	@Override
 	public String toString() {
-		return "PossibleAnswer [id=" + id + ", text=" + text + ", correct=" + correct + "]";
+		return "AnswerOption [id=" + id + ", text=" + text + ", correct=" + correct + "]";
 	}
 }
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
new file mode 100644
index 000000000..e372c05e7
--- /dev/null
+++ b/src/main/java/de/thm/arsnova/entities/migration/v2/Content.java
@@ -0,0 +1,883 @@
+/*
+ * 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.Entity;
+import de.thm.arsnova.entities.serialization.View;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * A question the teacher is asking.
+ */
+@ApiModel(value = "content", description = "the content entity")
+public class Content implements Entity {
+	private String id;
+	private String rev;
+	private String questionType;
+	private String questionVariant;
+	private String subject;
+	private String text;
+	private boolean active;
+	private String releasedFor;
+	private List<AnswerOption> possibleAnswers;
+	private boolean noCorrect;
+	// TODO: We currently need both sessionId and sessionKeyword, but sessionKeyword will not be persisted.
+	private String sessionId;
+	// This property is needed because the client does not have the session ID, only the keyword.
+	private String sessionKeyword;
+	private long timestamp;
+	private int number;
+	private int duration;
+	private int piRound;
+	private long piRoundEndTime = 0;
+	private long piRoundStartTime = 0;
+	private boolean piRoundFinished = false;
+	private boolean piRoundActive = false;
+	private boolean votingDisabled;
+	private boolean showStatistic; // sic
+	private boolean showAnswer;
+	private boolean abstention;
+	private boolean ignoreCaseSensitive;
+	private boolean ignoreWhitespaces;
+	private boolean ignorePunctuation;
+	private boolean fixedAnswer;
+	private boolean strictMode;
+	private int rating;
+	private String correctAnswer;
+
+	private String image;
+	private String fcImage;
+	private int gridSize;
+	private int offsetX;
+	private int offsetY;
+	private int zoomLvl;
+	private int gridOffsetX;
+	private int gridOffsetY;
+	private int gridZoomLvl;
+	private int gridSizeX;
+	private int gridSizeY;
+	private boolean gridIsHidden;
+	private int imgRotation;
+	private boolean toggleFieldsLeft;
+	private int numClickableFields;
+	private int thresholdCorrectAnswers;
+	private boolean cvIsColored;
+	private String gridLineColor;
+	private int numberOfDots;
+	private String gridType;
+	private String scaleFactor;
+	private String gridScaleFactor;
+	private boolean imageQuestion;
+	private boolean textAnswerEnabled;
+	private String hint;
+	private String solution;
+
+	@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;
+	}
+
+	@ApiModelProperty(required = true, value = "the question type")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final String getQuestionType() {
+		return questionType;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setQuestionType(final String questionType) {
+		this.questionType = questionType;
+	}
+
+	@ApiModelProperty(required = true, value = "either lecture or preparation")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final String getQuestionVariant() {
+		return questionVariant;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setQuestionVariant(final String questionVariant) {
+		this.questionVariant = questionVariant;
+	}
+
+	@ApiModelProperty(required = true, value = "used to display subject")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final String getSubject() {
+		return subject;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setSubject(final String subject) {
+		this.subject = subject;
+	}
+
+	@ApiModelProperty(required = true, value = "the text")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final String getText() {
+		return text;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setText(final String text) {
+		this.text = text;
+	}
+
+	@ApiModelProperty(required = true, value = "true for active question")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final boolean isActive() {
+		return active;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setActive(final boolean active) {
+		this.active = active;
+	}
+
+	@ApiModelProperty(required = true, value = "deprecated - previously used to limitate the audience")
+	public final String getReleasedFor() {
+		return releasedFor;
+	}
+
+	public final void setReleasedFor(final String releasedFor) {
+		this.releasedFor = releasedFor;
+	}
+
+	@ApiModelProperty(required = true, value = "list of possible answers")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final List<AnswerOption> getPossibleAnswers() {
+		return possibleAnswers;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setPossibleAnswers(final List<AnswerOption> possibleAnswers) {
+		this.possibleAnswers = possibleAnswers;
+	}
+
+	@ApiModelProperty(required = true, value = "if true, no answer is marked correct")
+	public final boolean isNoCorrect() {
+		return noCorrect;
+	}
+
+	public final void setNoCorrect(final boolean noCorrect) {
+		this.noCorrect = noCorrect;
+	}
+
+	@ApiModelProperty(required = true, value = "couchDB ID of the session, the question is assigned to")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final String getSessionId() {
+		return sessionId;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setSessionId(final String sessionId) {
+		this.sessionId = sessionId;
+	}
+
+	@ApiModelProperty(required = true, value = "couchDB ID of the session, the question is assigned to")
+	public final String getSession() {
+		return sessionId;
+	}
+
+	public final void setSession(final String session) {
+		sessionId = session;
+	}
+
+	@ApiModelProperty(required = true, value = "the session keyword, the question is assigned to")
+	public final String getSessionKeyword() {
+		return sessionKeyword;
+	}
+
+	public final void setSessionKeyword(final String keyword) {
+		sessionKeyword = keyword;
+	}
+
+	@ApiModelProperty(required = true, value = "creation date timestamp")
+	@JsonView(View.Persistence.class)
+	public final long getTimestamp() {
+		return timestamp;
+	}
+
+	@JsonView(View.Persistence.class)
+	public final void setTimestamp(final long timestamp) {
+		this.timestamp = timestamp;
+	}
+
+	@ApiModelProperty(required = true, value = "used to display number")
+	public final int getNumber() {
+		return number;
+	}
+
+	public final void setNumber(final int number) {
+		this.number = number;
+	}
+
+	@ApiModelProperty(required = true, value = "used to display duration")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final int getDuration() {
+		return duration;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setDuration(final int duration) {
+		this.duration = duration;
+	}
+
+	@ApiModelProperty(required = true, value = "true for image question")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final boolean isImageQuestion() {
+		return imageQuestion;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setImageQuestion(boolean imageQuestion) {
+		this.imageQuestion = imageQuestion;
+	}
+
+	@ApiModelProperty(required = true, value = "the peer instruction round no.")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getPiRound() {
+		return piRound;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setPiRound(final int piRound) {
+		this.piRound = piRound;
+	}
+
+	@ApiModelProperty(required = true, value = "the peer instruction round end timestamp")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public long getPiRoundEndTime() {
+		return piRoundEndTime;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setPiRoundEndTime(long piRoundEndTime) {
+		this.piRoundEndTime = piRoundEndTime;
+	}
+
+	@ApiModelProperty(required = true, value = "the peer instruction round start timestamp")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public long getPiRoundStartTime() {
+		return piRoundStartTime;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setPiRoundStartTime(long piRoundStartTime) {
+		this.piRoundStartTime = piRoundStartTime;
+	}
+
+	@ApiModelProperty(required = true, value = "true for active peer instruction round")
+	public boolean isPiRoundActive() {
+		return piRoundActive;
+	}
+
+	public void setPiRoundActive(boolean piRoundActive) {
+		this.piRoundActive = piRoundActive;
+	}
+
+	@ApiModelProperty(required = true, value = "true for finished peer instruction round")
+	public boolean isPiRoundFinished() {
+		return piRoundFinished;
+	}
+
+	public void setPiRoundFinished(boolean piRoundFinished) {
+		this.piRoundFinished = piRoundFinished;
+	}
+
+	@ApiModelProperty(required = true, value = "used to display showStatistic")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public boolean isShowStatistic() {
+		return showStatistic;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setShowStatistic(final boolean showStatistic) {
+		this.showStatistic = showStatistic;
+	}
+
+	@ApiModelProperty(required = true, value = "used to display cvIsColored")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public boolean getCvIsColored() {
+		return cvIsColored;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setCvIsColored(boolean cvIsColored) {
+		this.cvIsColored = cvIsColored;
+	}
+
+	@ApiModelProperty(required = true, value = "used to display showAnswer")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public boolean isShowAnswer() {
+		return showAnswer;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setShowAnswer(final boolean showAnswer) {
+		this.showAnswer = showAnswer;
+	}
+
+	@ApiModelProperty(required = true, value = "used to display abstention")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public boolean isAbstention() {
+		return abstention;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setAbstention(final boolean abstention) {
+		this.abstention = abstention;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public boolean isIgnoreCaseSensitive() {
+		return ignoreCaseSensitive;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setIgnoreCaseSensitive(final boolean ignoreCaseSensitive) {
+		this.ignoreCaseSensitive = ignoreCaseSensitive;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public boolean isIgnoreWhitespaces() {
+		return ignoreWhitespaces;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setIgnoreWhitespaces(final boolean ignoreWhitespaces) {
+		this.ignoreWhitespaces = ignoreWhitespaces;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public boolean isIgnorePunctuation() {
+		return ignorePunctuation;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setIgnorePunctuation(final boolean ignorePunctuation) {
+		this.ignorePunctuation = ignorePunctuation;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public boolean isFixedAnswer() {
+		return this.fixedAnswer;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setFixedAnswer(final boolean fixedAnswer) {
+		this.fixedAnswer = fixedAnswer;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public boolean isStrictMode() {
+		return this.strictMode;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setStrictMode(final boolean strictMode) {
+		this.strictMode = strictMode;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final int getRating() {
+		return this.rating;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setRating(final int rating) {
+		this.rating = rating;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final String getCorrectAnswer() {
+		return correctAnswer;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public final void setCorrectAnswer(final String correctAnswer) {
+		this.correctAnswer = correctAnswer;
+	}
+
+	@ApiModelProperty(required = true, value = "the image")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getImage() {
+		return image;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setImage(final String image) {
+		this.image = image;
+	}
+
+	@ApiModelProperty(required = true, value = "the fcImage")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getFcImage() {
+		return fcImage;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setFcImage(final String fcImage) {
+		this.fcImage = fcImage;
+	}
+
+	@ApiModelProperty(required = true, value = "the grid size")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getGridSize() {
+		return gridSize;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setGridSize(final int gridSize) {
+		this.gridSize = gridSize;
+	}
+
+	@ApiModelProperty(required = true, value = "the image X offset")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getOffsetX() {
+		return offsetX;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setOffsetX(final int offsetX) {
+		this.offsetX = offsetX;
+	}
+
+	@ApiModelProperty(required = true, value = "the image Y offset")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getOffsetY() {
+		return offsetY;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setOffsetY(final int offsetY) {
+		this.offsetY = offsetY;
+	}
+
+	@ApiModelProperty(required = true, value = "the image zoom level")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getZoomLvl() {
+		return zoomLvl;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setZoomLvl(final int zoomLvl) {
+		this.zoomLvl = zoomLvl;
+	}
+
+	@ApiModelProperty(required = true, value = "the grid X offset")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getGridOffsetX() {
+		return gridOffsetX;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setGridOffsetX(int gridOffsetX) {
+		this.gridOffsetX = gridOffsetX;
+	}
+
+	@ApiModelProperty(required = true, value = "the grid Y offset")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getGridOffsetY() {
+		return gridOffsetY;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setGridOffsetY(int gridOffsetY) {
+		this.gridOffsetY = gridOffsetY;
+	}
+
+	@ApiModelProperty(required = true, value = "the grid zoom lvl")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getGridZoomLvl() {
+		return gridZoomLvl;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setGridZoomLvl(int gridZoomLvl) {
+		this.gridZoomLvl = gridZoomLvl;
+	}
+
+	@ApiModelProperty(required = true, value = "the grid X size")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getGridSizeX() {
+		return gridSizeX;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setGridSizeX(int gridSizeX) {
+		this.gridSizeX = gridSizeX;
+	}
+
+	@ApiModelProperty(required = true, value = "the grid Y size")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getGridSizeY() {
+		return gridSizeY;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setGridSizeY(int gridSizeY) {
+		this.gridSizeY = gridSizeY;
+	}
+
+	@ApiModelProperty(required = true, value = "true for hidden grid")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public boolean getGridIsHidden() {
+		return gridIsHidden;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setGridIsHidden(boolean gridIsHidden) {
+		this.gridIsHidden = gridIsHidden;
+	}
+
+	@ApiModelProperty(required = true, value = "the image rotation")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getImgRotation() {
+		return imgRotation;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setImgRotation(int imgRotation) {
+		this.imgRotation = imgRotation;
+	}
+
+	@ApiModelProperty(required = true, value = "the toggled left fields")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public boolean getToggleFieldsLeft() {
+		return toggleFieldsLeft;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setToggleFieldsLeft(boolean toggleFieldsLeft) {
+		this.toggleFieldsLeft = toggleFieldsLeft;
+	}
+
+	@ApiModelProperty(required = true, value = "the number of clickable fields")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getNumClickableFields() {
+		return numClickableFields;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setNumClickableFields(int numClickableFields) {
+		this.numClickableFields = numClickableFields;
+	}
+
+	@ApiModelProperty(required = true, value = "the threshold of correct answers")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getThresholdCorrectAnswers() {
+		return thresholdCorrectAnswers;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setThresholdCorrectAnswers(int thresholdCorrectAnswers) {
+		this.thresholdCorrectAnswers = thresholdCorrectAnswers;
+	}
+
+	@ApiModelProperty(required = true, value = "the grid line color")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getGridLineColor() {
+		return gridLineColor;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setGridLineColor(String gridLineColor) {
+		this.gridLineColor = gridLineColor;
+	}
+
+	@ApiModelProperty(required = true, value = "the number of dots")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public int getNumberOfDots() {
+		return numberOfDots;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setNumberOfDots(int numberOfDots) {
+		this.numberOfDots = numberOfDots;
+	}
+
+	@ApiModelProperty(required = true, value = "the grid type")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getGridType() {
+		return gridType;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setGridType(String gridType) {
+		this.gridType = gridType;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setScaleFactor(String scaleFactor) {
+		this.scaleFactor = scaleFactor;
+	}
+
+	@ApiModelProperty(required = true, value = "the image scale factor")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getScaleFactor() {
+		return this.scaleFactor;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setGridScaleFactor(String scaleFactor) {
+		this.gridScaleFactor = scaleFactor;
+	}
+
+	@ApiModelProperty(required = true, value = "the grid scale factor")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getGridScaleFactor() {
+		return this.gridScaleFactor;
+	}
+
+	@ApiModelProperty(required = true, value = "true for a question that can be answered via text")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public boolean isTextAnswerEnabled() {
+		return this.textAnswerEnabled;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setTextAnswerEnabled(boolean textAnswerEnabled) {
+		this.textAnswerEnabled = textAnswerEnabled;
+	}
+
+	@ApiModelProperty(required = true, value = "true for disabled voting")
+	@JsonView({View.Persistence.class, View.Public.class})
+	public boolean isVotingDisabled() {
+		return votingDisabled;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setVotingDisabled(boolean votingDisabled) {
+		this.votingDisabled = votingDisabled;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getHint() {
+		return hint;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setHint(String hint) {
+		this.hint = hint;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public String getSolution() {
+		return solution;
+	}
+
+	@JsonView({View.Persistence.class, View.Public.class})
+	public void setSolution(String solution) {
+		this.solution = solution;
+	}
+
+	@Override
+	public final String toString() {
+		return "Content type '" + questionType + "': " + subject + ";\n" + text + possibleAnswers;
+	}
+
+	@Override
+	public int hashCode() {
+		// auto generated!
+		final int prime = 31;
+		int result = 1;
+		result = prime * result + ((id == null) ? 0 : id.hashCode());
+		return result;
+	}
+
+	@Override
+	public boolean equals(Object obj) {
+		// auto generated!
+		if (this == obj) {
+			return true;
+		}
+		if (obj == null) {
+			return false;
+		}
+		if (getClass() != obj.getClass()) {
+			return false;
+		}
+		Content other = (Content) obj;
+		if (id == null) {
+			if (other.id != null) {
+				return false;
+			}
+		} else if (!id.equals(other.id)) {
+			return false;
+		}
+		return true;
+	}
+
+	public int calculateValue(Answer answer) {
+		if (answer.isAbstention()) {
+			return 0;
+		} else if ("mc".equals(this.questionType)) {
+			return calculateMultipleChoiceValue(answer);
+		} else if ("grid".equals(this.questionType)) {
+			return calculateGridValue(answer);
+		} else {
+			return calculateRegularValue(answer);
+		}
+	}
+
+	public String checkCaseSensitive(String answerText) {
+		if (this.isIgnoreCaseSensitive()) {
+			this.setCorrectAnswer(this.getCorrectAnswer().toLowerCase());
+			return answerText.toLowerCase();
+		}
+		return answerText;
+	}
+	public String checkWhitespaces(String answerText) {
+		if (this.isIgnoreWhitespaces()) {
+			this.setCorrectAnswer(this.getCorrectAnswer().replaceAll("[\\s]", ""));
+			return answerText.replaceAll("[\\s]", "");
+		}
+		return answerText;
+	}
+	public String checkPunctuation(String answerText) {
+		if (this.isIgnorePunctuation()) {
+			this.setCorrectAnswer(this.getCorrectAnswer().replaceAll("\\p{Punct}", ""));
+			return answerText.replaceAll("\\p{Punct}", "");
+		}
+		return answerText;
+	}
+
+	public void checkTextStrictOptions(Answer answer) {
+		answer.setAnswerTextRaw(this.checkCaseSensitive(answer.getAnswerTextRaw()));
+		answer.setAnswerTextRaw(this.checkPunctuation(answer.getAnswerTextRaw()));
+		answer.setAnswerTextRaw(this.checkWhitespaces(answer.getAnswerTextRaw()));
+	}
+
+	public int evaluateCorrectAnswerFixedText(String answerTextRaw) {
+		if (answerTextRaw != null) {
+			if (answerTextRaw.equals(this.getCorrectAnswer())) {
+				return this.getRating();
+			}
+		}
+		return 0;
+	}
+
+	public boolean isSuccessfulFreeTextAnswer(String answerTextRaw) {
+		return answerTextRaw != null && answerTextRaw.equals(this.getCorrectAnswer());
+	}
+
+	public void updateRoundStartVariables(Date start, Date end) {
+		if (this.getPiRound() == 1 && this.isPiRoundFinished()) {
+			this.setPiRound(2);
+		}
+
+		this.setActive(true);
+		this.setShowAnswer(false);
+		this.setPiRoundActive(true);
+		this.setShowStatistic(false);
+		this.setVotingDisabled(false);
+		this.setPiRoundFinished(false);
+		this.setPiRoundStartTime(start.getTime());
+		this.setPiRoundEndTime(end.getTime());
+	}
+
+	public void updateRoundManagementState() {
+		final long time = new Date().getTime();
+
+		if (time > this.getPiRoundEndTime() && this.isPiRoundActive()) {
+			this.setPiRoundEndTime(0);
+			this.setPiRoundStartTime(0);
+			this.setPiRoundActive(false);
+			this.setPiRoundFinished(true);
+		}
+	}
+
+	public void resetRoundManagementState() {
+		this.setPiRoundEndTime(0);
+		this.setPiRoundStartTime(0);
+		this.setVotingDisabled(true);
+		this.setPiRoundActive(false);
+		this.setPiRoundFinished(false);
+		this.setShowStatistic(false);
+		this.setShowAnswer(false);
+	}
+
+	public void resetQuestionState() {
+		this.setPiRoundEndTime(0);
+		this.setPiRoundStartTime(0);
+		this.setPiRoundActive(false);
+		this.setPiRoundFinished(false);
+		this.setVotingDisabled(false);
+
+		if ("freetext".equals(this.getQuestionType())) {
+			this.setPiRound(0);
+		} else {
+			this.setPiRound(1);
+		}
+	}
+
+	private int calculateRegularValue(Answer answer) {
+		String answerText = answer.getAnswerText();
+		for (AnswerOption p : this.possibleAnswers) {
+			if (answerText.equals(p.getText())) {
+				return p.getValue();
+			}
+		}
+		return 0;
+	}
+
+	private int calculateGridValue(Answer answer) {
+		int value = 0;
+		String[] answers = answer.getAnswerText().split(",");
+		for (String a : answers) {
+			for (AnswerOption p : this.possibleAnswers) {
+				if (a.equals(p.getText())) {
+					value += p.getValue();
+				}
+			}
+		}
+		return value;
+	}
+
+	private int calculateMultipleChoiceValue(Answer answer) {
+		int value = 0;
+		String[] answers = answer.getAnswerText().split(",");
+		for (int i = 0; i < this.possibleAnswers.size() && i < answers.length; i++) {
+			if ("1".equals(answers[i])) {
+				AnswerOption p = this.possibleAnswers.get(i);
+				value += p.getValue();
+			}
+		}
+		return value;
+	}
+}
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 848955229..6993b84f1 100644
--- a/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java
+++ b/src/main/java/de/thm/arsnova/entities/serialization/CouchDbTypeFieldConverter.java
@@ -20,13 +20,13 @@ package de.thm.arsnova.entities.serialization;
 import com.fasterxml.jackson.databind.JavaType;
 import com.fasterxml.jackson.databind.type.TypeFactory;
 import com.fasterxml.jackson.databind.util.Converter;
-import de.thm.arsnova.entities.Answer;
+import de.thm.arsnova.entities.migration.v2.Answer;
 import de.thm.arsnova.entities.Comment;
 import de.thm.arsnova.entities.DbUser;
 import de.thm.arsnova.entities.Entity;
 import de.thm.arsnova.entities.LogEntry;
 import de.thm.arsnova.entities.Motd;
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.MotdList;
 import de.thm.arsnova.entities.Session;
 
diff --git a/src/main/java/de/thm/arsnova/entities/transport/AnswerQueueElement.java b/src/main/java/de/thm/arsnova/entities/transport/AnswerQueueElement.java
index 6e0346f8f..be1b1e6ba 100644
--- a/src/main/java/de/thm/arsnova/entities/transport/AnswerQueueElement.java
+++ b/src/main/java/de/thm/arsnova/entities/transport/AnswerQueueElement.java
@@ -17,8 +17,8 @@
  */
 package de.thm.arsnova.entities.transport;
 
-import de.thm.arsnova.entities.Answer;
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Answer;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.User;
 
diff --git a/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java b/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java
index fed5f051f..5ebaca6e1 100644
--- a/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java
+++ b/src/main/java/de/thm/arsnova/entities/transport/ImportExportSession.java
@@ -18,9 +18,9 @@
 package de.thm.arsnova.entities.transport;
 
 import com.fasterxml.jackson.annotation.JsonView;
-import de.thm.arsnova.entities.Answer;
+import de.thm.arsnova.entities.migration.v2.Answer;
 import de.thm.arsnova.entities.Comment;
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Motd;
 import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.SessionFeature;
diff --git a/src/main/java/de/thm/arsnova/events/DeleteAnswerEvent.java b/src/main/java/de/thm/arsnova/events/DeleteAnswerEvent.java
index 5b303ac42..bda39f5d8 100644
--- a/src/main/java/de/thm/arsnova/events/DeleteAnswerEvent.java
+++ b/src/main/java/de/thm/arsnova/events/DeleteAnswerEvent.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.events;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 
 /**
diff --git a/src/main/java/de/thm/arsnova/events/DeleteQuestionEvent.java b/src/main/java/de/thm/arsnova/events/DeleteQuestionEvent.java
index 2cf1a8313..d9a735008 100644
--- a/src/main/java/de/thm/arsnova/events/DeleteQuestionEvent.java
+++ b/src/main/java/de/thm/arsnova/events/DeleteQuestionEvent.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.events;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 
 /**
diff --git a/src/main/java/de/thm/arsnova/events/LockQuestionEvent.java b/src/main/java/de/thm/arsnova/events/LockQuestionEvent.java
index 506ae9183..26a74e126 100644
--- a/src/main/java/de/thm/arsnova/events/LockQuestionEvent.java
+++ b/src/main/java/de/thm/arsnova/events/LockQuestionEvent.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.events;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 
 /**
diff --git a/src/main/java/de/thm/arsnova/events/LockQuestionsEvent.java b/src/main/java/de/thm/arsnova/events/LockQuestionsEvent.java
index 85d501ed0..cfe6bf95d 100644
--- a/src/main/java/de/thm/arsnova/events/LockQuestionsEvent.java
+++ b/src/main/java/de/thm/arsnova/events/LockQuestionsEvent.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.events;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 
 import java.util.List;
diff --git a/src/main/java/de/thm/arsnova/events/LockVoteEvent.java b/src/main/java/de/thm/arsnova/events/LockVoteEvent.java
index 4cdf67968..f55f84de1 100644
--- a/src/main/java/de/thm/arsnova/events/LockVoteEvent.java
+++ b/src/main/java/de/thm/arsnova/events/LockVoteEvent.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.events;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 
 import java.util.HashMap;
diff --git a/src/main/java/de/thm/arsnova/events/LockVotesEvent.java b/src/main/java/de/thm/arsnova/events/LockVotesEvent.java
index fc469749f..a4c4d5b42 100644
--- a/src/main/java/de/thm/arsnova/events/LockVotesEvent.java
+++ b/src/main/java/de/thm/arsnova/events/LockVotesEvent.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.events;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 
 import java.util.List;
diff --git a/src/main/java/de/thm/arsnova/events/NewAnswerEvent.java b/src/main/java/de/thm/arsnova/events/NewAnswerEvent.java
index 649e241ef..94ccc2488 100644
--- a/src/main/java/de/thm/arsnova/events/NewAnswerEvent.java
+++ b/src/main/java/de/thm/arsnova/events/NewAnswerEvent.java
@@ -17,8 +17,8 @@
  */
 package de.thm.arsnova.events;
 
-import de.thm.arsnova.entities.Answer;
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Answer;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.User;
 
diff --git a/src/main/java/de/thm/arsnova/events/NewQuestionEvent.java b/src/main/java/de/thm/arsnova/events/NewQuestionEvent.java
index 4b638229b..1176a3f9b 100644
--- a/src/main/java/de/thm/arsnova/events/NewQuestionEvent.java
+++ b/src/main/java/de/thm/arsnova/events/NewQuestionEvent.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.events;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 
 /**
diff --git a/src/main/java/de/thm/arsnova/events/PiRoundCancelEvent.java b/src/main/java/de/thm/arsnova/events/PiRoundCancelEvent.java
index 48fb6796d..79abfeb0f 100644
--- a/src/main/java/de/thm/arsnova/events/PiRoundCancelEvent.java
+++ b/src/main/java/de/thm/arsnova/events/PiRoundCancelEvent.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.events;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 
 /**
diff --git a/src/main/java/de/thm/arsnova/events/PiRoundDelayedStartEvent.java b/src/main/java/de/thm/arsnova/events/PiRoundDelayedStartEvent.java
index 26da09430..ec93fff87 100644
--- a/src/main/java/de/thm/arsnova/events/PiRoundDelayedStartEvent.java
+++ b/src/main/java/de/thm/arsnova/events/PiRoundDelayedStartEvent.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.events;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 
 import java.util.HashMap;
diff --git a/src/main/java/de/thm/arsnova/events/PiRoundEndEvent.java b/src/main/java/de/thm/arsnova/events/PiRoundEndEvent.java
index edaa084e8..868996e0b 100644
--- a/src/main/java/de/thm/arsnova/events/PiRoundEndEvent.java
+++ b/src/main/java/de/thm/arsnova/events/PiRoundEndEvent.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.events;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 
 import java.util.HashMap;
diff --git a/src/main/java/de/thm/arsnova/events/PiRoundResetEvent.java b/src/main/java/de/thm/arsnova/events/PiRoundResetEvent.java
index 3ff1a9d81..d869b20ec 100644
--- a/src/main/java/de/thm/arsnova/events/PiRoundResetEvent.java
+++ b/src/main/java/de/thm/arsnova/events/PiRoundResetEvent.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.events;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 
 import java.util.HashMap;
diff --git a/src/main/java/de/thm/arsnova/events/UnlockQuestionEvent.java b/src/main/java/de/thm/arsnova/events/UnlockQuestionEvent.java
index f38fe0af5..e5bc95e89 100644
--- a/src/main/java/de/thm/arsnova/events/UnlockQuestionEvent.java
+++ b/src/main/java/de/thm/arsnova/events/UnlockQuestionEvent.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.events;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 
 /**
diff --git a/src/main/java/de/thm/arsnova/events/UnlockQuestionsEvent.java b/src/main/java/de/thm/arsnova/events/UnlockQuestionsEvent.java
index 53ccddeba..555349b43 100644
--- a/src/main/java/de/thm/arsnova/events/UnlockQuestionsEvent.java
+++ b/src/main/java/de/thm/arsnova/events/UnlockQuestionsEvent.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.events;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 
 import java.util.List;
diff --git a/src/main/java/de/thm/arsnova/events/UnlockVoteEvent.java b/src/main/java/de/thm/arsnova/events/UnlockVoteEvent.java
index 605defea4..109555edd 100644
--- a/src/main/java/de/thm/arsnova/events/UnlockVoteEvent.java
+++ b/src/main/java/de/thm/arsnova/events/UnlockVoteEvent.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.events;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 
 import java.util.HashMap;
diff --git a/src/main/java/de/thm/arsnova/events/UnlockVotesEvent.java b/src/main/java/de/thm/arsnova/events/UnlockVotesEvent.java
index bbdd513ae..83bd98bf1 100644
--- a/src/main/java/de/thm/arsnova/events/UnlockVotesEvent.java
+++ b/src/main/java/de/thm/arsnova/events/UnlockVotesEvent.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.events;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 
 import java.util.List;
diff --git a/src/main/java/de/thm/arsnova/persistance/AnswerRepository.java b/src/main/java/de/thm/arsnova/persistance/AnswerRepository.java
index 67db63626..6e3e0ff33 100644
--- a/src/main/java/de/thm/arsnova/persistance/AnswerRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/AnswerRepository.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.persistance;
 
-import de.thm.arsnova.entities.Answer;
+import de.thm.arsnova.entities.migration.v2.Answer;
 import de.thm.arsnova.entities.User;
 import org.springframework.data.repository.CrudRepository;
 
diff --git a/src/main/java/de/thm/arsnova/persistance/ContentRepository.java b/src/main/java/de/thm/arsnova/persistance/ContentRepository.java
index 9dbef6ce1..5e0113d1e 100644
--- a/src/main/java/de/thm/arsnova/persistance/ContentRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/ContentRepository.java
@@ -1,6 +1,6 @@
 package de.thm.arsnova.persistance;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.User;
 import org.springframework.data.repository.CrudRepository;
 
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbAnswerRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbAnswerRepository.java
index 96f8e43ed..6488e5931 100644
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbAnswerRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbAnswerRepository.java
@@ -2,7 +2,7 @@ package de.thm.arsnova.persistance.couchdb;
 
 import com.fasterxml.jackson.databind.JsonNode;
 import com.google.common.collect.Lists;
-import de.thm.arsnova.entities.Answer;
+import de.thm.arsnova.entities.migration.v2.Answer;
 import de.thm.arsnova.entities.User;
 import de.thm.arsnova.persistance.AnswerRepository;
 import de.thm.arsnova.persistance.LogEntryRepository;
@@ -11,7 +11,6 @@ import org.ektorp.ComplexKey;
 import org.ektorp.CouchDbConnector;
 import org.ektorp.DbAccessException;
 import org.ektorp.DocumentOperationResult;
-import org.ektorp.UpdateConflictException;
 import org.ektorp.ViewResult;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbContentRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbContentRepository.java
index ab9934fd1..85ae69218 100644
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbContentRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbContentRepository.java
@@ -1,6 +1,6 @@
 package de.thm.arsnova.persistance.couchdb;
 
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.User;
 import de.thm.arsnova.persistance.ContentRepository;
 import de.thm.arsnova.persistance.LogEntryRepository;
diff --git a/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java b/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java
index b20639d86..965073a35 100644
--- a/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java
+++ b/src/main/java/de/thm/arsnova/security/ApplicationPermissionEvaluator.java
@@ -18,7 +18,7 @@
 package de.thm.arsnova.security;
 
 import de.thm.arsnova.entities.Comment;
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.User;
 import de.thm.arsnova.persistance.CommentRepository;
diff --git a/src/main/java/de/thm/arsnova/services/ContentService.java b/src/main/java/de/thm/arsnova/services/ContentService.java
index 9dbb6db5f..406de8ef7 100644
--- a/src/main/java/de/thm/arsnova/services/ContentService.java
+++ b/src/main/java/de/thm/arsnova/services/ContentService.java
@@ -17,8 +17,8 @@
  */
 package de.thm.arsnova.services;
 
-import de.thm.arsnova.entities.Answer;
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Answer;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.User;
 
 import java.util.List;
diff --git a/src/main/java/de/thm/arsnova/services/ContentServiceImpl.java b/src/main/java/de/thm/arsnova/services/ContentServiceImpl.java
index 7c2c92a9b..fc1d060fb 100644
--- a/src/main/java/de/thm/arsnova/services/ContentServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/services/ContentServiceImpl.java
@@ -20,8 +20,8 @@ package de.thm.arsnova.services;
 import de.thm.arsnova.entities.transport.AnswerQueueElement;
 import de.thm.arsnova.persistance.LogEntryRepository;
 import de.thm.arsnova.util.ImageUtils;
-import de.thm.arsnova.entities.Answer;
-import de.thm.arsnova.entities.Content;
+import de.thm.arsnova.entities.migration.v2.Answer;
+import de.thm.arsnova.entities.migration.v2.Content;
 import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.User;
 import de.thm.arsnova.events.*;
diff --git a/src/main/java/de/thm/arsnova/util/ImageUtils.java b/src/main/java/de/thm/arsnova/util/ImageUtils.java
index 9b79795b5..bdfdfc272 100644
--- a/src/main/java/de/thm/arsnova/util/ImageUtils.java
+++ b/src/main/java/de/thm/arsnova/util/ImageUtils.java
@@ -17,7 +17,7 @@
  */
 package de.thm.arsnova.util;
 
-import de.thm.arsnova.entities.Answer;
+import de.thm.arsnova.entities.migration.v2.Answer;
 import org.apache.commons.codec.binary.Base64;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
diff --git a/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java b/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java
index 6ceddaa77..9c3f88c20 100644
--- a/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java
+++ b/src/main/java/de/thm/arsnova/websocket/ArsnovaSocketioServerImpl.java
@@ -444,9 +444,9 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		broadcastInSession(session.getKeyword(), "audQuestionAvail", audienceQuestion.getId());
 	}
 
-	public void reportLecturerQuestionAvailable(final de.thm.arsnova.entities.Session session, final List<de.thm.arsnova.entities.Content> qs) {
+	public void reportLecturerQuestionAvailable(final de.thm.arsnova.entities.Session session, final List<de.thm.arsnova.entities.migration.v2.Content> qs) {
 		List<Content> contents = new ArrayList<>();
-		for (de.thm.arsnova.entities.Content q : qs) {
+		for (de.thm.arsnova.entities.migration.v2.Content q : qs) {
 			contents.add(new Content(q));
 		}
 
@@ -457,9 +457,9 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		broadcastInSession(session.getKeyword(), "lecturerQuestionAvailable", contents);
 	}
 
-	public void reportLecturerQuestionsLocked(final de.thm.arsnova.entities.Session session, final List<de.thm.arsnova.entities.Content> qs) {
+	public void reportLecturerQuestionsLocked(final de.thm.arsnova.entities.Session session, final List<de.thm.arsnova.entities.migration.v2.Content> qs) {
 		List<Content> contents = new ArrayList<>();
-		for (de.thm.arsnova.entities.Content q : qs) {
+		for (de.thm.arsnova.entities.migration.v2.Content q : qs) {
 			contents.add(new Content(q));
 		}
 		broadcastInSession(session.getKeyword(), "lecturerQuestionLocked", contents);
@@ -525,7 +525,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 		broadcastInSession(sessionKey, "countPreparationQuestionAnswers", contentService.countPreparationQuestionAnswersInternal(sessionKey));
 
 		// Update the unanswered count for the content variant that was answered.
-		final de.thm.arsnova.entities.Content content = event.getContent();
+		final de.thm.arsnova.entities.migration.v2.Content content = event.getContent();
 		if ("lecture".equals(content.getQuestionVariant())) {
 			sendToUser(event.getUser(), "unansweredLecturerQuestions", contentService.getUnAnsweredLectureQuestionIds(sessionKey, event.getUser()));
 		} else if ("preparation".equals(content.getQuestionVariant())) {
@@ -589,7 +589,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 	@Override
 	public void visit(LockVotesEvent event) {
 		List<Content> contents = new ArrayList<>();
-		for (de.thm.arsnova.entities.Content q : event.getQuestions()) {
+		for (de.thm.arsnova.entities.migration.v2.Content q : event.getQuestions()) {
 			contents.add(new Content(q));
 		}
 		broadcastInSession(event.getSession().getKeyword(), "lockVotes", contents);
@@ -598,7 +598,7 @@ public class ArsnovaSocketioServerImpl implements ArsnovaSocketioServer, Arsnova
 	@Override
 	public void visit(UnlockVotesEvent event) {
 		List<Content> contents = new ArrayList<>();
-		for (de.thm.arsnova.entities.Content q : event.getQuestions()) {
+		for (de.thm.arsnova.entities.migration.v2.Content q : event.getQuestions()) {
 			contents.add(new Content(q));
 		}
 		broadcastInSession(event.getSession().getKeyword(), "unlockVotes", contents);
diff --git a/src/main/java/de/thm/arsnova/websocket/message/Content.java b/src/main/java/de/thm/arsnova/websocket/message/Content.java
index 6344dd3eb..6a2ec724e 100644
--- a/src/main/java/de/thm/arsnova/websocket/message/Content.java
+++ b/src/main/java/de/thm/arsnova/websocket/message/Content.java
@@ -25,7 +25,7 @@ public class Content {
 	private final String _id;
 	private final String variant;
 
-	public Content(de.thm.arsnova.entities.Content content) {
+	public Content(de.thm.arsnova.entities.migration.v2.Content content) {
 		this._id = content.getId();
 		this.variant = content.getQuestionVariant();
 	}
diff --git a/src/test/java/de/thm/arsnova/entities/ContentTest.java b/src/test/java/de/thm/arsnova/entities/ContentTest.java
index fa3e4dc70..2cacd43a1 100644
--- a/src/test/java/de/thm/arsnova/entities/ContentTest.java
+++ b/src/test/java/de/thm/arsnova/entities/ContentTest.java
@@ -17,6 +17,9 @@
  */
 package de.thm.arsnova.entities;
 
+import de.thm.arsnova.entities.migration.v2.Answer;
+import de.thm.arsnova.entities.migration.v2.AnswerOption;
+import de.thm.arsnova.entities.migration.v2.Content;
 import org.junit.Test;
 
 import java.util.ArrayList;
@@ -28,17 +31,17 @@ public class ContentTest {
 	@SuppressWarnings("serial")
 	@Test
 	public void shouldComputeBasedOnCorrectAnswerWithExactMatch() {
-		final PossibleAnswer p1 = new PossibleAnswer();
+		final AnswerOption p1 = new AnswerOption();
 		p1.setText("Yes");
 		p1.setCorrect(true);
 		p1.setValue(10);
-		final PossibleAnswer p2 = new PossibleAnswer();
+		final AnswerOption p2 = new AnswerOption();
 		p2.setText("No");
 		p2.setCorrect(false);
 		p2.setValue(-10);
 		Content q = new Content();
 		q.setQuestionType("yesno");
-		q.setPossibleAnswers(new ArrayList<PossibleAnswer>() {{
+		q.setPossibleAnswers(new ArrayList<AnswerOption>() {{
 			add(p1);
 			add(p2);
 		}});
@@ -54,17 +57,17 @@ public class ContentTest {
 	@SuppressWarnings("serial")
 	@Test
 	public void shouldEqualAbstentionToZeroValue() {
-		final PossibleAnswer p1 = new PossibleAnswer();
+		final AnswerOption p1 = new AnswerOption();
 		p1.setText("Yes");
 		p1.setCorrect(true);
 		p1.setValue(10);
-		final PossibleAnswer p2 = new PossibleAnswer();
+		final AnswerOption p2 = new AnswerOption();
 		p2.setText("No");
 		p2.setCorrect(false);
 		p2.setValue(-10);
 		Content q = new Content();
 		q.setAbstention(true);
-		q.setPossibleAnswers(new ArrayList<PossibleAnswer>() {{
+		q.setPossibleAnswers(new ArrayList<AnswerOption>() {{
 			add(p1);
 			add(p2);
 		}});
@@ -77,21 +80,21 @@ public class ContentTest {
 	@SuppressWarnings("serial")
 	@Test
 	public void shouldCalculateMultipleChoiceAnswers() {
-		final PossibleAnswer p1 = new PossibleAnswer();
+		final AnswerOption p1 = new AnswerOption();
 		p1.setText("Yes");
 		p1.setCorrect(true);
 		p1.setValue(10);
-		final PossibleAnswer p2 = new PossibleAnswer();
+		final AnswerOption p2 = new AnswerOption();
 		p2.setText("No");
 		p2.setCorrect(false);
 		p2.setValue(-10);
-		final PossibleAnswer p3 = new PossibleAnswer();
+		final AnswerOption p3 = new AnswerOption();
 		p3.setText("Maybe");
 		p3.setCorrect(true);
 		p3.setValue(10);
 		Content q = new Content();
 		q.setQuestionType("mc");
-		q.setPossibleAnswers(new ArrayList<PossibleAnswer>() {{
+		q.setPossibleAnswers(new ArrayList<AnswerOption>() {{
 			add(p1);
 			add(p2);
 			add(p3);
@@ -118,25 +121,25 @@ public class ContentTest {
 	@SuppressWarnings("serial")
 	@Test
 	public void shouldCalculatePictureQuestionAnswers() {
-		final PossibleAnswer p1 = new PossibleAnswer();
+		final AnswerOption p1 = new AnswerOption();
 		p1.setText("0;0");
 		p1.setCorrect(true);
 		p1.setValue(10);
-		final PossibleAnswer p2 = new PossibleAnswer();
+		final AnswerOption p2 = new AnswerOption();
 		p2.setText("0;1");
 		p2.setCorrect(false);
 		p2.setValue(-10);
-		final PossibleAnswer p3 = new PossibleAnswer();
+		final AnswerOption p3 = new AnswerOption();
 		p3.setText("1;0");
 		p3.setCorrect(true);
 		p3.setValue(10);
-		final PossibleAnswer p4 = new PossibleAnswer();
+		final AnswerOption p4 = new AnswerOption();
 		p4.setText("1;1");
 		p4.setCorrect(true);
 		p4.setValue(10);
 		Content q = new Content();
 		q.setQuestionType("grid");
-		q.setPossibleAnswers(new ArrayList<PossibleAnswer>() {{
+		q.setPossibleAnswers(new ArrayList<AnswerOption>() {{
 			add(p1);
 			add(p2);
 			add(p3);
-- 
GitLab