diff --git a/src/main/java/de/thm/arsnova/config/PersistanceConfig.java b/src/main/java/de/thm/arsnova/config/PersistanceConfig.java
index 34bf32e53266ef5caeed6d3691d6295b499428d4..dd1b1e21e55a56bab60d90f2f18f49f6cb8b441e 100644
--- a/src/main/java/de/thm/arsnova/config/PersistanceConfig.java
+++ b/src/main/java/de/thm/arsnova/config/PersistanceConfig.java
@@ -95,11 +95,6 @@ public class PersistanceConfig {
 		return new CouchDbMotdRepository(couchDbConnector(), false);
 	}
 
-	@Bean
-	public VisitedSessionRepository visitedSessionRepository() throws Exception {
-		return new CouchDbVisitedSessionRepository(couchDbConnector(), false);
-	}
-
 	@Bean
 	public StatisticsRepository statisticsRepository() throws Exception {
 		return new CouchDbStatisticsRepository(couchDbConnector(), false);
diff --git a/src/main/java/de/thm/arsnova/controller/v2/RoomController.java b/src/main/java/de/thm/arsnova/controller/v2/RoomController.java
index 51d766efe8eef4178ab7a41dc008b21022081651..de51c43be7405e9aaa6572f503a8381549d3d28c 100644
--- a/src/main/java/de/thm/arsnova/controller/v2/RoomController.java
+++ b/src/main/java/de/thm/arsnova/controller/v2/RoomController.java
@@ -176,7 +176,7 @@ public class RoomController extends PaginationController {
 				if (ownedOnly && !visitedOnly) {
 					rooms = roomService.getUserRooms(userId);
 				} else if (visitedOnly && !ownedOnly) {
-					rooms = roomService.getUserVisitedRooms(username);
+					rooms = roomService.getUserRoomHistory(username);
 				} else {
 					response.setStatus(HttpStatus.NOT_IMPLEMENTED.value());
 					return null;
@@ -190,7 +190,7 @@ public class RoomController extends PaginationController {
 				if (ownedOnly && !visitedOnly) {
 					rooms = roomService.getMyRooms(offset, limit);
 				} else if (visitedOnly && !ownedOnly) {
-					rooms = roomService.getMyVisitedRooms(offset, limit);
+					rooms = roomService.getMyRoomHistory(offset, limit);
 				} else {
 					response.setStatus(HttpStatus.NOT_IMPLEMENTED.value());
 					return null;
@@ -233,7 +233,7 @@ public class RoomController extends PaginationController {
 		if (!visitedOnly) {
 			rooms = roomService.getMyRoomsInfo(offset, limit);
 		} else {
-			rooms = roomService.getMyVisitedRoomsInfo(offset, limit);
+			rooms = roomService.getMyRoomHistoryInfo(offset, limit);
 		}
 
 		if (rooms == null || rooms.isEmpty()) {
diff --git a/src/main/java/de/thm/arsnova/persistance/RoomRepository.java b/src/main/java/de/thm/arsnova/persistance/RoomRepository.java
index ae77422a4774979a2cb1d1c5fa810b6eb0427636..c1defdf988cb11d2b7b2186eb4261df63a001149 100644
--- a/src/main/java/de/thm/arsnova/persistance/RoomRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/RoomRepository.java
@@ -34,7 +34,7 @@ public interface RoomRepository extends CrudRepository<Room, String> {
 	List<Room> findAllForPublicPool();
 	List<Room> findForPublicPoolByOwner(UserAuthentication owner);
 	List<Room> getRoomsWithStatsForOwner(UserAuthentication owner, int start, int limit);
-	List<Room> getVisitedRoomsWithStatsForOwner(List<Room> rooms, UserAuthentication owner);
+	List<Room> getRoomHistoryWithStatsForUser(List<Room> rooms, UserAuthentication owner);
 	List<Room> findInfosForPublicPool();
 	List<Room> findInfosForPublicPoolByOwner(UserAuthentication owner);
 	List<Room> findRoomsByCourses(List<Course> courses);
diff --git a/src/main/java/de/thm/arsnova/persistance/VisitedSessionRepository.java b/src/main/java/de/thm/arsnova/persistance/VisitedSessionRepository.java
deleted file mode 100644
index ce0b2358155f8b539ecaec84f976c32b02577a84..0000000000000000000000000000000000000000
--- a/src/main/java/de/thm/arsnova/persistance/VisitedSessionRepository.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package de.thm.arsnova.persistance;
-
-public interface VisitedSessionRepository {
-	int deleteInactiveGuestVisitedSessionLists(long lastActivityBefore);
-}
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbRoomRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbRoomRepository.java
index 89998496618c512fc3a9fa7a69675d69ae765966..1578d7706a9cb214c5100b8e5a8c2e6b4efe31f1 100644
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbRoomRepository.java
+++ b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbRoomRepository.java
@@ -347,17 +347,17 @@ public class CouchDbRoomRepository extends CouchDbCrudRepository<Room> implement
 	}
 
 	/* TODO: Move to service layer. */
-	public List<Room> getVisitedRoomsWithStatsForOwner(final List<Room> rooms, final UserAuthentication owner) {
+	public List<Room> getRoomHistoryWithStatsForUser(final List<Room> rooms, final UserAuthentication user) {
 		final ViewQuery answeredQuestionsView = createQuery("by_creatorid_roomid").designDocId("_design/Answer")
-				.keys(rooms.stream().map(room -> ComplexKey.of(owner.getUsername(), room.getId())).collect(Collectors.toList()));
+				.reduce(false).keys(rooms.stream().map(room -> ComplexKey.of(user.getId(), room.getId())).collect(Collectors.toList()));
 		final ViewQuery contentIdsView = createQuery("by_roomid").designDocId("_design/Content")
-				.keys(rooms.stream().map(Room::getId).collect(Collectors.toList()));
+				.reduce(false).keys(rooms.stream().map(Room::getId).collect(Collectors.toList()));
 
-		return attachVisitedRoomStats(rooms, answeredQuestionsView, contentIdsView);
+		return attachRoomHistoryStats(rooms, answeredQuestionsView, contentIdsView);
 	}
 
 	/* TODO: Move to service layer. */
-	private List<Room> attachVisitedRoomStats(
+	private List<Room> attachRoomHistoryStats(
 			final List<Room> rooms,
 			final ViewQuery answeredQuestionsView,
 			final ViewQuery contentIdsView) {
diff --git a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbVisitedSessionRepository.java b/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbVisitedSessionRepository.java
deleted file mode 100644
index 9d8a256f496fa3b105afc3c293afaef5b56d9c67..0000000000000000000000000000000000000000
--- a/src/main/java/de/thm/arsnova/persistance/couchdb/CouchDbVisitedSessionRepository.java
+++ /dev/null
@@ -1,70 +0,0 @@
-package de.thm.arsnova.persistance.couchdb;
-
-import com.google.common.collect.Lists;
-import de.thm.arsnova.entities.migration.v2.VisitedRoom;
-import de.thm.arsnova.persistance.LogEntryRepository;
-import de.thm.arsnova.persistance.VisitedSessionRepository;
-import org.ektorp.BulkDeleteDocument;
-import org.ektorp.CouchDbConnector;
-import org.ektorp.DbAccessException;
-import org.ektorp.DocumentOperationResult;
-import org.ektorp.ViewResult;
-import org.ektorp.support.CouchDbRepositorySupport;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-
-import java.util.ArrayList;
-import java.util.List;
-
-public class CouchDbVisitedSessionRepository extends CouchDbRepositorySupport<VisitedRoom> implements VisitedSessionRepository {
-	private static final int BULK_PARTITION_SIZE = 500;
-
-	private static final Logger logger = LoggerFactory.getLogger(CouchDbVisitedSessionRepository.class);
-
-	@Autowired
-	private LogEntryRepository dbLogger;
-
-	public CouchDbVisitedSessionRepository(final CouchDbConnector db, final boolean createIfNotExists) {
-		super(VisitedRoom.class, db, createIfNotExists);
-	}
-
-	@Override
-	public int deleteInactiveGuestVisitedSessionLists(final long lastActivityBefore) {
-		try {
-			final ViewResult result = db.queryView(createQuery("by_last_activity_for_guests").endKey(lastActivityBefore));
-
-			int count = 0;
-			final List<List<ViewResult.Row>> partitions = Lists.partition(result.getRows(), BULK_PARTITION_SIZE);
-			for (final List<ViewResult.Row> partition: partitions) {
-				final List<BulkDeleteDocument> newDocs = new ArrayList<>();
-				for (final ViewResult.Row oldDoc : partition) {
-					final BulkDeleteDocument newDoc = new BulkDeleteDocument(oldDoc.getId(), oldDoc.getValueAsNode().get("_rev").asText());
-					newDocs.add(newDoc);
-					logger.debug("Marked logged_in document {} for deletion.", oldDoc.getId());
-					/* Use log type 'user' since effectively the user is deleted in case of guests */
-					dbLogger.log("delete", "type", "user", "id", oldDoc.getId());
-				}
-
-				if (!newDocs.isEmpty()) {
-					final List<DocumentOperationResult> results = db.executeBulk(newDocs);
-					count += newDocs.size() - results.size();
-					if (!results.isEmpty()) {
-						logger.error("Could not bulk delete some visited session lists.");
-					}
-				}
-			}
-
-			if (count > 0) {
-				logger.info("Deleted {} visited session lists of inactive users.", count);
-				dbLogger.log("cleanup", "type", "visitedsessions", "count", count);
-			}
-
-			return count;
-		} catch (final DbAccessException e) {
-			logger.error("Could not delete visited session lists of inactive users.", e);
-		}
-
-		return 0;
-	}
-}
diff --git a/src/main/java/de/thm/arsnova/services/RoomService.java b/src/main/java/de/thm/arsnova/services/RoomService.java
index 2ed5a90b577c09da54c7a3e56009c49e389d9cfe..e0dd3de7c4adb4956b793e5524c41f8607df5de7 100644
--- a/src/main/java/de/thm/arsnova/services/RoomService.java
+++ b/src/main/java/de/thm/arsnova/services/RoomService.java
@@ -44,11 +44,11 @@ public interface RoomService extends EntityService<Room> {
 
 	List<Room> getUserRooms(String userId);
 
-	List<Room> getUserVisitedRooms(String username);
+	List<Room> getUserRoomHistory(String userId);
 
 	List<Room> getMyRooms(int offset, int limit);
 
-	List<Room> getMyVisitedRooms(int offset, int limit);
+	List<Room> getMyRoomHistory(int offset, int limit);
 
 	int countRoomsByCourses(List<Course> courses);
 
@@ -76,7 +76,7 @@ public interface RoomService extends EntityService<Room> {
 
 	List<Room> getMyPublicPoolRoomsInfo();
 
-	List<Room> getMyVisitedRoomsInfo(int offset, int limit);
+	List<Room> getMyRoomHistoryInfo(int offset, int limit);
 
 	Room importRooms(ImportExportContainer importExportRoom);
 
@@ -93,6 +93,4 @@ public interface RoomService extends EntityService<Room> {
 	boolean flipFlashcards(String shortId, Boolean flip);
 
 	void deleteInactiveRooms();
-
-	void deleteInactiveVisitedRoomLists();
 }
diff --git a/src/main/java/de/thm/arsnova/services/RoomServiceImpl.java b/src/main/java/de/thm/arsnova/services/RoomServiceImpl.java
index 0d55ecfd314c65c9db53bb14b6176cc9e83b4645..1f610087d445e420a3a7d8fce7d9f5837547d985 100644
--- a/src/main/java/de/thm/arsnova/services/RoomServiceImpl.java
+++ b/src/main/java/de/thm/arsnova/services/RoomServiceImpl.java
@@ -37,7 +37,6 @@ import de.thm.arsnova.persistance.CommentRepository;
 import de.thm.arsnova.persistance.ContentRepository;
 import de.thm.arsnova.persistance.LogEntryRepository;
 import de.thm.arsnova.persistance.RoomRepository;
-import de.thm.arsnova.persistance.VisitedSessionRepository;
 import de.thm.arsnova.services.score.ScoreCalculator;
 import de.thm.arsnova.services.score.ScoreCalculatorFactory;
 import org.slf4j.Logger;
@@ -82,8 +81,6 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 
 	private CommentRepository commentRepository;
 
-	private VisitedSessionRepository visitedSessionRepository;
-
 	private UserService userService;
 
 	private FeedbackService feedbackService;
@@ -105,7 +102,6 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 			ContentRepository contentRepository,
 			AnswerRepository answerRepository,
 			CommentRepository commentRepository,
-			VisitedSessionRepository visitedSessionRepository,
 			LogEntryRepository dbLogger,
 			UserService userService,
 			FeedbackService feedbackService,
@@ -116,7 +112,6 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 		this.contentRepository = contentRepository;
 		this.answerRepository = answerRepository;
 		this.commentRepository = commentRepository;
-		this.visitedSessionRepository = visitedSessionRepository;
 		this.dbLogger = dbLogger;
 		this.userService = userService;
 		this.feedbackService = feedbackService;
@@ -172,16 +167,6 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 		}
 	}
 
-	@Scheduled(fixedDelay = ROOM_INACTIVITY_CHECK_INTERVAL_MS)
-	public void deleteInactiveVisitedRoomLists() {
-		if (guestRoomInactivityThresholdDays > 0) {
-			logger.info("Delete lists of visited session for inactive users.");
-			long unixTime = System.currentTimeMillis();
-			long lastActivityBefore = unixTime - guestRoomInactivityThresholdDays * 24 * 60 * 60 * 1000L;
-			visitedSessionRepository.deleteInactiveGuestVisitedSessionLists(lastActivityBefore);
-		}
-	}
-
 	@Override
 	public Room join(final String shortId, final UUID socketId) {
 		/* Socket.IO solution */
@@ -282,15 +267,15 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 
 	@Override
 	@PreAuthorize("isAuthenticated()")
-	public List<Room> getMyVisitedRooms(final int offset, final int limit) {
+	public List<Room> getMyRoomHistory(final int offset, final int limit) {
 		/* TODO: implement pagination */
-		return getUserVisitedRooms(userService.getCurrentUser().getUsername());
+		return getUserRoomHistory(userService.getCurrentUser().getId());
 	}
 
 	@Override
-	@PreAuthorize("hasPermission('', 'motd', 'admin')")
-	public List<Room> getUserVisitedRooms(String username) {
-		UserProfile profile = userService.getByUsername(username);
+	@PreAuthorize("hasPermission(#userId, 'userprofile', 'read')")
+	public List<Room> getUserRoomHistory(final String userId) {
+		UserProfile profile = userService.get(userId);
 		List<String> roomIds = profile.getRoomHistory().stream().map(entry -> entry.getRoomId()).collect(Collectors.toList());
 		roomRepository.findAll(roomIds);
 		List<Room> rooms = new ArrayList<>();
@@ -301,9 +286,9 @@ public class RoomServiceImpl extends DefaultEntityServiceImpl<Room> implements R
 
 	@Override
 	@PreAuthorize("isAuthenticated()")
-	public List<Room> getMyVisitedRoomsInfo(final int offset, final int limit) {
-		List<Room> rooms = getMyVisitedRooms(0, 0);
-		roomRepository.getVisitedRoomsWithStatsForOwner(rooms, userService.getCurrentUser());
+	public List<Room> getMyRoomHistoryInfo(final int offset, final int limit) {
+		List<Room> rooms = getMyRoomHistory(0, 0);
+		roomRepository.getRoomHistoryWithStatsForUser(rooms, userService.getCurrentUser());
 
 		return rooms;
 	}
diff --git a/src/test/java/de/thm/arsnova/config/TestPersistanceConfig.java b/src/test/java/de/thm/arsnova/config/TestPersistanceConfig.java
index 78f1a311ec8a0c4998061d73e03343ffb3e88475..f602e80d446a9f9beb368490ac8bf86f4a7b64c2 100644
--- a/src/test/java/de/thm/arsnova/config/TestPersistanceConfig.java
+++ b/src/test/java/de/thm/arsnova/config/TestPersistanceConfig.java
@@ -49,11 +49,6 @@ public class TestPersistanceConfig {
 		return Mockito.mock(MotdRepository.class);
 	}
 
-	@Bean
-	public VisitedSessionRepository visitedSessionRepository() {
-		return Mockito.mock(VisitedSessionRepository.class);
-	}
-
 	@Bean
 	public StatisticsRepository statisticsRepository() {
 		return Mockito.mock(StatisticsRepository.class);