diff --git a/src/main/java/de/thm/arsnova/controller/SessionController.java b/src/main/java/de/thm/arsnova/controller/SessionController.java
index 30a6c2cc6e82b316891b5b3d9ad2417b97553321..7c6db97fc3face2f4cee0d538b200c282383dc4b 100644
--- a/src/main/java/de/thm/arsnova/controller/SessionController.java
+++ b/src/main/java/de/thm/arsnova/controller/SessionController.java
@@ -158,10 +158,25 @@ public class SessionController extends PaginationController {
 			@ApiParam(value = "ownedOnly", required = true) @RequestParam(value = "ownedonly", defaultValue = "false") final boolean ownedOnly,
 			@ApiParam(value = "visitedOnly", required = true) @RequestParam(value = "visitedonly", defaultValue = "false") final boolean visitedOnly,
 			@ApiParam(value = "sortby", required = true) @RequestParam(value = "sortby", defaultValue = "name") final String sortby,
+			@ApiParam(value = "for a given username. admin rights needed", required = false) @RequestParam(value =
+					"username", defaultValue = "") final String username,
 			final HttpServletResponse response
 			) {
 		List<Session> sessions = null;
 
+		if (username.equals("")) try {
+			if (ownedOnly && !visitedOnly) {
+				sessions = sessionService.getUserSessions(username);
+			} else if (visitedOnly && !ownedOnly) {
+				sessions = sessionService.getUserVisitedSessions(username);
+			} else {
+				response.setStatus(HttpStatus.NOT_IMPLEMENTED.value());
+				return null;
+			}
+		} catch (final AccessDeniedException e) {
+			throw new UnauthorizedException();
+		}
+
 		/* TODO implement all parameter combinations, implement use of user parameter */
 		try {
 			if (ownedOnly && !visitedOnly) {
diff --git a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
index 22577c326b22d35e904b1f64d02e5ba8f6e1378a..aa427a0bc1be072c4afc1551d64af22f66e5d479 100644
--- a/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
+++ b/src/main/java/de/thm/arsnova/dao/CouchDBDao.java
@@ -153,6 +153,11 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 
 	@Override
 	public List<Session> getMySessions(final User user, final int start, final int limit) {
+		return this.getDatabaseDao().getSessionsForUsername(user.getUsername(), start, limit);
+	}
+
+	@Override
+	public List<Session> getSessionsForUsername(String username, final int start, final int limit) {
 		final NovaView view = new NovaView("session/by_creator");
 		if (start > 0) {
 			view.setSkip(start);
@@ -160,8 +165,8 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 		if (limit > 0) {
 			view.setLimit(limit);
 		}
-		view.setStartKeyArray(user.getUsername());
-		view.setEndKeyArray(user.getUsername(), "{}");
+		view.setStartKeyArray(username);
+		view.setEndKeyArray(username, "{}");
 
 		final Results<Session> results = getDatabase().queryView(view, Session.class);
 
@@ -1349,8 +1354,8 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 			if (d.getJSONObject().optJSONArray("value") != null) {
 				@SuppressWarnings("unchecked")
 				final Collection<Session> visitedSessions =	 JSONArray.toCollection(
-					d.getJSONObject().getJSONArray("value"),
-					Session.class
+						d.getJSONObject().getJSONArray("value"),
+						Session.class
 				);
 				allSessions.addAll(visitedSessions);
 			}
@@ -1398,6 +1403,72 @@ public class CouchDBDao implements IDatabaseDao, ApplicationEventPublisherAware
 		return result;
 	}
 
+	@Override
+	public List<Session> getVisitedSessionsForUsername(String username, final int start, final int limit) {
+		final NovaView view = new NovaView("logged_in/visited_sessions_by_user");
+		if (start > 0) {
+			view.setSkip(start);
+		}
+		if (limit > 0) {
+			view.setLimit(limit);
+		}
+		view.setKey(username);
+		final ViewResults sessions = getDatabase().view(view);
+		final List<Session> allSessions = new ArrayList<Session>();
+		for (final Document d : sessions.getResults()) {
+			// Not all users have visited sessions
+			if (d.getJSONObject().optJSONArray("value") != null) {
+				@SuppressWarnings("unchecked")
+				final Collection<Session> visitedSessions =	 JSONArray.toCollection(
+						d.getJSONObject().getJSONArray("value"),
+						Session.class
+				);
+				allSessions.addAll(visitedSessions);
+			}
+		}
+		// Filter sessions that don't exist anymore, also filter my own sessions
+		final List<Session> result = new ArrayList<Session>();
+		final List<Session> filteredSessions = new ArrayList<Session>();
+		for (final Session s : allSessions) {
+			try {
+				final Session session = getDatabaseDao().getSessionFromKeyword(s.getKeyword());
+				if (session != null && !(session.getCreator().equals(username))) {
+					result.add(session);
+				} else {
+					filteredSessions.add(s);
+				}
+			} catch (final NotFoundException e) {
+				filteredSessions.add(s);
+			}
+		}
+		if (filteredSessions.isEmpty()) {
+			return result;
+		}
+		// Update document to remove sessions that don't exist anymore
+		try {
+			List<VisitedSession> visitedSessions = new ArrayList<VisitedSession>();
+			for (final Session s : result) {
+				visitedSessions.add(new VisitedSession(s));
+			}
+			final LoggedIn loggedIn = new LoggedIn();
+			final Document loggedInDocument = getDatabase().getDocument(sessions.getResults().get(0).getString("id"));
+			loggedIn.setSessionId(loggedInDocument.getString("sessionId"));
+			loggedIn.setUser(username);
+			loggedIn.setTimestamp(loggedInDocument.getLong("timestamp"));
+			loggedIn.setType(loggedInDocument.getString("type"));
+			loggedIn.setVisitedSessions(visitedSessions);
+			loggedIn.set_id(loggedInDocument.getId());
+			loggedIn.set_rev(loggedInDocument.getRev());
+
+			final JSONObject json = JSONObject.fromObject(loggedIn);
+			final Document doc = new Document(json);
+			getDatabase().saveDocument(doc);
+		} catch (IOException e) {
+			LOGGER.error("Could not clean up logged_in document of {}", username);
+		}
+		return result;
+	}
+
 	@Override
 	public List<SessionInfo> getMyVisitedSessionsInfo(final User user, final int start, final int limit) {
 		List<Session> sessions = this.getMyVisitedSessions(user, start, limit);
diff --git a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
index b7a6331940d0b87f77c2c75611d16006a274cf9d..1a77eb8893a864194b2ab9cf6f74d867aa2fe5f2 100644
--- a/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
+++ b/src/main/java/de/thm/arsnova/dao/IDatabaseDao.java
@@ -44,6 +44,8 @@ public interface IDatabaseDao {
 
 	List<Session> getMySessions(User user, final int start, final int limit);
 
+	List<Session> getSessionsForUsername(String username, final int start, final int limit);
+
 	List<Session> getPublicPoolSessions();
 
 	List<Session> getMyPublicPoolSessions(User user);
@@ -121,6 +123,8 @@ public interface IDatabaseDao {
 
 	List<Session> getMyVisitedSessions(User user, final int start, final int limit);
 
+	List<Session> getVisitedSessionsForUsername(String username, final int start, final int limit);
+
 	Question updateQuestion(Question question);
 
 	void deleteAnswers(Question question);
diff --git a/src/main/java/de/thm/arsnova/services/ISessionService.java b/src/main/java/de/thm/arsnova/services/ISessionService.java
index d984c3ae5c568861657697712f7f4826e4be62fd..0a1ce00fe9c17f2e6902e870bf30baece64873cb 100644
--- a/src/main/java/de/thm/arsnova/services/ISessionService.java
+++ b/src/main/java/de/thm/arsnova/services/ISessionService.java
@@ -44,6 +44,10 @@ public interface ISessionService {
 
 	String generateKeyword();
 
+	List<Session> getUserSessions(String username);
+
+	List<Session> getUserVisitedSessions(String username);
+
 	List<Session> getMySessions(int offset, int limit);
 
 	List<Session> getMyVisitedSessions(int offset, int limit);
diff --git a/src/main/java/de/thm/arsnova/services/SessionService.java b/src/main/java/de/thm/arsnova/services/SessionService.java
index 8cbb6f79921340b95a6555e447fd8480197fd93e..323f90feb810b2d58e648729f90356fdb6c51680 100644
--- a/src/main/java/de/thm/arsnova/services/SessionService.java
+++ b/src/main/java/de/thm/arsnova/services/SessionService.java
@@ -195,6 +195,12 @@ public class SessionService implements ISessionService, ApplicationEventPublishe
 		return session;
 	}
 
+	@Override
+	@PreAuthorize("isAuthenticated() and hasPermission(#sessionkey, 'session', 'owner')")
+	public List<Session> getUserSessions(String username) {
+		return databaseDao.getSessionsForUsername(username, 0, 0);
+	}
+
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public List<Session> getMySessions(final int offset, final int limit) {
@@ -226,6 +232,12 @@ public class SessionService implements ISessionService, ApplicationEventPublishe
 		return databaseDao.getMyVisitedSessions(userService.getCurrentUser(), offset, limit);
 	}
 
+	@Override
+	@PreAuthorize("isAuthenticated() and hasPermission(#sessionkey, 'session', 'owner')")
+	public List<Session> getUserVisitedSessions(String username) {
+		return databaseDao.getVisitedSessionsForUsername(username, 0, 0);
+	}
+
 	@Override
 	@PreAuthorize("isAuthenticated()")
 	public List<SessionInfo> getMyVisitedSessionsInfo(final int offset, final int limit) {