diff --git a/src/main/java/de/thm/arsnova/controller/QuestionController.java b/src/main/java/de/thm/arsnova/controller/QuestionController.java
index 184d7e88d46d518f8a62fa1aef62bfe356247bf7..db0d162015d334fa931a8bd4f79ad8f9a3805302 100644
--- a/src/main/java/de/thm/arsnova/controller/QuestionController.java
+++ b/src/main/java/de/thm/arsnova/controller/QuestionController.java
@@ -92,8 +92,8 @@ public class QuestionController extends AbstractController {
 		method=RequestMethod.GET
 	)
 	@ResponseBody
-	public List<Question> getSkillQuestions(@PathVariable String sessionkey, @RequestParam(value="sort", required=false) String sort, HttpServletResponse response) {
-		List<Question> questions = sessionService.getSkillQuestions(sessionkey, sort);
+	public List<Question> getSkillQuestions(@PathVariable String sessionkey, HttpServletResponse response) {
+		List<Question> questions = sessionService.getSkillQuestions(sessionkey);
 		if(questions == null || questions.isEmpty()) {
 			response.setStatus(HttpStatus.NOT_FOUND.value());
 			return null;
diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java
index 36894a3f5edd806a0f8f18fdbbbcec844dcf9ce8..b4a71cf4ea6baebf9a4d098da31559c9a82c93f7 100644
--- a/src/main/java/de/thm/arsnova/controller/SessionController.java
+++ b/src/main/java/de/thm/arsnova/controller/SessionController.java
@@ -34,14 +34,19 @@ import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.ResponseBody;
 
+import de.thm.arsnova.entities.Feedback;
+import de.thm.arsnova.entities.Question;
+import de.thm.arsnova.entities.LoggedIn;
 import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.User;
 import de.thm.arsnova.services.ISessionService;
 import de.thm.arsnova.services.IUserService;
 import de.thm.arsnova.socket.ARSnovaSocketIOServer;
 
+
 @Controller
 public class SessionController extends AbstractController {
 	
@@ -74,6 +79,20 @@ public class SessionController extends AbstractController {
 		return sessionService.joinSession(sessionkey);
 	}
 	
+	@RequestMapping(value="/session/{sessionkey}/online", method=RequestMethod.POST)
+	@ResponseBody
+	public LoggedIn registerAsOnlineUser(@PathVariable String sessionkey, HttpServletResponse response) {
+		User user = userService.getCurrentUser();
+		LoggedIn loggedIn = sessionService.registerAsOnlineUser(user, sessionkey);
+		if (loggedIn != null) {
+			response.setStatus(HttpStatus.CREATED.value());
+			return loggedIn;
+		}
+		
+		response.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value());
+		return null;
+	}
+	
 	@RequestMapping(value="/session", method=RequestMethod.POST)
 	@ResponseBody
 	public Session postNewSession(@RequestBody Session session, HttpServletResponse response) {
@@ -87,6 +106,7 @@ public class SessionController extends AbstractController {
 		return null;
 	}
 
+
 	@RequestMapping(value="/socketurl", method=RequestMethod.GET)
 	@ResponseBody
 	public String getSocketUrl() {
@@ -113,4 +133,5 @@ public class SessionController extends AbstractController {
 		}
 		return sessions;
 	}
+
 }
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index b26744545d9f894ac11c96733678d74b2e029eb5..9f9fad11f3440665e33268b6a3d344f938e1e59b 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -34,11 +34,15 @@ import java.util.Set;
 import net.sf.ezmorph.Morpher;
 import net.sf.ezmorph.MorpherRegistry;
 import net.sf.ezmorph.bean.BeanMorpher;
+import net.sf.ezmorph.bean.MorphDynaBean;
 import net.sf.json.JSONArray;
 import net.sf.json.JSONException;
 import net.sf.json.JSONObject;
+import net.sf.json.JsonConfig;
 import net.sf.json.util.JSONUtils;
 
+import org.apache.commons.beanutils.DynaBean;
+import org.apache.commons.beanutils.DynaClass;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -57,8 +61,10 @@ import com.fourspaces.couchdb.ViewResults;
 import de.thm.arsnova.entities.Feedback;
 import de.thm.arsnova.entities.PossibleAnswer;
 import de.thm.arsnova.entities.Question;
+import de.thm.arsnova.entities.LoggedIn;
 import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.User;
+import de.thm.arsnova.entities.VisitedSession;
 import de.thm.arsnova.exceptions.ForbiddenException;
 import de.thm.arsnova.exceptions.NotFoundException;
 import de.thm.arsnova.services.ISessionService;
@@ -191,20 +197,14 @@ public class CouchDBDao implements IDatabaseDao {
 	}
 	
 	@Override
-	public List<Question> getSkillQuestions(String sessionKeyword, String sort) {
+	public List<Question> getSkillQuestions(String sessionKeyword) {
 		Session session = this.getSessionFromKeyword(sessionKeyword);
 		if (session == null) {
 			return null;
 		}
 		
-		String viewName = "";
-		if(sort != null && sort.equals("text")) {
-			viewName = "skill_question/by_session_sorted_by_subject_and_text";
-		} else {
-			viewName = "skill_question/by_session";
-		}
 		try {
-			View view = new View(viewName);
+			View view = new View("skill_question/by_session_sorted_by_subject_and_text");
 			view.setStartKey("[" + URLEncoder.encode("\"" + session.get_id() + "\"", "UTF-8") + "]");
 			view.setEndKey("[" + URLEncoder.encode("\"" + session.get_id() + "\",{}", "UTF-8") + "]");
 			
@@ -514,4 +514,45 @@ public class CouchDBDao implements IDatabaseDao {
 		}
 		return null;
 	}
+	
+	@Override
+	public LoggedIn registerAsOnlineUser(User u, Session s) {
+		try {
+			View view = new View("logged_in/all");
+			view.setKey(URLEncoder.encode("\"" + u.getUsername() + "\"", "UTF-8"));
+			ViewResults results = this.getDatabase().view(view);
+			
+			LoggedIn loggedIn = new LoggedIn();
+			if (results.getJSONArray("rows").optJSONObject(0) != null) {
+				JSONObject json = results.getJSONArray("rows").optJSONObject(0).optJSONObject("value");
+				loggedIn = (LoggedIn) JSONObject.toBean(json, LoggedIn.class);
+				Collection<VisitedSession> visitedSessions = JSONArray.toCollection(json.getJSONArray("visitedSessions"), VisitedSession.class);
+				loggedIn.setVisitedSessions(new ArrayList<VisitedSession>(visitedSessions));
+			}
+			
+			loggedIn.setUser(u.getUsername());
+			loggedIn.setSessionId(s.get_id());
+			loggedIn.addVisitedSession(s);
+			
+			JSONObject json = JSONObject.fromObject(loggedIn);
+			Document doc = new Document(json);
+			if (doc.getId() == "") {
+				// If this is a new user without a logged_in document, we have to remove the following
+				// pre-filled fields. Otherwise, CouchDB will take these empty fields as genuine
+				// identifiers, and will throw errors afterwards.
+				doc.remove("_id");
+				doc.remove("_rev");
+			}
+			this.getDatabase().saveDocument(doc);
+			
+			LoggedIn l = (LoggedIn) JSONObject.toBean(doc.getJSONObject(), LoggedIn.class);
+			Collection<VisitedSession> visitedSessions = JSONArray.toCollection(doc.getJSONObject().getJSONArray("visitedSessions"), VisitedSession.class);
+			l.setVisitedSessions(new ArrayList<VisitedSession>(visitedSessions));
+			return l;
+		} catch (UnsupportedEncodingException e) {
+			return null;
+		} catch (IOException e) {
+			return null;
+		}
+	}
 }
diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
index 5f8e0c8c436b97fd82a6154da4c696947f0aa996..52cf984d1f202db340ceb737c3232962da86a670 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -23,6 +23,7 @@ import java.util.List;
 
 import de.thm.arsnova.entities.Feedback;
 import de.thm.arsnova.entities.Question;
+import de.thm.arsnova.entities.LoggedIn;
 import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.User;
 
@@ -38,6 +39,8 @@ public interface IDatabaseDao {
 	
 	public boolean saveQuestion(Session session, Question question);
 	public Question getQuestion(String id);
-	List<Question> getSkillQuestions(String session, String sort);
+	List<Question> getSkillQuestions(String session);
 	public int getSkillQuestionCount(String sessionkey);
+	
+	public LoggedIn registerAsOnlineUser(User u, Session s);
 }
\ No newline at end of file
diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java
index d9b51d444ea490c352f7100796996668364f46b9..0a66c1e739f14f812452407c58d207c5662f096a 100644
--- a/src/main/java/de/thm/arsnova/services/ISessionService.java
+++ b/src/main/java/de/thm/arsnova/services/ISessionService.java
@@ -25,6 +25,7 @@ import java.util.Set;
 
 import de.thm.arsnova.entities.Feedback;
 import de.thm.arsnova.entities.Question;
+import de.thm.arsnova.entities.LoggedIn;
 import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.User;
 
@@ -43,6 +44,7 @@ public interface ISessionService {
 	public List<Session> getMySessions(String username);
 	public boolean saveQuestion(Question question);
 	public Question getQuestion(String id);
-	public List<Question> getSkillQuestions(String sessionkey, String sort);
+	public LoggedIn registerAsOnlineUser(User user, String sessionkey);
+	public List<Question> getSkillQuestions(String sessionkey);
 	public int getSkillQuestionCount(String sessionkey);
 }
\ No newline at end of file
diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java
index b326466be144c269312c70472c1b4321b509a3f8..02cba31fc62e3b8250d41da9af2a2d01559b6ca4 100644
--- a/src/main/java/de/thm/arsnova/services/SessionService.java
+++ b/src/main/java/de/thm/arsnova/services/SessionService.java
@@ -32,6 +32,7 @@ import de.thm.arsnova.annotation.Authenticated;
 import de.thm.arsnova.dao.IDatabaseDao;
 import de.thm.arsnova.entities.Feedback;
 import de.thm.arsnova.entities.Question;
+import de.thm.arsnova.entities.LoggedIn;
 import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.User;
 import de.thm.arsnova.socket.ARSnovaSocketIOServer;
@@ -77,8 +78,8 @@ public class SessionService implements ISessionService {
 	}
 
 	@Override
-	public List<Question> getSkillQuestions(String sessionkey, String sort) {
-		return databaseDao.getSkillQuestions(sessionkey, sort);
+	public List<Question> getSkillQuestions(String sessionkey) {
+		return databaseDao.getSkillQuestions(sessionkey);
 	}
 	
 	@Override
@@ -147,4 +148,13 @@ public class SessionService implements ISessionService {
 	public Question getQuestion(String id) {
 		return databaseDao.getQuestion(id);
 	}
+
+	@Override
+	@Authenticated
+	public LoggedIn registerAsOnlineUser(User user, String sessionkey) {
+		Session session = this.joinSession(sessionkey);
+		if (session == null) return null;
+		
+		return databaseDao.registerAsOnlineUser(user, session);
+	}
 }
diff --git a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
index 9b35d49df93019c31e4ab4b0e32f6bde5718ec67..1f544926e606f4e666a222d4ff1fc6c850bd795b 100644
--- a/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
+++ b/src/test/java/de/thm/arsnova/dao/StubDatabaseDao.java
@@ -11,6 +11,7 @@ import org.springframework.stereotype.Component;
 
 import de.thm.arsnova.entities.Feedback;
 import de.thm.arsnova.entities.Question;
+import de.thm.arsnova.entities.LoggedIn;
 import de.thm.arsnova.entities.Session;
 import de.thm.arsnova.entities.User;
 import de.thm.arsnova.exceptions.ForbiddenException;
@@ -133,7 +134,7 @@ public class StubDatabaseDao implements IDatabaseDao {
 	}
 
 	@Override
-	public List<Question> getSkillQuestions(String session, String sort) {
+	public List<Question> getSkillQuestions(String session) {
 		// TODO Auto-generated method stub
 		return null;
 	}
@@ -150,4 +151,10 @@ public class StubDatabaseDao implements IDatabaseDao {
 		return null;
 	}
 
+	@Override
+	public LoggedIn registerAsOnlineUser(User u, Session s) {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
 }